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/APScheduler/default.nix78
-rw-r--r--nixpkgs/pkgs/development/python-modules/Cython/default.nix75
-rw-r--r--nixpkgs/pkgs/development/python-modules/Fabric/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/Flask-PyMongo/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/FormEncode/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/GeoIP/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/GitPython/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/GitPython/hardcode-git-path.patch13
-rw-r--r--nixpkgs/pkgs/development/python-modules/HTSeq/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/IPy/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/JPype1/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/JayDeBeApi/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/Logbook/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/Mako/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/Nikola/default.nix112
-rw-r--r--nixpkgs/pkgs/development/python-modules/Pmw/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/Rtree/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/Theano/default.nix104
-rw-r--r--nixpkgs/pkgs/development/python-modules/WSME/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/Wand/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/XlsxWriter/default.nix36
-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.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/abodepy/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/absl-py/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/accupy/default.nix75
-rw-r--r--nixpkgs/pkgs/development/python-modules/accuweather/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/acebinf/default.nix28
-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.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/actdiag/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/adafruit-io/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/adafruit-nrfutil/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/adafruit-platformdetect/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/adafruit-pureio/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/adal/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/adax-local/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/adax/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/adb-enhanced/default.nix51
-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.nix81
-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.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/adjusttext/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/adlfs/default.nix49
-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.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/aenum/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/aeppl/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/aesara/default.nix87
-rw-r--r--nixpkgs/pkgs/development/python-modules/aesedb/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/afdko/default.nix106
-rw-r--r--nixpkgs/pkgs/development/python-modules/afdko/libxml2-cmake-find-package.patch22
-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.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/afsapi/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/agate-dbf/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/agate-excel/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/agate-sql/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/agate/default.nix73
-rw-r--r--nixpkgs/pkgs/development/python-modules/agent-py/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/aggdraw/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/ailment/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/aio-geojson-client/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/aio-geojson-generic-client/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/aio-geojson-geonetnz-quakes/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/aio-geojson-geonetnz-volcano/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/aio-geojson-nsw-rfs-incidents/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/aio-geojson-usgs-earthquakes/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/aio-georss-client/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/aio-georss-gdacs/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioairzone/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioaladdinconnect/default.nix38
-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.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioaseko/default.nix39
-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/aiobiketrax/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioblescan/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiobotocore/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiobroadlink/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiocache/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiocoap/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioconsole/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiocontextvars/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiocron/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiocurrencylayer/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiodiscover/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiodns/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioeafm/default.nix43
-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/aioemonitor/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioesphomeapi/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioextensions/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiofiles/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioflo/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioftp/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiogithubapi/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioguardian/default.nix72
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioharmony/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiohomekit/default.nix73
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiohttp-apispec/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiohttp-cors/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiohttp-jinja2/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiohttp-remotes/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiohttp-retry/default.nix47
-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.nix113
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiohttp_remotes/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiohue/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiohwenergy/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioimaplib/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioinflux/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioitertools/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiojobs/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiokafka/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiokef/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiolifx-connection/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiolifx-effects/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiolifx/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiolimiter/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiolip/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiolookin/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiolyric/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiomodernforms/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiomultiprocess/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiomusiccast/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiomysensors/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiomysql/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/aionanoleaf/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/aionotify/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/aionotion/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiooncue/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioopenexchangerates/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiopg/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioprocessing/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiopulse/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiopvapi/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiopvpc/default.nix69
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiopyarr/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiopylgtv/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioqsw/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiorecollect/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioredis/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioresponses/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioridwell/default.nix72
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiorpcx/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiortm/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiorun/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiosenseme/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiosenz/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioserial/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioshelly/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioshutil/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiosignal/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioskybell/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioslimproto/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiosmb/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiosmtpd/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiosmtplib/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiosqlite/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiosteamist/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiostream/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioswitcher/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiosyncthing/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiotractive/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiounifi/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiounittest/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiovlc/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiowatttime/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiowebostv/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiowinreg/default.nix36
-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-cloud/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/airtouch4pyapi/default.nix47
-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.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/alarmdecoder/default.nix51
-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/algebraic-data-types/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/aliyun-python-sdk-cdn/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/aliyun-python-sdk-config/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/aliyun-python-sdk-core/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/aliyun-python-sdk-dbfs/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/aliyun-python-sdk-iot/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/aliyun-python-sdk-kms/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/aliyun-python-sdk-sts/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/allpairspy/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/allure-behave/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/allure-pytest/default.nix80
-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.nix62
-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.nix74
-rw-r--r--nixpkgs/pkgs/development/python-modules/amazon-ion/default.nix54
-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.nix49
-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.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/amqplib/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/amqtt/default.nix75
-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.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/angr/default.nix111
-rw-r--r--nixpkgs/pkgs/development/python-modules/angrcli/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/angrop/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/aniso8601/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/annexremote/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/annoy/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/anonip/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/ansi/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/ansi2html/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/ansible-compat/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/ansible-doctor/default.nix77
-rw-r--r--nixpkgs/pkgs/development/python-modules/ansible-kernel/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/ansible-later/default.nix90
-rw-r--r--nixpkgs/pkgs/development/python-modules/ansible-lint/default.nix102
-rw-r--r--nixpkgs/pkgs/development/python-modules/ansible-runner/default.nix96
-rw-r--r--nixpkgs/pkgs/development/python-modules/ansible/core.nix82
-rw-r--r--nixpkgs/pkgs/development/python-modules/ansible/default.nix85
-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.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/antlr4-python3-runtime/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/anyascii/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/anybadge/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/anyconfig/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/anyio/default.nix92
-rw-r--r--nixpkgs/pkgs/development/python-modules/anytree/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/anytree/graphviz.patch13
-rw-r--r--nixpkgs/pkgs/development/python-modules/aocd/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/apache-airflow/default.nix249
-rw-r--r--nixpkgs/pkgs/development/python-modules/apache-airflow/package.json80
-rw-r--r--nixpkgs/pkgs/development/python-modules/apache-airflow/yarn.lock7740
-rw-r--r--nixpkgs/pkgs/development/python-modules/apache-airflow/yarn.nix8485
-rw-r--r--nixpkgs/pkgs/development/python-modules/apache-beam/default.nix169
-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/apispec/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/aplpy/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/appdirs/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/applicationinsights/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/appnope/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/apprise/default.nix75
-rw-r--r--nixpkgs/pkgs/development/python-modules/approvaltests/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/appthreat-vulnerability-db/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/apptools/default.nix74
-rw-r--r--nixpkgs/pkgs/development/python-modules/aprslib/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/apsw/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/apycula/default.nix51
-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.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/arc4/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/arcam-fmj/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/archinfo/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/archspec/default.nix36
-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.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/argh/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/argon2-cffi-bindings/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/argon2-cffi/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/argparse-addons/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/args/default.nix16
-rw-r--r--nixpkgs/pkgs/development/python-modules/aria2p/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/arpeggio/default.nix32
-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/arviz/default.nix105
-rw-r--r--nixpkgs/pkgs/development/python-modules/arxiv2bib/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/asana/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/ascii-magic/default.nix36
-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.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/asdf/default.nix71
-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.nix46
-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.nix45
-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.nix41
-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/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.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/astor/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/astral/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/astroid/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/astropy-extension-helpers/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/astropy-extension-helpers/permissions.patch20
-rw-r--r--nixpkgs/pkgs/development/python-modules/astropy-healpix/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/astropy-helpers/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/astropy/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/astroquery/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/asttokens/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/astunparse/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/async-dns/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/async-lru/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/async-upnp-client/default.nix79
-rw-r--r--nixpkgs/pkgs/development/python-modules/async_generator/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/async_stagger/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/async_timeout/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/asyncclick/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/asynccmd/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/asyncio-dgram/default.nix46
-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/asyncio_mqtt/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/asyncmy/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/asyncpg/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/asyncsleepiq/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/asyncssh/default.nix87
-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.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/asynctest/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/asyncwhois/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/asysocks/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/atenpdu/default.nix28
-rwxr-xr-xnixpkgs/pkgs/development/python-modules/atlassian-python-api/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/atom/default.nix50
-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.nix78
-rw-r--r--nixpkgs/pkgs/development/python-modules/atpublic/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/atsim_potentials/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/attrdict/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/attrs/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/attrs/tests.nix21
-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.nix42
-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/augeas/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/augmax/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/auroranoaa/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/aurorapy/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/autarco/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/auth0-python/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/authcaptureproxy/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/authheaders/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/authlib/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/authres/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/autobahn/default.nix115
-rw-r--r--nixpkgs/pkgs/development/python-modules/autograd/default.nix24
-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.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/automate-home/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/autopage/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/autopep8/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/av/default.nix147
-rw-r--r--nixpkgs/pkgs/development/python-modules/avea/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/avion/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/avro-python3/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/avro/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/avro3k/default.nix19
-rw-r--r--nixpkgs/pkgs/development/python-modules/awesome-slugify/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/awesome-slugify/slugify_filename_test.patch13
-rw-r--r--nixpkgs/pkgs/development/python-modules/awesomeversion/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/awkward/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/awkward0/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/aws-adfs/default.nix83
-rw-r--r--nixpkgs/pkgs/development/python-modules/aws-lambda-builders/default.nix73
-rw-r--r--nixpkgs/pkgs/development/python-modules/aws-sam-translator/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/aws-xray-sdk/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/awscrt/default.nix65
-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/axis/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-appconfiguration/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-applicationinsights/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-batch/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-common/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-containerregistry/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-core/default.nix89
-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.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-datalake-store/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-eventgrid/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-eventhub/default.nix44
-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.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-keyvault-administration/default.nix37
-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-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.nix40
-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.nix44
-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.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-containerregistry/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-containerservice/default.nix45
-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.nix40
-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.nix40
-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-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.nix40
-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.nix44
-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.nix38
-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.nix44
-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.nix37
-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.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-recoveryservicesbackup/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-redhatopenshift/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-redis/default.nix40
-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.nix39
-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.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-security/default.nix37
-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.nix44
-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.nix40
-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.nix50
-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.nix38
-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.nix45
-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.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-storage/default.nix36
-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.nix34
-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.nix78
-rw-r--r--nixpkgs/pkgs/development/python-modules/babel/default.nix25
-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.nix26
-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.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/backports-entry-points-selectable/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/backports-shutil-which/default.nix24
-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_abc/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/backports_csv/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/backports_functools_lru_cache/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/backports_shutil_get_terminal_size/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/backports_ssl_match_hostname/default.nix18
-rw-r--r--nixpkgs/pkgs/development/python-modules/backports_tempfile/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/backports_unittest-mock/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/backports_weakref/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/bacpypes/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/bagit/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/banal/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/bandit/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/bap/default.nix23
-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.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/base58check/default.nix36
-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.nix76
-rw-r--r--nixpkgs/pkgs/development/python-modules/bash_kernel/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/bashlex/default.nix40
-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.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/batinfo/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/bayesian-optimization/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/bayespy/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/bbox/default.nix30
-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/bcrypt/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/beaker/default.nix80
-rw-r--r--nixpkgs/pkgs/development/python-modules/beancount/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/beancount_docverif/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/beanstalkc/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/beartype/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/beautifulsoup4/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/beautifultable/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/bech32/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/bedup/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/behave/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/bellows/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/beniget/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/bespon/default.nix27
-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/bibtexparser/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/bidict/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/bids-validator/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/biliass/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/billiard/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/bimmer-connected/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/binaryornot/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/bincopy/default.nix26
-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/biopython/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/bip_utils/default.nix34
-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.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/bitcoin-utils-fork-minimal/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/bitcoinlib/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/bitcoinrpc/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/bite-parser/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/bitlist/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/bitmath/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/bitstring/default.nix32
-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.nix86
-rw-r--r--nixpkgs/pkgs/development/python-modules/bleach/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/bleak-retry-connector/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/bleak/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/blebox-uniapi/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.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/blinkpy/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/blinkstick/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/blis/default.nix39
-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.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/blocksat-cli/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/blspy/default.nix71
-rw-r--r--nixpkgs/pkgs/development/python-modules/blspy/dont_fetch_dependencies.patch64
-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.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/bluetooth-data-tools/default.nix46
-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/bokeh/default.nix100
-rw-r--r--nixpkgs/pkgs/development/python-modules/bokeh/hardcode-nodejs-npmjs-paths.patch15
-rw-r--r--nixpkgs/pkgs/development/python-modules/boltons/default.nix62
-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.nix46
-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.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/bootstrapped-pip/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/boschshcpy/default.nix45
-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.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/boto3/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/botocore/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/bottle/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/bottleneck/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/boxx/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/bpycv/bpycv-test.py76
-rw-r--r--nixpkgs/pkgs/development/python-modules/bpycv/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/bpython/default.nix73
-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.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/bravado-core/default.nix113
-rw-r--r--nixpkgs/pkgs/development/python-modules/bravia-tv/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/breathe/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/breezy/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/brelpy/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/broadlink/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/brother-ql/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/brother/default.nix45
-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.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/brunt/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/bsblan/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/bsddb3/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/bsdiff4/default.nix34
-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/default.nix24
-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/bugsnag/default.nix37
-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.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/buienradar/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/build/default.nix87
-rw-r--r--nixpkgs/pkgs/development/python-modules/buildbot/default.nix119
-rw-r--r--nixpkgs/pkgs/development/python-modules/buildbot/pkg.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/buildbot/plugins.nix118
-rw-r--r--nixpkgs/pkgs/development/python-modules/buildbot/skip_test_linux_distro.patch11
-rwxr-xr-xnixpkgs/pkgs/development/python-modules/buildbot/update.sh12
-rw-r--r--nixpkgs/pkgs/development/python-modules/buildbot/worker.nix66
-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.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/bunch/default.nix17
-rw-r--r--nixpkgs/pkgs/development/python-modules/bwapy/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/bx-python/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/bytecode/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/bz2file/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/cachecontrol/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/cached-property/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/cachelib/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/cachetools/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/cachey/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/cachy/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/cadquery/default.nix103
-rw-r--r--nixpkgs/pkgs/development/python-modules/cairocffi/default.nix78
-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.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/can/default.nix80
-rw-r--r--nixpkgs/pkgs/development/python-modules/canmatrix/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/canonicaljson/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/canopen/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/capstone/default.nix39
-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.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/cartopy/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/casa-formats-io/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/casbin/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/case/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/cassandra-driver/default.nix97
-rw-r--r--nixpkgs/pkgs/development/python-modules/castepxbin/default.nix37
-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.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/catboost/nix-support.patch181
-rw-r--r--nixpkgs/pkgs/development/python-modules/cattrs/default.nix109
-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.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/cchardet/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/cdcs/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/celery-redbeat/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/celery/default.nix107
-rw-r--r--nixpkgs/pkgs/development/python-modules/cement/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/censys/default.nix79
-rw-r--r--nixpkgs/pkgs/development/python-modules/cepa/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/cerberus/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/cert-chain-resolver/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/certauth/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/certbot-dns-cloudflare/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/certbot-dns-google/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/certbot-dns-rfc2136/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/certbot-dns-route53/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/certbot/default.nix78
-rw-r--r--nixpkgs/pkgs/development/python-modules/certifi/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/certipy/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/certomancer/default.nix71
-rw-r--r--nixpkgs/pkgs/development/python-modules/certvalidator/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/cffi/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/cffsubr/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/cfgv/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/cfn-flip/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/cfn-lint/default.nix95
-rw-r--r--nixpkgs/pkgs/development/python-modules/cfscrape/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/cftime/default.nix49
-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.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/chai/default.nix15
-rw-r--r--nixpkgs/pkgs/development/python-modules/chainer/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/chainmap/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/chalice/default.nix102
-rw-r--r--nixpkgs/pkgs/development/python-modules/chameleon/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/channels-redis/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/channels/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/characteristic/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/chardet/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/charset-normalizer/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/chart-studio/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/check-manifest/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/cheetah3/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/cheroot/default.nix95
-rw-r--r--nixpkgs/pkgs/development/python-modules/cherrypy/default.nix109
-rw-r--r--nixpkgs/pkgs/development/python-modules/chess/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/chevron/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/chex/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/chia-rs/Cargo.lock732
-rw-r--r--nixpkgs/pkgs/development/python-modules/chia-rs/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/chiabip158/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/chiapos/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/chiapos/dont_fetch_dependencies.patch41
-rw-r--r--nixpkgs/pkgs/development/python-modules/chiavdf/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/chiavdf/dont_fetch_dependencies.patch14
-rw-r--r--nixpkgs/pkgs/development/python-modules/chirpstack-api/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/chispa/default.nix27
-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.nix26
-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.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/cirq-aqt/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/cirq-core/default.nix99
-rw-r--r--nixpkgs/pkgs/development/python-modules/cirq-google/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/cirq-ionq/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/cirq-pasqal/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/cirq-rigetti/default.nix80
-rw-r--r--nixpkgs/pkgs/development/python-modules/cirq-web/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/cirq/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/ciscoconfparse/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/ciscomobilityexpress/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/ciso8601/default.nix34
-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.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/claripy/default.nix59
-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.nix86
-rw-r--r--nixpkgs/pkgs/development/python-modules/cleo/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/clevercsv/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/clf/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/cli-helpers/default.nix62
-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.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/click-log/default.nix20
-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-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.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/clickclick/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/clickgen/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/clickhouse-cityhash/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/clickhouse-cli/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/clickhouse-driver/default.nix72
-rw-r--r--nixpkgs/pkgs/development/python-modules/cliff/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/cliff/tests.nix33
-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.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/clint/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/clintermission/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/clize/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/clldutils/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/cloudflare/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/cloudpickle/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/cloudscraper/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/cloudsmith-api/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/cloudsplaining/default.nix69
-rw-r--r--nixpkgs/pkgs/development/python-modules/cloup/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/clustershell/default.nix107
-rw-r--r--nixpkgs/pkgs/development/python-modules/clvm-rs/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/clvm-tools-rs/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/clvm-tools/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/clvm/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/cma/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/cmarkgfm/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/cmd2/default.nix78
-rw-r--r--nixpkgs/pkgs/development/python-modules/cmdline/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/cmigemo/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/cmsis-pack-manager/Cargo.lock2047
-rw-r--r--nixpkgs/pkgs/development/python-modules/cmsis-pack-manager/default.nix77
-rw-r--r--nixpkgs/pkgs/development/python-modules/cmsis-svd/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/cntk/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/cnvkit/default.nix80
-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/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.nix66
-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/codespell/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/cogapp/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/coincurve/default.nix72
-rw-r--r--nixpkgs/pkgs/development/python-modules/colander/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/colanderalchemy/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/collections-extended/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/colorama/default.nix24
-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.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/coloredlogs/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/colorful/default.nix27
-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.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/colour/default.nix19
-rw-r--r--nixpkgs/pkgs/development/python-modules/cometblue-lite/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/commandparse/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/commentjson/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/commoncode/default.nix81
-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/compreffor/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/concurrent-log-handler/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/conda/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/configargparse/default.nix32
-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.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/configparser/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/configshell/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/confluent-kafka/default.nix23
-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.nix74
-rw-r--r--nixpkgs/pkgs/development/python-modules/cons/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/consonance/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/constantly/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/construct/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/consul/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/container-inspector/default.nix56
-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/contextvars/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/convertdate/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/cookiecutter/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/cookies/default.nix19
-rw-r--r--nixpkgs/pkgs/development/python-modules/coordinates/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/coqpit/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/coqui-trainer/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/coreapi/default.nix44
-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/coronavirus/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/corsair-scan/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/cot/default.nix87
-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.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/cram/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/cramjam/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/crashtest/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/crate/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/crayons/default.nix19
-rw-r--r--nixpkgs/pkgs/development/python-modules/crc16/default.nix18
-rw-r--r--nixpkgs/pkgs/development/python-modules/crc32c/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/crccheck/default.nix26
-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.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/cron-descriptor/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/croniter/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/cronsim/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/crossplane/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/crownstone-cloud/default.nix49
-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/cryptography/cryptography-py27-warning.patch14
-rw-r--r--nixpkgs/pkgs/development/python-modules/cryptography/default.nix99
-rw-r--r--nixpkgs/pkgs/development/python-modules/cryptography/vectors.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/cryptolyzer/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/cryptoparser/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/crytic-compile/default.nix27
-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-parser/default.nix30
-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.nix17
-rw-r--r--nixpkgs/pkgs/development/python-modules/cssselect2/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/cssutils/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/csvw/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/cucumber-tag-expressions/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/cufflinks/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/cupy/default.nix77
-rw-r--r--nixpkgs/pkgs/development/python-modules/curio/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/curtsies/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/curve25519-donna/default.nix18
-rw-r--r--nixpkgs/pkgs/development/python-modules/cvxopt/default.nix72
-rw-r--r--nixpkgs/pkgs/development/python-modules/cvxpy/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/cwcwidth/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/cx_freeze/default.nix33
-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.nix73
-rw-r--r--nixpkgs/pkgs/development/python-modules/cymem/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/cypari2/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/cypherpunkpay/default.nix97
-rw-r--r--nixpkgs/pkgs/development/python-modules/cysignals/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/cytoolz/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/d2to1/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/dacite/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/daemonize/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/daemonocle/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/dalle-mini/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/daphne/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/dasbus/default.nix21
-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.nix80
-rw-r--r--nixpkgs/pkgs/development/python-modules/dask-gateway-server/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/dask-gateway/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/dask-glm/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/dask-image/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/dask-jobqueue/default.nix57
-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.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/dask/default.nix135
-rw-r--r--nixpkgs/pkgs/development/python-modules/databases/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/databricks-cli/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/databricks-connect/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/dataclasses-json/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/dataclasses-serialization/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/dataclasses/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/datadiff/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/datadog/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/datafusion/Cargo.lock.patch78
-rw-r--r--nixpkgs/pkgs/development/python-modules/datafusion/default.nix90
-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/dataset/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/datasets/default.nix76
-rw-r--r--nixpkgs/pkgs/development/python-modules/datasette-template-sql/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/datasette/default.nix112
-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.nix69
-rw-r--r--nixpkgs/pkgs/development/python-modules/datauri/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/dateparser/default.nix67
-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.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/dawg-python/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/db-dtypes/default.nix47
-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/dbus-client-gen/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/dbus-next/default.nix42
-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.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/ddt/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/deal-solver/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/deal/default.nix100
-rw-r--r--nixpkgs/pkgs/development/python-modules/deap/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/debian-inspector/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/debian/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/debtcollector/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/debtcollector/tests.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/debts/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/debuglater/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/debugpy/default.nix102
-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-version.patch47
-rw-r--r--nixpkgs/pkgs/development/python-modules/decli/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/decopatch/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/decorator/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/deemix/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/deep-translator/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/deep_merge/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/deepdiff/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/deepdish/default.nix41
-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.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/defcon/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/deform/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/defusedxml/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/delegator-py/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/delorean/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/deltachat/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/deluge-client/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/demjson3/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/dendropy/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/denonavr/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/dependency-injector/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/deprecated/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/deprecation/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/derpconf/default.nix19
-rw-r--r--nixpkgs/pkgs/development/python-modules/descartes/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/desktop-notifier/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/detect-secrets/default.nix73
-rw-r--r--nixpkgs/pkgs/development/python-modules/devito/default.nix102
-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.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/devpi-common/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/devtools/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/diagrams/build_poetry.patch12
-rw-r--r--nixpkgs/pkgs/development/python-modules/diagrams/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/diagrams/remove-black-requirement.patch24
-rw-r--r--nixpkgs/pkgs/development/python-modules/diceware/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/dicom2nifti/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/dict2xml/default.nix29
-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/dictpath/default.nix36
-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.nix79
-rw-r--r--nixpkgs/pkgs/development/python-modules/diff-match-patch/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/digi-xbee/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/digitalocean/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/dill/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/dingz/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/diofant/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/dipy/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/directv/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/dirty-equals/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/discid/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/discogs-client/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/discordpy/default.nix62
-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/dissononce/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/distlib/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/distorm3/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/distrax/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/distributed/default.nix71
-rw-r--r--nixpkgs/pkgs/development/python-modules/distro/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/distutils-cfg/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/distutils_extra/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/dj-database-url/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/dj-email-url/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/dj-rest-auth/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/dj-search-url/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-allauth/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-anymail/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-appconf/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-auth-ldap/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-cache-url/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-cacheops/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-celery-beat/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-celery-email/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-cleanup/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-compat/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-compat/fix-tests.diff56
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-compressor/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-configurations/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-cors-headers/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-csp/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-debug-toolbar/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-discover-runner/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-dynamic-preferences/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-extensions/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-filter/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-formtools/default.nix44
-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.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-health-check/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-hijack-admin/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-hijack/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-ipware/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-jinja2/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-js-asset/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-logentry-admin/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-mailman3/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-maintenance-mode/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-model-utils/default.nix53
-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-oauth-toolkit/default.nix63
-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-pglocks/default.nix23
-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.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-prometheus/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-prometheus/drop-untestable-database-backends.patch38
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-q/default.nix82
-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.nix87
-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.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-reversion/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-rq/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-sesame/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-simple-captcha/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-sites/default.nix41
-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.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-tables2/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-taggit/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-tastypie/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-timezone-field/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-versatileimagefield/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-webpack-loader/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-widget-tweaks/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/django/3.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/django/4.nix117
-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_4_set_geos_gdal_lib.patch26
-rw-r--r--nixpkgs/pkgs/development/python-modules/django_classytags/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/django_colorful/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/django_contrib_comments/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/django_environ/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/django_modelcluster/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/django_nose/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/django_silk/default.nix74
-rw-r--r--nixpkgs/pkgs/development/python-modules/django_tagging/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/django_treebeard/default.nix30
-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.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/djangorestframework-guardian/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.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/djangorestframework/default.nix52
-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.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/dlinfo/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/dlx/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/dm-env/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/dm-haiku/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/dm-haiku/tests.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/dm-sonnet/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/dm-tree/cmake.patch141
-rw-r--r--nixpkgs/pkgs/development/python-modules/dm-tree/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/dmenu/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/dnachisel/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/dnslib/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/dnspython/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/dnspythonchia/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/doc8/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/docformatter/default.nix38
-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.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/dockerfile-parse/default.nix44
-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.nix24
-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.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/docstring-to-markdown/default.nix37
-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.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/docx2python/default.nix30
-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.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/dogtail/default.nix62
-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/dominate/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/doorbirdpy/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/dopy/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/dot2tex/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/dot2tex/path.patch104
-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/downloader-cli/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/dparse/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/dparse2/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/dpath/default.nix38
-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/dragonfly/default.nix77
-rw-r--r--nixpkgs/pkgs/development/python-modules/dremel3dpy/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/drf-jwt/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/drf-nested-routers/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/drf-spectacular-sidecar/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/drf-spectacular/default.nix77
-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.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/dropbox/default.nix83
-rw-r--r--nixpkgs/pkgs/development/python-modules/ds-store/default.nix31
-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.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/dtlssocket/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/ducc0/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/duckdb-engine/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/duckdb/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/duecredit/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/duet/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/dufte/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/dugong/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/dulwich/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/dunamai/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/dungeon-eos/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/duo-client/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/durus/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/dvc-data/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/dvc-objects/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/dvc-render/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/dvc-task/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/dvclive/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/dwdwfsapi/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/dyn/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/dynalite-devices/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/dynd/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/eagle100/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/easy-thumbnails/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/easydict/default.nix19
-rw-r--r--nixpkgs/pkgs/development/python-modules/easygui/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/easyprocess/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/easysnmp/default.nix55
-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/ecdsa/default.nix27
-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/default.nix18
-rw-r--r--nixpkgs/pkgs/development/python-modules/editables/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/editdistance-s/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/editdistance/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/editorconfig/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/edward/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/effect/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/eggdeps/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/einops/default.nix74
-rw-r--r--nixpkgs/pkgs/development/python-modules/eiswarnung/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/elastic-apm/default.nix90
-rw-r--r--nixpkgs/pkgs/development/python-modules/elasticsearch-dsl/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/elasticsearch/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/elegy/default.nix86
-rw-r--r--nixpkgs/pkgs/development/python-modules/elementpath/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/elevate/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/elgato/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/eliot/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/eliqonline/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/elkm1-lib/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/elmax-api/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/elmax/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/email-validator/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/emailthreads/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/embrace/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/emcee/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/emoji/default.nix34
-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.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/enamlx/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/enamlx/replace-unicode-with-str.patch274
-rw-r--r--nixpkgs/pkgs/development/python-modules/enhancements/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/enlighten/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/enocean/default.nix51
-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.nix41
-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.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/env-canada/default.nix66
-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.nix58
-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.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/epson-projector/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/eradicate/default.nix19
-rw-r--r--nixpkgs/pkgs/development/python-modules/escapism/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/esprima/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/et_xmlfile/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/etcd/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/etebase/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/etelemetry/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/eternalegypt/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/etesync/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/eth-abi/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/eth-account/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/eth-hash/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/eth-keyfile/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/eth-keys/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/eth-rlp/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/eth-typing/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/eth-utils/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/etils/default.nix89
-rw-r--r--nixpkgs/pkgs/development/python-modules/etuples/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/ev3dev2/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/evdev/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/eve/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/eventlet/default.nix100
-rw-r--r--nixpkgs/pkgs/development/python-modules/events/default.nix17
-rw-r--r--nixpkgs/pkgs/development/python-modules/evernote/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/evohome-async/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/evtx/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/ewmh/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/exceptiongroup/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/exchangelib/default.nix78
-rw-r--r--nixpkgs/pkgs/development/python-modules/exdown/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/execnet/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/executing/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/executor/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/exif/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/exifread/default.nix22
-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/expiringdict/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/explorerscript/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/exrex/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/extractcode/7z.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/extractcode/default.nix73
-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/eyed3/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/ezdxf/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/ezyrb/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/f90nml/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/faadelays/default.nix30
-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/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/face_recognition/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/face_recognition_models/default.nix23
-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.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/fake-useragent/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/faker/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/fakeredis/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/falcon/default.nix95
-rw-r--r--nixpkgs/pkgs/development/python-modules/faraday-agent-parameters-types/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/faraday-plugins/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/fastapi-mail/default.nix78
-rw-r--r--nixpkgs/pkgs/development/python-modules/fastapi/default.nix92
-rw-r--r--nixpkgs/pkgs/development/python-modules/fastavro/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/fastbencode/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/fastcache/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/fastcore/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/fastdiff/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/fastdtw/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/fastecdsa/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/fasteners/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/fastentrypoints/default.nix18
-rw-r--r--nixpkgs/pkgs/development/python-modules/fastimport/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/fastjsonschema/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/fastnumbers/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/fastpair/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/fastparquet/default.nix78
-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.nix18
-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/favicon/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/fb-re2/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/fe25519/default.nix48
-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.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/fenics/default.nix264
-rw-r--r--nixpkgs/pkgs/development/python-modules/ffcv/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/ffmpeg-progress-yield/default.nix33
-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/fiblary3-fork/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/fido2/default.nix41
-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.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/filelock/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/filemagic/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/filetype/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/filterpy/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/finalfusion/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/findimports/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/findpython/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/fingerprints/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/finitude/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/fints/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/fiona/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/fipy/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/fire/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/firetv/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/first/default.nix20
-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.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/fjaraskupan/default.nix41
-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.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/flake8-future-import/default.nix49
-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.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/flake8-length/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/flake8-polyfill/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/flake8/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/flaky/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/flametree/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/flammkuchen/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/flashtext/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-admin/default.nix92
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-api/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-appbuilder/default.nix100
-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.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-autoindex/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-babel/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-babelex/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-bcrypt/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-bootstrap/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-caching/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-common/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-compress/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-cors/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-elastic/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-gravatar/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-httpauth/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-jwt-extended/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-limiter/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-login/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-mail/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-marshmallow/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-migrate/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-mongoengine/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-openid/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-paginate/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-paranoid/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-principal/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-restful/default.nix61
-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-restplus/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-restx/default.nix81
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-reverse-proxy-fix/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-script/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-seasurf/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-security-too/default.nix112
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-session/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-silk/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-socketio/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-sockets/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-sqlalchemy/default.nix40
-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.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-versioned/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-wtf/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/flaskbabel/default.nix29
-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.nix70
-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/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.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/flit-core/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/flit-core/tests.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/flit/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/flower/default.nix61
-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.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/flufl/lock.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/flux-led/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/flynt/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/fn/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/fnvhash/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/folium/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/fontmake/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/fontmath/default.nix28
-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.nix98
-rw-r--r--nixpkgs/pkgs/development/python-modules/foobot-async/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/foolscap/default.nix49
-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.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/formbox/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/fortiosapi/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/fountains/default.nix37
-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.nix72
-rw-r--r--nixpkgs/pkgs/development/python-modules/fpyutils/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/fqdn/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/freebox-api/default.nix54
-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/frigidaire/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/frilouz/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/fritzconnection/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/fritzprofiles/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/frozendict/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/frozenlist/default.nix50
-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/fsspec/default.nix76
-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/func-timeout/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/funcparserlib/default.nix54
-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/functools32/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/functorch/default.nix103
-rw-r--r--nixpkgs/pkgs/development/python-modules/funcy/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/furl/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/furo/default.nix48
-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.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/fuzzyfinder/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/fuzzywuzzy/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/fx2/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/galois/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/gamble/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/gaphas/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/garages-amsterdam/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/garminconnect-aio/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/garminconnect/default.nix41
-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.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/gbinder-python/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/gbulb/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/gcal-sync/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/gcovr/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/gcsfs/default.nix72
-rw-r--r--nixpkgs/pkgs/development/python-modules/gdata/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/gdown/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/gdtoolkit/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/ge25519/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/geeknote/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/gehomesdk/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/gekitchen/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/gemfileparser/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/genanki/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/generic/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/geniushub-client/default.nix31
-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.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/gentools/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/genzshcomp/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/geoalchemy2/default.nix67
-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/geoip2/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/geojson-client/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/geojson/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/geomet/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/geometric/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/geopandas/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/geopy/default.nix58
-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.nix41
-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.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/getkey/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/getmac/default.nix47
-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.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/geventhttpclient/default.nix60
-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.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/gibberish-detector/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/gidgethub/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/gigalixir/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/gin-config/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/gios/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/gipc/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/gistyc/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/git-annex-adapter/default.nix53
-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.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/git-revise/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/git-sweep/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/gitdb/default.nix33
-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.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/glad/default.nix18
-rw-r--r--nixpkgs/pkgs/development/python-modules/glances-api/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/glasgow/default.nix77
-rw-r--r--nixpkgs/pkgs/development/python-modules/glcontext/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/glean-parser/default.nix74
-rw-r--r--nixpkgs/pkgs/development/python-modules/glean-sdk/default.nix73
-rw-r--r--nixpkgs/pkgs/development/python-modules/glfw/default.nix31
-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.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/glom/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/glymur/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/glyphslib/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/gmpy/default.nix24
-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/goobook/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/goocalendar/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/goodwe/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-api-core/default.nix80
-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.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-auth-oauthlib/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-auth/default.nix101
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-access-context-manager/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-appengine-logging/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-asset/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-audit-log/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-automl/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-bigquery-datatransfer/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-bigquery-logging/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-bigquery-storage/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-bigquery/default.nix106
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-bigtable/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-container/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-core/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-datacatalog/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-dataproc/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-datastore/default.nix62
-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.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-error-reporting/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-firestore/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-iam-logging/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-iam/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-iot/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-kms/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-language/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-logging/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-monitoring/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-org-policy/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-os-config/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-pubsub/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-redis/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-resource-manager/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-runtimeconfig/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-secret-manager/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-securitycenter/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-spanner/default.nix71
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-speech/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-storage/default.nix80
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-tasks/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-testutils/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-texttospeech/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-trace/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-translate/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-videointelligence/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-vision/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-websecurityscanner/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-crc32c/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-i18n-address/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-nest-sdm/default.nix62
-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-resumable-media/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/googleapis-common-protos/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/googlemaps/default.nix45
-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/govee-ble/default.nix55
-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/gphoto2/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/gpiozero/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/gplaycli/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/gprof2dot/default.nix41
-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/gpxpy/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/gpy/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/gpyopt/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/gql/default.nix77
-rw-r--r--nixpkgs/pkgs/development/python-modules/gradient-utils/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/gradient/default.nix81
-rw-r--r--nixpkgs/pkgs/development/python-modules/gradient_statsd/default.nix39
-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.nix75
-rw-r--r--nixpkgs/pkgs/development/python-modules/graphene-django/graphene-3_2_0.patch150
-rw-r--r--nixpkgs/pkgs/development/python-modules/graphene/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/graphite-web/default.nix73
-rw-r--r--nixpkgs/pkgs/development/python-modules/graphql-core/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/graphql-relay/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/graphql-server-core/default.nix50
-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.nix53
-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.nix34
-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.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/greenlet/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/gremlinpython/default.nix77
-rw-r--r--nixpkgs/pkgs/development/python-modules/grequests/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/gridnet/default.nix57
-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.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/grpc-google-iam-v1/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/grpcio-gcp/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/grpcio-status/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/grpcio-tools/default.nix29
-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.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/gruut/default.nix96
-rw-r--r--nixpkgs/pkgs/development/python-modules/gruut/language-pack.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/gsd/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/gspread/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/gssapi/default.nix79
-rw-r--r--nixpkgs/pkgs/development/python-modules/gst-python/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/gtfs-realtime-bindings/default.nix36
-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.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/gudhi/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/gudhi/remove_explicit_PYTHONPATH.patch174
-rw-r--r--nixpkgs/pkgs/development/python-modules/guessit/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/guestfs/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/gumath/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/gunicorn/default.nix55
-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.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/gviz-api/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/gvm-tools/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/gym/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/gyp/default.nix36
-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.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/h2/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/h3/default.nix69
-rw-r--r--nixpkgs/pkgs/development/python-modules/h5netcdf/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/h5py/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/ha-ffmpeg/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/ha-philipsjs/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/habanero/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/habitipy/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/hachoir/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/hacking/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/hahomematic/default.nix54
-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/hangups/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/hap-python/default.nix75
-rw-r--r--nixpkgs/pkgs/development/python-modules/hass-nabucasa/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/hatasmota/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/hatch-vcs/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/hatchling/default.nix78
-rw-r--r--nixpkgs/pkgs/development/python-modules/haversine/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/hawkauthlib/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/hcloud/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/hcs_utils/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/hdate/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/hdbscan/default.nix55
-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.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/heapdict/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/heatzypy/default.nix42
-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.nix31
-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.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/hexbytes/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/hexdump/default.nix32
-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.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/hglib/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/hglib/hgpath.patch24
-rw-r--r--nixpkgs/pkgs/development/python-modules/hickle/default.nix52
-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.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/hikvision/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/hiredis/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/hiro/default.nix19
-rw-r--r--nixpkgs/pkgs/development/python-modules/hiyapyco/default.nix44
-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/hlk-sw16/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/hmmlearn/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/hocr-tools/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/hole/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/holidays/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/holoviews/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/home-assistant-bluetooth/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/homeassistant-pyozw/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/homeconnect/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/homematicip/default.nix92
-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/howdoi/default.nix78
-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/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.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/html2text/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/html5-parser/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/html5lib/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/htmllaundry/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/htmlmin/default.nix20
-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.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/http-sfv/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/httpagentparser/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/httpauth/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/httpbin/default.nix77
-rw-r--r--nixpkgs/pkgs/development/python-modules/httpcore/default.nix76
-rw-r--r--nixpkgs/pkgs/development/python-modules/httpie-ntlm/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/httpie/default.nix105
-rw-r--r--nixpkgs/pkgs/development/python-modules/httplib2/default.nix79
-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.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/httpx-ntlm/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/httpx-socks/default.nix72
-rw-r--r--nixpkgs/pkgs/development/python-modules/httpx/default.nix116
-rw-r--r--nixpkgs/pkgs/development/python-modules/huawei-lte-api/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/huey/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/hug/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/huggingface-hub/default.nix55
-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.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/humblewx/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/hupper/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/huum/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/hvac/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/hvplot/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/hwi/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/hy/default.nix77
-rw-r--r--nixpkgs/pkgs/development/python-modules/hydra-check/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/hydra/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/hydrawiser/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/hypchat/default.nix14
-rw-r--r--nixpkgs/pkgs/development/python-modules/hypercorn/default.nix59
-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/hypothesis-auto/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/hypothesis/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/hypothesmith/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/hypothesmith/remove-black.patch88
-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/iapws/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/iaqualink/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/ibis-framework/default.nix170
-rw-r--r--nixpkgs/pkgs/development/python-modules/ibis/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/ibm-cloud-sdk-core/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/ibm-watson/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/icalendar/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/icecream/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/icmplib/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/icnsutil/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/icontract/default.nix78
-rw-r--r--nixpkgs/pkgs/development/python-modules/ics/default.nix60
-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.nix23
-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.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/ihatemoney/default.nix129
-rw-r--r--nixpkgs/pkgs/development/python-modules/ijson/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/ilua/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/image-go-nord/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/image-match/default.nix35
-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/imageio-ffmpeg/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/imageio-ffmpeg/ffmpeg-path.patch39
-rw-r--r--nixpkgs/pkgs/development/python-modules/imageio/default.nix70
-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.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/imap-tools/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/imapclient/default.nix30
-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.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/imgaug/default.nix81
-rw-r--r--nixpkgs/pkgs/development/python-modules/imgsize/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/iminuit/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/immutabledict/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/immutables/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/impacket/default.nix52
-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-place/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/incomfort-client/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/incremental/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/infinity/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/inflect/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/inflection/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/influxdb-client/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/influxdb/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/inform/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/iniconfig/default.nix23
-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.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/inkbird-ble/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/inkex/default.nix47
-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.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/insegel/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/installer/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/insteon-frontend-home-assistant/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/intake-parquet/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/intake/default.nix124
-rw-r--r--nixpkgs/pkgs/development/python-modules/intbitset/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/intelhex/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/intellifire4py/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/intensity-normalization/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/internetarchive/default.nix57
-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/intreehooks/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/invocations/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/invoke/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/iocapture/default.nix34
-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/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/ipdb/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/ipdbplugin/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/ipfshttpclient/default.nix92
-rw-r--r--nixpkgs/pkgs/development/python-modules/iptools/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/ipwhl/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/ipydatawidgets/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/ipykernel/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/ipykernel/tests.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/ipympl/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/ipyparallel/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/ipython-sql/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/ipython/default.nix102
-rw-r--r--nixpkgs/pkgs/development/python-modules/ipython_genutils/default.nix29
-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.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/irc/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/ircrobots/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/ircstates/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/irctokens/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/isbnlib/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/islpy/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/ismartgate/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/iso-639/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/iso3166/default.nix36
-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.nix79
-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.nix36
-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.nix43
-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/j2cli/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/jaconv/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/jaeger-client/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/janus/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/jaraco-context/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/jaraco-test/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/jaraco_classes/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/jaraco_collections/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/jaraco_functools/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/jaraco_itertools/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/jaraco_logging/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/jaraco_stream/default.nix17
-rw-r--r--nixpkgs/pkgs/development/python-modules/jaraco_text/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/jarowinkler/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/javaobj-py3/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/javaproperties/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/jax/cache-fix.patch12
-rw-r--r--nixpkgs/pkgs/development/python-modules/jax/default.nix113
-rw-r--r--nixpkgs/pkgs/development/python-modules/jaxlib/bin.nix147
-rw-r--r--nixpkgs/pkgs/development/python-modules/jaxlib/default.nix326
-rwxr-xr-xnixpkgs/pkgs/development/python-modules/jaxlib/prefetch.sh7
-rw-r--r--nixpkgs/pkgs/development/python-modules/jc/default.nix38
-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.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/jedi/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/jeepney/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/jellyfin-apiclient-python/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/jellyfish/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/jenkins-job-builder/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/jenkinsapi/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/jieba/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/jinja2-git/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/jinja2/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/jinja2_pluralize/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/jinja2_time/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/jira/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/jmespath/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/jmp/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/joblib/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/johnnycanencrypt/Cargo.lock.patch1194
-rw-r--r--nixpkgs/pkgs/development/python-modules/johnnycanencrypt/default.nix100
-rw-r--r--nixpkgs/pkgs/development/python-modules/josepy/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/jproperties/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/jpylyzer/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/jq/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/jq/jq-py-setup.patch144
-rw-r--r--nixpkgs/pkgs/development/python-modules/js2py/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/jsbeautifier/default.nix45
-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.nix47
-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.nix76
-rw-r--r--nixpkgs/pkgs/development/python-modules/json-stream/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/json-tricks/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/json5/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.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/jsonmerge/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/jsonpatch/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/jsonpath-ng/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/jsonpath/default.nix21
-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.nix26
-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/jsonschema/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/jsonstreams/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/jug/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/junit-xml/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/junitparser/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/junos-eznc/default.nix85
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyter-book/default.nix80
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyter-c-kernel/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyter-cache/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyter-client/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyter-lsp/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyter-packaging/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyter-repo2docker/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyter-server-mathjax/default.nix43
-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/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyter_console/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyter_core/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyter_core/tests_respect_pythonpath.patch20
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyter_server/default.nix97
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyterhub-ldapauthenticator/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyterhub-systemdspawner/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyterhub-tmpauthenticator/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyterhub/default.nix165
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyterlab-git/default.nix76
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyterlab-lsp/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyterlab-pygments/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyterlab-widgets/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyterlab/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyterlab_launcher/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyterlab_server/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupytext/default.nix83
-rw-r--r--nixpkgs/pkgs/development/python-modules/justbackoff/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/justbases/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/justbytes/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/justnimbus/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/jwcrypto/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/jxmlease/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/k5test/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/k5test/fix-paths.patch122
-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.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/kaitaistruct/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/kajiki/default.nix32
-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.nix93
-rw-r--r--nixpkgs/pkgs/development/python-modules/kaptan/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/karton-asciimagic/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/karton-autoit-ripper/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/karton-classifier/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/karton-config-extractor/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/karton-core/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/karton-dashboard/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/karton-mwdb-reporter/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/karton-yaramatcher/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/kazoo/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/kbcstorage/default.nix69
-rw-r--r--nixpkgs/pkgs/development/python-modules/kconfiglib/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/keep/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/keepalive/default.nix25
-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/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.nix37
-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.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/keyrings-alt/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/keyrings-cryptfile/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/keyrings-cryptfile/fix-testsuite.patch14
-rw-r--r--nixpkgs/pkgs/development/python-modules/keyrings-google-artifactregistry-auth/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/keystone-engine/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/keystoneauth1/default.nix77
-rw-r--r--nixpkgs/pkgs/development/python-modules/keyutils/default.nix28
-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.nix16
-rw-r--r--nixpkgs/pkgs/development/python-modules/kivy-garden/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/kivy/default.nix90
-rw-r--r--nixpkgs/pkgs/development/python-modules/kiwisolver/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/klaus/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/klein/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/kmapper/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/kml2geojson/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/knack/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/kombu/default.nix54
-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/krakenex/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/kubernetes/default.nix73
-rw-r--r--nixpkgs/pkgs/development/python-modules/labelbox/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/labgrid/0001-serialdriver-remove-pyserial-version-check.patch33
-rw-r--r--nixpkgs/pkgs/development/python-modules/labgrid/default.nix77
-rw-r--r--nixpkgs/pkgs/development/python-modules/labmath/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/langcodes/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/langdetect/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/language-data/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/lark/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/latexcodec/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/launchpadlib/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/laundrify-aio/default.nix41
-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.nix13
-rw-r--r--nixpkgs/pkgs/development/python-modules/lazr/delegates.nix15
-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.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/lc7001/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/ldap/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/ldap3/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/ldapdomaindump/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/ldappool/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/ldaptor/default.nix51
-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/ledger_agent/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/ledgerblue/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/ledgerwallet/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/lektor/default.nix83
-rw-r--r--nixpkgs/pkgs/development/python-modules/leveldb/default.nix19
-rw-r--r--nixpkgs/pkgs/development/python-modules/levenshtein/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/lexid/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/libagent/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/libais/default.nix25
-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/libcloud/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/libcst/default.nix90
-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/libgpuarray/default.nix85
-rw-r--r--nixpkgs/pkgs/development/python-modules/libkeepass/default.nix24
-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.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/libpurecool/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/libpyfoscam/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/libpyvivotek/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/librosa/default.nix41
-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/libsoundtouch/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/libthumbor/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/libtmux/default.nix45
-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/license-expression/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/life360/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/lightgbm/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/lightning/default.nix30
-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/limiter/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/limitlessled/default.nix18
-rw-r--r--nixpkgs/pkgs/development/python-modules/limits/default.nix81
-rw-r--r--nixpkgs/pkgs/development/python-modules/limnoria/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/line_profiler/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/linecache2/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/lingua/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/linkify-it-py/default.nix34
-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/liquidctl/default.nix69
-rw-r--r--nixpkgs/pkgs/development/python-modules/littleutils/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/livelossplot/default.nix40
-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/llfuse/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/llvmlite/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/lmdb/default.nix30
-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.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/localimport/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/localzone/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/locationsharinglib/default.nix60
-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/logfury/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/logi-circle/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/logical-unification/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/logilab/common.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/logilab/constraint.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/logilab_astng/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/logster/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/loguru/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/logutils/default.nix21
-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/losant-rest/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/lrcalc-python/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/lru-dict/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/lsassy/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/luddite/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/ludios_wpull/default.nix41
-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/lupa/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/lupupy/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.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/lxml/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/lyricwikia/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/lz4/default.nix69
-rw-r--r--nixpkgs/pkgs/development/python-modules/lzstring/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/m2crypto/default.nix47
-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.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/mac_alias/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/macfsevents/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/macropy/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/maestral/default.nix97
-rw-r--r--nixpkgs/pkgs/development/python-modules/magic-wormhole-mailbox-server/default.nix46
-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.nix82
-rw-r--r--nixpkgs/pkgs/development/python-modules/magic/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/magicgui/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/mahotas/default.nix71
-rw-r--r--nixpkgs/pkgs/development/python-modules/mail-parser/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/mailcap-fix/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/mailchecker/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/mailchimp/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/mailmanclient/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/mailsuite/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/makefun/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/malduck/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/managesieve/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/manhole/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/manimpango/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/manticore/default.nix136
-rw-r--r--nixpkgs/pkgs/development/python-modules/manuel/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/mapbox-earcut/default.nix41
-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.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/markdown-include/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/markdown-it-py/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/markdown-macros/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/markdown/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/markdown2/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/markdownsuperscript/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/markerlib/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/markups/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/markupsafe/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/marshmallow-dataclass/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/marshmallow-enum/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/marshmallow-oneofschema/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/marshmallow-polyfield/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/marshmallow-sqlalchemy/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/marshmallow/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/mask-rcnn/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/mastodon-py/default.nix61
-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/fix_poppler.patch14
-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/mathlibtools/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/matlink-gpapi/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/matplotlib-inline/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/matplotlib/default.nix127
-rw-r--r--nixpkgs/pkgs/development/python-modules/matrix-api-async/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/matrix-client/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/matrix-common/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/matrix-nio/default.nix99
-rw-r--r--nixpkgs/pkgs/development/python-modules/mattermostdriver/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/mautrix/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/maxcube-api/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/maxminddb/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/maya/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/mayavi/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/mbddns/default.nix37
-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/md-toc/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/md2gemini/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/mdformat/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/mdit-py-plugins/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/mdp/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/mdurl/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/mdutils/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/mdx-truly-sane-lists/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/measurement/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/meater-python/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/mecab-python3/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/mechanicalsoup/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/mechanize/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/mediafile/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/mediapy/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/meilisearch/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/meinheld/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/meld3/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/memory-allocator/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/memory_profiler/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/mercantile/default.nix28
-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.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/meross-iot/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/mesa/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/meshio/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/meshlabxml/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/meshtastic/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/mesonpep517/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/messagebird/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/metakernel/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/metar/default.nix46
-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.nix76
-rw-r--r--nixpkgs/pkgs/development/python-modules/mezzanine/default.nix88
-rw-r--r--nixpkgs/pkgs/development/python-modules/micawber/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/micloud/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/midiutil/default.nix18
-rw-r--r--nixpkgs/pkgs/development/python-modules/mido/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/mido/libportmidi-cdll.patch19
-rw-r--r--nixpkgs/pkgs/development/python-modules/migen/default.nix32
-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.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/millheater/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/minexr/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/miniaudio/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/minidb/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/minidump/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/minikanren/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/minikerberos/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/minimock/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/minio/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/miniupnpc/default.nix19
-rw-r--r--nixpkgs/pkgs/development/python-modules/misaka/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/mistletoe/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/mistune/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/mitmproxy/default.nix126
-rw-r--r--nixpkgs/pkgs/development/python-modules/mitogen/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/mixpanel/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/mizani/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/mkdocs-autorefs/default.nix53
-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-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-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.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/mkdocs-material/mkdocs-material-extensions.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/mkdocs-minify/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/mkdocs-redirects/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/mkdocs/default.nix81
-rw-r--r--nixpkgs/pkgs/development/python-modules/mkdocstrings-python/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/mkdocstrings/default.nix66
-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/mlflow/default.nix87
-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/mmh3/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/mmpython/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/mne-python/default.nix59
-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.nix55
-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/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/mocket/default.nix80
-rw-r--r--nixpkgs/pkgs/development/python-modules/mockito/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/mockupdb/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/modeled/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/moderngl/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/moderngl_window/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/modestmaps/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/mohawk/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/moku/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/monai/default.nix64
-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/monkeyhex/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/monotonic/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/monty/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/moonraker-api/default.nix49
-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/moretools/default.nix30
-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.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/motioneye-client/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/moto/default.nix141
-rw-r--r--nixpkgs/pkgs/development/python-modules/motor/default.nix36
-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.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/mox/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/mox3/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/mpd2/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/mpi4py/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/mpi4py/tests.patch13
-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/mplleaflet/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/mpmath/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/mpv/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/mpyq/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/mrkd/default.nix30
-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.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/msgpack-numpy/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/msgpack/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/msgraph-core/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/msldap/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/msoffcrypto-tool/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/msrest/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/msrestazure/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/mss/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/mt-940/default.nix31
-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/mulpyplexer/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/multi_key_dict/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/multidict/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/multimethod/default.nix33
-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.nix27
-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/munkres/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/murmurhash/default.nix37
-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.nix70
-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/mutmut/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/mwclient/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/mwdblib/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/mwoauth/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/mwparserfromhell/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/mxnet/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/myfitnesspal/default.nix69
-rw-r--r--nixpkgs/pkgs/development/python-modules/mygpoclient/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/myhome/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/myjwt/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/mypy-boto3-builder/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/mypy-boto3-s3/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/mypy-protobuf/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/mypy/default.nix74
-rw-r--r--nixpkgs/pkgs/development/python-modules/mypy/extensions.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/mysql-connector/0001-Revert-Fix-MacOS-wheels-platform-tag.patch36
-rw-r--r--nixpkgs/pkgs/development/python-modules/mysql-connector/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/mysqlclient/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/myst-docutils/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/myst-nb/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/myst-parser/default.nix78
-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.nix25
-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/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.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/napalm/hp-procurve.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/napari-console/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/napari-npe2/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/napari-plugin-engine/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/napari-svg/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/napari/default.nix84
-rw-r--r--nixpkgs/pkgs/development/python-modules/nats-py/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/nats-python/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/natsort/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/naturalsort/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/nbclassic/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/nbclient/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/nbconflux/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/nbconvert/default.nix95
-rw-r--r--nixpkgs/pkgs/development/python-modules/nbconvert/templates.patch12
-rw-r--r--nixpkgs/pkgs/development/python-modules/nbdime/default.nix87
-rw-r--r--nixpkgs/pkgs/development/python-modules/nbformat/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/nbmerge/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/nbsmoke/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/nbsphinx/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/nbval/default.nix69
-rw-r--r--nixpkgs/pkgs/development/python-modules/nbxmpp/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/ncclient/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/nclib/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/ndg-httpsclient/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/ndjson/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/ndms2-client/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/ndspy/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/ndtypes/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/nengo/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/neo/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/neo4j/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/nessclient/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/nest-asyncio/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/nested-lookup/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/nestedtext/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/netaddr/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/netcdf4/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/netdata/default.nix52
-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.nix45
-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.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/netutils/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/networkx/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/neuronpy/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/nevow/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/newversion/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/nexia/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/nextcloudmonitor/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/nextcord/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/nextcord/paths.patch71
-rw-r--r--nixpkgs/pkgs/development/python-modules/nextdns/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/niapy/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/nibabel/default.nix41
-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/nilearn/default.nix34
-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/nipy/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/nipype/default.nix115
-rw-r--r--nixpkgs/pkgs/development/python-modules/nipype/neurdflib.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/nitime/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/nitransforms/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/nix-kernel/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/nix-prefetch-github/default.nix36
-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.nix31
-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.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/node-semver/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/nodeenv/default.nix55
-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.nix43
-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.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/nose2/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/nose_progressive/default.nix34
-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.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/notebook/default.nix91
-rw-r--r--nixpkgs/pkgs/development/python-modules/notedown/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/notifications-python-client/default.nix58
-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.nix78
-rw-r--r--nixpkgs/pkgs/development/python-modules/notify-py/linux-paths.patch54
-rw-r--r--nixpkgs/pkgs/development/python-modules/notify2/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/notifymuch/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/notmuch/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/notmuch2/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/notus-scanner/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/nplusone/default.nix83
-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/ntc-templates/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/ntlm-auth/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/ntplib/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/nuitka/default.nix53
-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.nix91
-rw-r--r--nixpkgs/pkgs/development/python-modules/numcodecs/default.nix57
-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.nix115
-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.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/nunavut/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/nutils/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/nvchecker/default.nix81
-rw-r--r--nixpkgs/pkgs/development/python-modules/nwdiag/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/nxt-python/default.nix30
-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.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/oauthlib/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/obfsproxy/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/objax/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/objgraph/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/objgraph/hardcode-graphviz-path.patch61
-rw-r--r--nixpkgs/pkgs/development/python-modules/obspy/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/oci/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/ocifs/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/ocrmypdf/default.nix101
-rw-r--r--nixpkgs/pkgs/development/python-modules/ocrmypdf/paths.patch127
-rw-r--r--nixpkgs/pkgs/development/python-modules/od/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/odfpy/default.nix30
-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/olefile/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/oletools/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/omegaconf/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/omnikinverter/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/omnilogic/default.nix41
-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.nix81
-rw-r--r--nixpkgs/pkgs/development/python-modules/onvif-zeep-async/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/oocsi/default.nix32
-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/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/openant/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/openapi-core/default.nix96
-rw-r--r--nixpkgs/pkgs/development/python-modules/openapi-schema-validator/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/openapi-spec-validator/default.nix77
-rw-r--r--nixpkgs/pkgs/development/python-modules/openbabel-bindings/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/openerz-api/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/openevsewifi/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/openhomedevice/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/openidc-client/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/openpyxl/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/openrazer/common.nix17
-rw-r--r--nixpkgs/pkgs/development/python-modules/openrazer/daemon.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/openrazer/pylib.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/openrouteservice/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/opensensemap-api/default.nix43
-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.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/openstep-plist/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/opentimestamps/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/opentracing/default.nix39
-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/opsdroid_get_image_size/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/opt-einsum/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/optax/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/optax/tests.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/optuna/default.nix93
-rw-r--r--nixpkgs/pkgs/development/python-modules/opuslib/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/opuslib/opuslib-paths.patch26
-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.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/orm/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/ormar/default.nix92
-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.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/osc-lib/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/osc/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/oscpy/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/oscrypto/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/oset/default.nix19
-rw-r--r--nixpkgs/pkgs/development/python-modules/oslo-concurrency/default.nix72
-rw-r--r--nixpkgs/pkgs/development/python-modules/oslo-config/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/oslo-config/tests.nix41
-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.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/oslo-log/default.nix62
-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.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/oslotest/tests.nix31
-rwxr-xr-xnixpkgs/pkgs/development/python-modules/osmnx/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/osmpythontools/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/ospd/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/osqp/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/oss2/default.nix111
-rw-r--r--nixpkgs/pkgs/development/python-modules/ossfs/default.nix41
-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/ovh/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/ovoenergy/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/owslib/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/oyaml/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/p1monitor/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/pa-ringbuffer/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/packageurl-python/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/packaging/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/packbits/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/packet-python/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/pad4pi/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/pafy/default.nix23
-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.nix24
-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.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/pandas/default.nix138
-rw-r--r--nixpkgs/pkgs/development/python-modules/pandoc-attributes/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/pandoc-xnos/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/pandocfilters/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/panel/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/panflute/default.nix36
-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/param/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/parameter-expansion-patched/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/parameterized/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/parameterizedtestcase/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/paramiko/default.nix82
-rw-r--r--nixpkgs/pkgs/development/python-modules/paramz/default.nix26
-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.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/parsedatetime/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/parsedmarc/default.nix99
-rw-r--r--nixpkgs/pkgs/development/python-modules/parsel/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/parsimonious/default.nix46
-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.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/partd/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/particle/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/parts/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/parver/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/passlib/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/paste/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/pastedeploy/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/pastel/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/pastescript/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/patator/default.nix47
-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.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/pathable/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/pathlib/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/pathlib2/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/pathos/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/pathspec/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/pathtools/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/pathvalidate/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/pathy/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/patiencediff/default.nix18
-rw-r--r--nixpkgs/pkgs/development/python-modules/patool/default.nix56
-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.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/paypalrestsdk/default.nix20
-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.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/pc-ble-driver-py/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/pcapy-ng/default.nix59
-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/pdf2image/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/pdfkit/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/pdfminer-six/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/pdfposter/default.nix20
-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-pep517/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/pdoc3/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/pdunehd/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/peaqevcore/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/pebble/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/pecan/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/peco/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/peewee/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/pefile/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/pelican/default.nix114
-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.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/pep517/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/pep8-naming/default.nix37
-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.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/periodictable/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/persim/default.nix73
-rw-r--r--nixpkgs/pkgs/development/python-modules/persistent/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/persisting-theory/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/pescea/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/pex/default.nix37
-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/pg8000/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/pgcli/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/pglast/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/pgpdump/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/pgpy/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/pgsanity/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/pgspecial/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/phe/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/phik/default.nix79
-rw-r--r--nixpkgs/pkgs/development/python-modules/phone-modem/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/phonemizer/backend-paths.patch18
-rw-r--r--nixpkgs/pkgs/development/python-modules/phonemizer/default.nix74
-rw-r--r--nixpkgs/pkgs/development/python-modules/phonemizer/remove-intertwined-festival-test.patch103
-rw-r--r--nixpkgs/pkgs/development/python-modules/phonenumbers/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/phonopy/default.nix46
-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/piccata/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/pick/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/pickleshare/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/picos/default.nix41
-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.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/pikepdf/default.nix99
-rw-r--r--nixpkgs/pkgs/development/python-modules/pikepdf/paths.patch44
-rw-r--r--nixpkgs/pkgs/development/python-modules/pilkit/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/pillow-simd/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/pillow/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/pillow/generic.nix79
-rw-r--r--nixpkgs/pkgs/development/python-modules/pillowfight/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/pims/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/pinboard/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/pint-pandas/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/pint/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/pip-api/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/pip-requirements-parser/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/pip-tools/default.nix71
-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.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/pipdate/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/pipdeptree/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/pipenv-poetry-migrate/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/pipx/default.nix83
-rw-r--r--nixpkgs/pkgs/development/python-modules/pivy/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/pixcat/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/pixelmatch/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/pkce/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/pkgconfig/default.nix50
-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/pkuseg/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/pkutils/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/plac/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/plaid-python/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/plantuml-markdown/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/plantuml/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/plaster-pastedeploy/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/plaster/default.nix19
-rw-r--r--nixpkgs/pkgs/development/python-modules/platformdirs/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/playsound/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/pleroma-bot/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/plexapi/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/plexauth/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/plexwebsocket/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/plone-testing/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/plotly/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/plotnine/default.nix76
-rw-r--r--nixpkgs/pkgs/development/python-modules/pluggy/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/pluginbase/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/plugincode/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/plugnplay/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/plugwise/default.nix69
-rw-r--r--nixpkgs/pkgs/development/python-modules/plum-py/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/plumbum/default.nix69
-rw-r--r--nixpkgs/pkgs/development/python-modules/ply/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/plyer/default.nix64
-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/pmsensor/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/pocket/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/podcastparser/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/podcats/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/poetry-core/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/poetry-dynamic-versioning/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/poetry-semver/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/poetry/default.nix143
-rw-r--r--nixpkgs/pkgs/development/python-modules/poetry2conda/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/polarizationsolver/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/polars/default.nix87
-rw-r--r--nixpkgs/pkgs/development/python-modules/polib/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/policy-sentry/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/policyuniverse/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/polyline/default.nix31
-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.nix72
-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.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/pook/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/poolsense/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/poppler-qt5/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/portalocker/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/portend/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/portpicker/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/posix_ipc/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/pot/default.nix126
-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.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/pplpy/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/pprintpp/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/pproxy/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/ppscore/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/pq/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/prance/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/praw/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/prawcore/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/prayer-times-calculator/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/pre-commit-hooks/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/precis-i18n/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/prefixed/default.nix26
-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.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/preprocess-cancellation/pep-621.patch20
-rw-r--r--nixpkgs/pkgs/development/python-modules/preshed/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/pretend/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/prettytable/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/primecountpy/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/primer3/default.nix35
-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/privacyidea-ldap-proxy/default.nix32
-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/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.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/progressbar33/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/prometheus-client/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/prometheus-flask-exporter/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/promise/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/prompt-toolkit/1.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/prompt-toolkit/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/property-manager/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/protego/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/proto-plus/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/protobuf/default.nix64
-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/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.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/proxy-py/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/proxy_tools/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/psautohint/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/pscript/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/psd-tools/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/psrpcore/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/psutil/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/psycopg/default.nix137
-rw-r--r--nixpkgs/pkgs/development/python-modules/psycopg/libpq.patch22
-rw-r--r--nixpkgs/pkgs/development/python-modules/psycopg2/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/psycopg2cffi/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/psygnal/default.nix35
-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.nix38
-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.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/pubnub/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/pubnubsub-handler/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/pudb/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/pulp/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/pulsectl/default.nix38
-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.nix80
-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-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.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/purepng/default.nix48
-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/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/pushover-complete/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/pushover/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/pvlib/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/pvo/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/pweave/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/pwntools/default.nix91
-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-canary/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/py-cid/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/py-cpuinfo/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/py-deprecate/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/py-desmume/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/py-dmidecode/default.nix25
-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.nix41
-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.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/py-multicodec/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/py-multihash/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/py-nextbusnext/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/py-nightscout/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/py-radix/default.nix31
-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-synologydsm-api/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/py-tes/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/py-tree-sitter/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/py-ubjson/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/py-vapid/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/py-zabbix/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/py/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/py17track/default.nix67
-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.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/py3rijndael/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/py3status/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/py4j/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyGithub/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/pySmartDL/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyTelegramBotAPI/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/py_scrypt/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/py_stringmatching/default.nix28
-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.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyahocorasick/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyairnow/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyairvisual/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyalgotrade/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyalmond/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyamg/default.nix49
-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.nix147
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyasn/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyasn1-modules/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyasn1/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyatag/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyathena/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyatmo/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyatome/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyatspi/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyatv/default.nix89
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyaudio/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyaussiebb/default.nix55
-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.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/pybase64/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/pybids/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/pybigwig/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/pybind11/default.nix79
-rw-r--r--nixpkgs/pkgs/development/python-modules/pybindgen/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyblackbird/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyblake2/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyblock/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/pybluez/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/pybotvac/default.nix41
-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.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycangjie/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycapnp/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycaption/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycares/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycarwings2/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycategories/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycategories/infix.nix23
-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.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycfdns/default.nix38
-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/pychef/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/pychm/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/pychromecast/default.nix45
-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.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycmarkgfm/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycocotools/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycodestyle/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycognito/default.nix58
-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.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycontracts/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycontrol4/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycoolmasternet-async/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycosat/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycountry/default.nix31
-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.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyctr/default.nix24
-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.nix83
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycxx/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydaikin/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydal/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydanfossair/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydantic/default.nix105
-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.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydata-sphinx-theme/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydbus/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydeck/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydeconz/default.nix49
-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.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydes/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydevccu/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydevd/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydexcom/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydicom/default.nix79
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydigiham/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydispatcher/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydmd/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydocstyle/default.nix41
-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/pydrive2/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydroid-ipcam/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydsdl/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydub/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyduke-energy/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydy/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydyf/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyeapi/default.nix70
-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/pyeconet/default.nix39
-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.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyefergy/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyeight/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyelftools/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyemby/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyemd/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyenchant/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyenvisalink/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyephember/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyepsg/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyerfa/default.nix50
-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/pyext/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyezviz/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyface/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyfaidx/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyfakefs/default.nix44
-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/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/pyflume/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyflunearyou/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyfma/default.nix46
-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.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyfronius/default.nix47
-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.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyfttt/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyfuse3/default.nix69
-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.nix79
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygame/fix-dependency-finding.patch48
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygame_sdl2/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygatt/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygbm/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygccxml/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygdbmi/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygeoip/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygeos/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygeos/fix-for-geos-3-11.patch29
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygetwindow/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygit2/default.nix89
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyglet/default.nix111
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygls/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygmars/default.nix42
-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/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygmo/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygmt/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygobject/3.nix79
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygobject/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygobject/pygobject-2.0-fix-darwin.patch88
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygogo/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygpgme/default.nix25
-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/pygtail/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygtfs/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygti/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygtkspellcheck/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygtrie/default.nix15
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyhamcrest/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyhanko-certvalidator/default.nix73
-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.nix132
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyhaversion/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyhcl/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyheos/default.nix37
-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.nix51
-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.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyimpfuzzy/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyinfra/default.nix70
-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/pyinsteon/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyinstrument/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyintesishome/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyipma/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyipp/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyiqvia/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyisy/default.nix43
-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/pyjson5/default.nix26
-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.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/pykakasi/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/pykdl/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/pykdtree/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/pykeepass/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/pykerberos/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/pykeyatome/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/pykira/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/pykka/default.nix39
-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.nix41
-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.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/pylama/default.nix81
-rw-r--r--nixpkgs/pkgs/development/python-modules/pylama/paths.patch13
-rw-r--r--nixpkgs/pkgs/development/python-modules/pylast/default.nix49
-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/pylev/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/pylgnetcast/default.nix39
-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/pylibftdi/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyliblo/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/pylibmc/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/pylink-square/default.nix41
-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/default.nix110
-rw-r--r--nixpkgs/pkgs/development/python-modules/pylitterbot/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/pylnk3/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/pylru/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyls-black/default.nix34
-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-mypy/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyls-spyder/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/pylsp-mypy/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/pylti/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/pylutron-caseta/default.nix51
-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/pymaging/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymaging_png/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymailgunner/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymanopt/default.nix50
-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-lammps/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymatgen/default.nix76
-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/pymazda/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymbolic/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymc/default.nix71
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymdown-extensions/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymdstat/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymediainfo/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymediaroom/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymeeus/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymelcloud/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymemcache/default.nix52
-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/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.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymfy/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymicrobot/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymitv/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymodbus/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymongo/default.nix28
-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/pympler/default.nix34
-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.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymunk/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymupdf/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymvglive/default.nix19
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymyq/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymysensors/default.nix59
-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.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/pynamecheap/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/pynamodb/default.nix33
-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.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/pynetdicom/default.nix80
-rw-r--r--nixpkgs/pkgs/development/python-modules/pynetgear/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/pynina/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/pynisher/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/pynmea2/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/pynndescent/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/pynobo/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/pynput/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/pynrrd/default.nix36
-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/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/pynvml/default.nix29
-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.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyocr/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyocr/paths.patch348
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyoctoprintapi/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyodbc/default.nix26
-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.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyopencl/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyopengl-accelerate/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyopengl/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyopenssl/default.nix80
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyopenuv/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyopnsense/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyoppleio/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyosf/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyosmium/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyotgw/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyotp/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyoverkiz/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyowm/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyownet/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyp/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/pypandoc/default.nix35
-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.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyparted/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyparted/fix-test-pythonpath.patch26
-rw-r--r--nixpkgs/pkgs/development/python-modules/pypass/default.nix86
-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.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/pypck/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/pypdf2/default.nix41
-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.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyphen/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyphotonfile/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/pypillowfight/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/pypinyin/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/pypiserver/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyplaato/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyplatec/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/pypng/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/pypoint/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/pypoolstation/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyppeteer/default.nix95
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyprecice/default.nix46
-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.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyproj/001.proj.patch48
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyproj/default.nix94
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyprosegur/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/pypsrp/default.nix79
-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.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/pypykatz/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/pypytools/default.nix53
-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.nix32
-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/4.x.nix69
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyqt/5.x.nix120
-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/sip.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyqtgraph/default.nix72
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyqtwebengine/default.nix71
-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.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyquil/default.nix102
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyqvrpro/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyrabbit2/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyrad/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyradios/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyrainbird/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyramid/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyramid_beaker/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyramid_chameleon/default.nix56
-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.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyramid_hawkauth/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyramid_jinja2/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyramid_mako/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyramid_multiauth/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyrect/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyregion/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyres/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyrevolve/default.nix41
-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/pyrisco/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyrituals/default.nix33
-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.nix73
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyro4/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyro5/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyrogram/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyroma/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyroute2/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyrr/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyrsistent/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyrss2gen/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyrtlsdr/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyruckus/default.nix36
-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.nix114
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysaml2/default.nix100
-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.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyscf/default.nix109
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyschedule/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyschemes/default.nix34
-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.patch127
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysdl2/default.nix40
-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.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysensors/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyserial-asyncio/default.nix34
-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.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysftp/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysha3/default.nix18
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyshark/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyshp/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysiaalarm/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyside/apiextractor.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyside/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyside/gcc6.patch18
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyside/generatorrunner.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyside/shiboken.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyside/shiboken_py35.patch12
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyside/tools.nix34
-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.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyside2/dont_ignore_optional_modules.patch11
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysigma-backend-elasticsearch/default.nix53
-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.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysigma-backend-qradar/default.nix49
-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.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysigma/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysignalclirestapi/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysigset/default.nix18
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysimplegui/default.nix35
-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.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyslurm/default.nix37
-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.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysmartapp/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysmartthings/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysmb/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysmbc/default.nix31
-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.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysmt/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysnmp-pyasn1/default.nix41
-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.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysnooper/default.nix35
-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/pysolcast/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysolr/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysoma/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysonos/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyspark/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysparse/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysparse/dropPackageLoader.patch88
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyspcwebgw/default.nix49
-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/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.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysrt/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyssim/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/pystache/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/pystemd/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/pystemmer/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/pystray/default.nix32
-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/pyswitchbot/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysychonaut/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysyncobj/default.nix27
-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/pytado/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytaglib/default.nix37
-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/pytautulli/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyte/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytenable/default.nix76
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytesseract/default.nix41
-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.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-annotate/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-ansible/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-arraydiff/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-astropy-header/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-astropy/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-asyncio/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-asyncio/tests.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-bdd/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-benchmark/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-black/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-cases/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-catchlog/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-celery/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-check/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-cid/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-click/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-console-scripts/default.nix54
-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.nix32
-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.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-dotenv/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-env/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-error-for-skips/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-expect/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-factoryboy/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-filter-subpackage/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-fixture-config/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-flake8/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-flakes/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-flask/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-forked/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-freezegun/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-helpers-namespace/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-html/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-httpbin/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-httpserver/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-httpx/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-instafail/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-isort/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-json-report/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-lazy-fixture/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-localserver/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-logdog/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-metadata/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-mock/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-mockservers/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-mpl/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-mypy-plugins/default.nix59
-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.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-ordering/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-param-files/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-pylint/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-qt/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-quickcheck/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-raises/default.nix30
-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.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-regressions/default.nix69
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-relaxed/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-remotedata/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-repeat/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-rerunfailures/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-resource-path/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-runner/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-sanic/default.nix52
-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.nix33
-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-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.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-sugar/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-test-utils/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-testmon/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-timeout/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-tornado/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-tornasync/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-trio/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-twisted/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-unordered/default.nix28
-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-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.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-xdist/setup-hook.sh18
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-xprocess/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-xvfb/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest/default.nix89
-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-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.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-baseconv/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-benedict/default.nix81
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-bidi/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-binance/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-box/default.nix47
-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-crfsuite/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-crontab/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-csxcad/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-ctags3/default.nix17
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-daemon/default.nix90
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-datemath/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-dbusmock/default.nix87
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-didl-lite/default.nix37
-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.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-engineio/default.nix72
-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-family-hub-local/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-flirt/Cargo.lock1465
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-flirt/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-fontconfig/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-forecastio/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-frontmatter/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-fsutil/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-gammu/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-gitlab/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-glanceclient/default.nix71
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-gnupg/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-google-nest/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-gvm/default.nix58
-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-homewizard-energy/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-hosts/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-hpilo/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-http-client/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-i18n/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-ipmi/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.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-jenkins/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-jose/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-json-logger/default.nix27
-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.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-keycloak/default.nix41
-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-levenshtein/default.nix29
-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.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-lsp-server/default.nix122
-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.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-magic/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-magic/libmagic-path.patch28
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-manilaclient/default.nix79
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-manilaclient/tests.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-mapnik/default.nix75
-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-memcached/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-miio/default.nix84
-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.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-mystrom/default.nix45
-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.nix25
-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.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-olm/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-opendata-transport/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-openems/default.nix49
-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-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.nix44
-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-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.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-rapidjson/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-redis-lock/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-registry/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-rtmidi/default.nix49
-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.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-smarttub/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-snap7/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-snappy/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-socketio/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-socks/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-songpal/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-sql/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-status/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-stdnum/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-string-utils/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-swiftclient/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-tado/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-telegram-bot/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-telegram/default.nix52
-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.nix37
-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-uinput/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-unshare/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-utils/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-vagrant/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-velbus/default.nix33
-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.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-zbar/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/python3-application/default.nix48
-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.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/python_fedora/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/python_keyczar/default.nix27
-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.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/pythonfinder/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/pythonix/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/pythonnet/default.nix102
-rw-r--r--nixpkgs/pkgs/development/python-modules/pythonocc-core/default.nix58
-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.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytibber/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytidylib/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytile/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytimeparse/default.nix20
-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/pytoml/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytomlpp/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytomorrowio/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytools/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytorch-lightning/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytorch-metric-learning/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytorch-pfn-extras/default.nix71
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytorch/bin.nix83
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytorch/binary-hashes.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytorch/breakpad-sigstksz.patch13
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytorch/default.nix322
-rwxr-xr-xnixpkgs/pkgs/development/python-modules/pytorch/prefetch.sh46
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytorch/pthreadpool-disable-gcd.diff45
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytraccar/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytradfri/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytrafikverket/default.nix41
-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.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytricia/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyttsx3/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytube/default.nix42
-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.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytz/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytzdata/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyu2f/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyuavcan/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyudev/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyunifi/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyunifiprotect/default.nix97
-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.nix51
-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.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyvcd/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyvcf/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.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyvesync/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyvex/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyvicare/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyvips/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyvis/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyvisa-py/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyvisa/default.nix49
-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.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyvo/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyvolumio/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyvoro/default.nix24
-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/pywavelets/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/pywayland/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/pywbem/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyweatherflowrest/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/pywebpush/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/pywebview/default.nix77
-rw-r--r--nixpkgs/pkgs/development/python-modules/pywemo/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/pywerview/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/pywick/default.nix48
-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.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/pywlroots/default.nix51
-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.nix25
-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.nix28
-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.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyxnat/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyyaml-env-tag/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyyaml/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyzbar/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyzerproc/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyzmq/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyzufall/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/qcelemental/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/qcengine/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/qcs-api-client/default.nix94
-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/qds_sdk/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/qiling/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/qimage2ndarray/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/qingping-ble/default.nix53
-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.nix87
-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.nix207
-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/qrcode/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/qreactor/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/qscintilla-qt4/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/qscintilla-qt5/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/qstylizer/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/qt5reactor/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/qtawesome/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/qtconsole/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/qtpy/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/qualysclient/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/quamash/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/quandl/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/quantities/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/quantum-gateway/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/querystring-parser/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/questionary/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/queuelib/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/qutip/default.nix91
-rw-r--r--nixpkgs/pkgs/development/python-modules/r2pipe/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/rabbitpy/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/rachiopy/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/radicale_infcloud/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/radio_beam/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/radios/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/radiotherm/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/radish-bdd/default.nix52
-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.nix61
-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/rangehttpserver/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/rapidfuzz-capi/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/rapidfuzz/default.nix82
-rw-r--r--nixpkgs/pkgs/development/python-modules/rarfile/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/rasterio/default.nix98
-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/ratelimiter/default.nix43
-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/rbtools/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/rcssmin/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/rdflib/default.nix86
-rw-r--r--nixpkgs/pkgs/development/python-modules/rdkit/default.nix158
-rw-r--r--nixpkgs/pkgs/development/python-modules/re-assert/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/readability-lxml/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/readchar/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/readlike/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/readme/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/readme_renderer/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/readthedocs-sphinx-ext/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/rebulk/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/recaptcha_client/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/recommonmark/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/recordlinkage/default.nix53
-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/default.nix72
-rw-r--r--nixpkgs/pkgs/development/python-modules/rednose/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/reedsolo/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/reflink/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/regenmaschine/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/regex/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/regional/default.nix41
-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.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/renault-api/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/rencode/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/reolink/default.nix69
-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/repocheck/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/reportengine/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/reportlab/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/repoze_lru/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/repoze_sphinx_autointerface/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/repoze_who/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/reproject/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/reqif/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/requests-aws4auth/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/requests-cache/default.nix113
-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.nix25
-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.nix34
-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-toolbelt/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/requests-unixsocket/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/requests/0001-Prefer-NixOS-Nix-default-CA-bundles-over-certifi.patch60
-rw-r--r--nixpkgs/pkgs/development/python-modules/requests/default.nix93
-rw-r--r--nixpkgs/pkgs/development/python-modules/requests_download/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/requests_ntlm/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/requestsexceptions/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/requirements-detector/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/requirements-parser/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/resampy/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/resolvelib/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/responses/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/respx/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/restfly/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/restrictedpython/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/restructuredtext_lint/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/restview/default.nix45
-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.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/retrying/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/retworkx/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/rfc-bibtex/default.nix20
-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/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.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/rflink/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/rich-rst/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/rich/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/rig/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/ring-doorbell/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/riprova/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/ripser/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/rising/default.nix38
-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.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/rki-covid-parser/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/rl-coach/default.nix99
-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.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/rnc2rng/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/rnginline/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/rns/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/robomachine/default.nix30
-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-requests/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/robotframework-selenium2library/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/robotframework-seleniumlibrary/default.nix31
-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.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/rocket-errbot/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/roku/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/rokuecp/default.nix79
-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.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/roonapi/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/rope/default.nix33
-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/routes/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/rova/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/rpcq/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/rpdb/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/rpi-bad-power/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/rpi-gpio/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/rpi-gpio2/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/rplcd/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/rply/default.nix27
-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.nix95
-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.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/rq/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/rsa/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/rst2ansi/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/rstcheck-core/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/rstcheck/default.nix74
-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.nix64
-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.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/ruamel-yaml-clib/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/ruamel-yaml/default.nix33
-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/runway-python/default.nix91
-rw-r--r--nixpkgs/pkgs/development/python-modules/ruyaml/default.nix50
-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.nix31
-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.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/s3fs/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/s3transfer/default.nix53
-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.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/sacremoses/default.nix37
-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/safety/default.nix72
-rw-r--r--nixpkgs/pkgs/development/python-modules/sagemaker/default.nix66
-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.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/samsungctl/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/samsungtvws/default.nix69
-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.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/sanic-testing/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/sanic-testing/tests.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/sanic/default.nix140
-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.nix164
-rw-r--r--nixpkgs/pkgs/development/python-modules/scapy/default.nix78
-rw-r--r--nixpkgs/pkgs/development/python-modules/schedule/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/schema-salad/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/schema/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/schiene/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/schwifty/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/scikit-bio/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/scikit-build/default.nix85
-rw-r--r--nixpkgs/pkgs/development/python-modules/scikit-fmm/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/scikit-fuzzy/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/scikit-hep-testdata/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/scikit-image/add-testing-data.patch17
-rw-r--r--nixpkgs/pkgs/development/python-modules/scikit-image/default.nix113
-rw-r--r--nixpkgs/pkgs/development/python-modules/scikit-learn-extra/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/scikit-learn/default.nix103
-rw-r--r--nixpkgs/pkgs/development/python-modules/scikit-misc/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/scikit-optimize/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/scikit-survival/default.nix74
-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/scipy/default.nix81
-rw-r--r--nixpkgs/pkgs/development/python-modules/scmrepo/default.nix58
-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.nix40
-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.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/scrapy-splash/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/scrapy/default.nix142
-rw-r--r--nixpkgs/pkgs/development/python-modules/screeninfo/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/screenlogicpy/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/scripttest/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/scs/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/sdds/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/sdnotify/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/seaborn/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/seabreeze/default.nix71
-rw-r--r--nixpkgs/pkgs/development/python-modules/seatconnect/default.nix63
-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/secure/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/securetar/default.nix41
-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.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/segyio/default.nix55
-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.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/semantic-version/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/semver/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/send2trash/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/sendgrid/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/sense-energy/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/sensor-state-data/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/sensorpush-ble/default.nix55
-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.nix161
-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/serpent/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/serpy/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/servefile/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/serverlessrepo/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/service-identity/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/setproctitle/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/setupmeta/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/setuptools-declarative-requirements/default.nix28
-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-rust/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/setuptools-rust/pyo3-test/default.nix25
-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.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/setuptools-scm/tests.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/setuptools/default.nix81
-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/setuptoolstrial/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/seventeentrack/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/sexpdata/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/sfepy/default.nix77
-rw-r--r--nixpkgs/pkgs/development/python-modules/sgmllib3k/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/sh/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/sh/disable-broken-tests-darwin.patch48
-rw-r--r--nixpkgs/pkgs/development/python-modules/shamir-mnemonic/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/shap/default.nix72
-rw-r--r--nixpkgs/pkgs/development/python-modules/shapely/default.nix71
-rw-r--r--nixpkgs/pkgs/development/python-modules/shapely/library-paths.patch31
-rw-r--r--nixpkgs/pkgs/development/python-modules/sharedmem/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/sharkiq/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/shellescape/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/shellingham/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/shiboken2/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/shiboken2/nix_compile_cflags.patch30
-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/shodan/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/shortuuid/default.nix38
-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/showit/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/shtab/default.nix52
-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/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.nix54
-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/sigtools/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/simanneal/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/simber/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/simple-di/default.nix43
-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.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/simple-websocket-server/default.nix22
-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.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/simplefix/default.nix25
-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/simplejson/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/simplekml/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/simplenote/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/simplisafe-python/default.nix88
-rw-r--r--nixpkgs/pkgs/development/python-modules/simpy/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/single-version/0001-set-poetry-core.patch21
-rw-r--r--nixpkgs/pkgs/development/python-modules/single-version/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/siobrultech-protocols/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/siosocks/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/sip/4.x.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/sip/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/sip/fix-manylinux-version.patch19
-rw-r--r--nixpkgs/pkgs/development/python-modules/six/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/sjcl/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/skein/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/skein/skeinjar.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/skia-pathops/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/skidl/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/sklearn-deap/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/skodaconnect/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/skorch/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/skybellpy/default.nix45
-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.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/skytemple-icons/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/skytemple-rust/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/skytemple-ssb-debugger/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/slack-sdk/default.nix83
-rw-r--r--nixpkgs/pkgs/development/python-modules/slackclient/default.nix76
-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.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/slicerator/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/slither-analyzer/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/slixmpp/0001-xep_0030-allow-extra-args-in-get_info_from_domain.patch36
-rw-r--r--nixpkgs/pkgs/development/python-modules/slixmpp/default.nix62
-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/slowapi/default.nix71
-rw-r--r--nixpkgs/pkgs/development/python-modules/slugid/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/sly/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/smart-meter-texas/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/smart-open/default.nix57
-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.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/smbus-cffi/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/smbus2/default.nix41
-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/smpplib/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/snakebite/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/snakeviz/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/snapcast/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/snapshottest/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/sniffio/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/snitun/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/snowballstemmer/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/snowflake-connector-python/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/snowflake-sqlalchemy/default.nix34
-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.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/social-auth-core/default.nix83
-rw-r--r--nixpkgs/pkgs/development/python-modules/socialscan/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/socid-extractor/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/socketio-client/default.nix39
-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.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/socksipy-branch/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/soco/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/softlayer/default.nix78
-rw-r--r--nixpkgs/pkgs/development/python-modules/solaredge/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/solax/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/solc-select/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/solo-python/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/somajo/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/somecomfort/default.nix33
-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/sopel/default.nix73
-rw-r--r--nixpkgs/pkgs/development/python-modules/sorl_thumbnail/default.nix28
-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/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/soupsieve/default.nix35
-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.py68
-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.nix56
-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.nix96
-rw-r--r--nixpkgs/pkgs/development/python-modules/spacy/legacy.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/spacy/models.json374
-rw-r--r--nixpkgs/pkgs/development/python-modules/spacy/models.nix47
-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.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/spdx-tools/default.nix46
-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.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/speedtest-cli/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/spglib/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphfile/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinx-argparse/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinx-autobuild/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinx-autodoc-typehints/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinx-basic-ng/default.nix44
-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.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinx-comments/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinx-copybutton/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinx-design/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinx-external-toc/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinx-fortran/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinx-inline-tabs/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinx-jinja/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinx-jupyterbook-latex/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinx-markdown-parser/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinx-material/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinx-multitoc-numbering/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinx-navtree/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinx-pytest/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinx-rtd-theme/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinx-serve/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinx-testing/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinx-thebe/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinx-togglebutton/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinx/0001-test-images-Use-normalization-equivalent-character.patch35
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinx/default.nix149
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinx_pypi_upload/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib-actdiag/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib-apidoc/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib-applehelp/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib-autoapi/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib-bayesnet/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib-bibtex/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib-blockdiag/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib-confluencebuilder/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib-devhelp/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib-excel-table/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib-fulltoc/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib-htmlhelp/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib-jsmath/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib-katex/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib-nwdiag/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib-openapi/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib-plantuml/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib-programoutput/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib-qthelp/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib-seqdiag/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib-serializinghtml/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib-spelling/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib-tikz/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib-websupport/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib_httpdomain/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib_newsfeed/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxext-opengraph/default.nix37
-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.nix73
-rw-r--r--nixpkgs/pkgs/development/python-modules/spotipy/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/spsdk/default.nix116
-rw-r--r--nixpkgs/pkgs/development/python-modules/spur/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/spyder-kernels/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/spyder/default.nix153
-rw-r--r--nixpkgs/pkgs/development/python-modules/spyse-python/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/sqlalchemy-citext/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/sqlalchemy-continuum/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/sqlalchemy-i18n/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/sqlalchemy-jsonfield/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/sqlalchemy-migrate/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/sqlalchemy-mixins/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/sqlalchemy-utils/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/sqlalchemy-utils/skip-database-tests.patch100
-rw-r--r--nixpkgs/pkgs/development/python-modules/sqlalchemy/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/sqlite-fts4/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/sqlite-utils/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/sqlitedict/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/sqlmap/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/sqlobject/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/sqlparse/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/sqlsoup/default.nix22
-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.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/srsly/default.nix42
-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.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/ssdp/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/sseclient-py/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/sseclient/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/ssh-mitm/default.nix58
-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.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/stanza/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/starkbank-ecdsa/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/starlette/default.nix81
-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/staticjinja/default.nix66
-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/statistics/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/statmake/default.nix71
-rw-r--r--nixpkgs/pkgs/development/python-modules/statsd/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/statsmodels/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/stdiomask/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/stdlib-list/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/steamodd/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/stem/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/stestr/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/stestr/tests.nix28
-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.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/stm32loader/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/stone/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/stookalert/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/stopit/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/strategies/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/stravalib/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/strawberry-graphql/default.nix39
-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.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/streamlabswater/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/streamz/default.nix83
-rw-r--r--nixpkgs/pkgs/development/python-modules/strenum/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/strict-rfc3339/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/strictyaml/default.nix37
-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/stripe/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/striprtf/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/structlog/default.nix52
-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/default.nix83
-rw-r--r--nixpkgs/pkgs/development/python-modules/subarulink/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/subdownloader/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/subliminal/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/subprocess-tee/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/subunit/default.nix38
-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/suds-jurko/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/sumo/default.nix72
-rw-r--r--nixpkgs/pkgs/development/python-modules/sumtypes/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/sunpy/default.nix163
-rw-r--r--nixpkgs/pkgs/development/python-modules/sunwatcher/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/superqt/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/supervise_api/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/supervise_api/supervise-path.patch15
-rw-r--r--nixpkgs/pkgs/development/python-modules/supervisor/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/sure/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/surepy/default.nix71
-rw-r--r--nixpkgs/pkgs/development/python-modules/surt/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/survey/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/suseapi/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/svg-path/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/svg2tikz/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/svglib/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/svgwrite/default.nix37
-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.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/symengine/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/sympy/default.nix35
-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/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.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/sysv_ipc/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/tableaudocumentapi/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/tables/default.nix81
-rw-r--r--nixpkgs/pkgs/development/python-modules/tablib/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/tabula-py/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/tabulate/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/tabview/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/tadasets/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/tag-expressions/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/tago/default.nix47
-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.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/tappy/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/tasklib/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/taskw/default.nix41
-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.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/taxi/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/tblib/default.nix18
-rw-r--r--nixpkgs/pkgs/development/python-modules/tbm-utils/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/teamcity-messages/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/telegram/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/telethon-session-sqlalchemy/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/telethon/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/teletype/default.nix32
-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/tempest/default.nix87
-rw-r--r--nixpkgs/pkgs/development/python-modules/tempita/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/tempora/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/tenacity/default.nix33
-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.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/tensorboard-plugin-wit/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/tensorboard/default.nix90
-rw-r--r--nixpkgs/pkgs/development/python-modules/tensorboardx/default.nix82
-rw-r--r--nixpkgs/pkgs/development/python-modules/tensorflow-datasets/corruptions.patch22
-rw-r--r--nixpkgs/pkgs/development/python-modules/tensorflow-datasets/default.nix150
-rw-r--r--nixpkgs/pkgs/development/python-modules/tensorflow-estimator/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/tensorflow-metadata/build.patch15
-rw-r--r--nixpkgs/pkgs/development/python-modules/tensorflow-metadata/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/tensorflow-probability/default.nix115
-rw-r--r--nixpkgs/pkgs/development/python-modules/tensorflow/bin.nix200
-rw-r--r--nixpkgs/pkgs/development/python-modules/tensorflow/binary-hashes.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/tensorflow/default.nix535
-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.sh46
-rw-r--r--nixpkgs/pkgs/development/python-modules/tensorly/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/tensorrt/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/termcolor/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/terminado/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/terminaltables/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/termplotlib/default.nix52
-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.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/tesla-powerwall/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/tesla-wall-connector/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/teslajsonpy/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/tess/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/tesserocr/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/test-tube/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/testcontainers/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/testfixtures/default.nix58
-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.nix38
-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.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/text-unidecode/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/textacy/default.nix71
-rw-r--r--nixpkgs/pkgs/development/python-modules/textdistance/default.nix23
-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/texttable/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/textual/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/textwrap3/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/textx/default.nix178
-rw-r--r--nixpkgs/pkgs/development/python-modules/textx/tests.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/tflearn/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/tgcrypto/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/theano-pymc/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/thespian/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/thinc/default.nix101
-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.nix39
-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.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/thumborpexif/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/tifffile/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/tika/default.nix29
-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.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/tiler/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/tilestache/default.nix32
-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.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/timeout-decorator/default.nix16
-rw-r--r--nixpkgs/pkgs/development/python-modules/timetagger/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/timezonefinder/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/tinycss/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/tinycss2/default.nix41
-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/tissue/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/titlecase/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/tkinter/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/tld/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/tldextract/default.nix63
-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/tmb/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/todoist/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/toggl-cli/default.nix92
-rw-r--r--nixpkgs/pkgs/development/python-modules/token-bucket/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/tokenize-rt/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/tokenizers/default.nix145
-rw-r--r--nixpkgs/pkgs/development/python-modules/tokenlib/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/tololib/default.nix49
-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.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/tomlkit/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/toolz/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/toonapi/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/toposort/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/torch-tb-profiler/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/torchaudio/bin.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/torchaudio/binary-hashes.nix66
-rwxr-xr-xnixpkgs/pkgs/development/python-modules/torchaudio/prefetch.sh46
-rw-r--r--nixpkgs/pkgs/development/python-modules/torchgpipe/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/torchinfo/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/torchmetrics/default.nix78
-rw-r--r--nixpkgs/pkgs/development/python-modules/torchvision/bin.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/torchvision/binary-hashes.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/torchvision/default.nix68
-rwxr-xr-xnixpkgs/pkgs/development/python-modules/torchvision/prefetch.sh46
-rw-r--r--nixpkgs/pkgs/development/python-modules/tornado/4.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/tornado/5.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/tornado/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/torpy/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/torrequest/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/total-connect-client/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/towncrier/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/tox/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/tpm2-pytss/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/tqdm/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/traceback2/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/tracing/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/trackpy/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/traitlets/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/traits/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/traitsui/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/traittypes/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/transaction/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/transformers/default.nix107
-rw-r--r--nixpkgs/pkgs/development/python-modules/transforms3d/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/transip/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/transitions/default.nix51
-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.nix55
-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/treelog/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/treeo/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/treex/default.nix80
-rw-r--r--nixpkgs/pkgs/development/python-modules/treq/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/trezor/default.nix85
-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.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/trio-asyncio/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/trio-websocket/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/trio/default.nix76
-rw-r--r--nixpkgs/pkgs/development/python-modules/trueskill/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/trustme/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/trytond/default.nix87
-rw-r--r--nixpkgs/pkgs/development/python-modules/ttls/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/ttp-templates/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/ttp/default.nix109
-rw-r--r--nixpkgs/pkgs/development/python-modules/tubes/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/tubeup/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/tumpa/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/tunigo/default.nix27
-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.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/tweepy/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/twentemilieu/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/twiggy/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/twilio/default.nix53
-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.nix171
-rw-r--r--nixpkgs/pkgs/development/python-modules/twitch-python/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/twitchapi/default.nix51
-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.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/twitterapi/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/twofish/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/txaio/default.nix53
-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/txredisapi/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/txrequests/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/txtorcon/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/txzmq/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/typecode/default.nix65
-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.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/typeguard/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/typer/default.nix65
-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-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-ipaddress/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/types-protobuf/default.nix34
-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.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/types-requests/default.nix34
-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-typed-ast/default.nix29
-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.nix89
-rw-r--r--nixpkgs/pkgs/development/python-modules/typing-extensions/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/typing-inspect/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/typogrify/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/tzdata/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/tzlocal/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/u-msgpack-python/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/ua-parser/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/ua-parser/dont-fetch-submodule.patch17
-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.nix76
-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/uc-micro-py/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/udatetime/default.nix35
-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/ufo2ft/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/ufo2ft/fonttools-cu2qu.patch130
-rw-r--r--nixpkgs/pkgs/development/python-modules/ufoLib2/default.nix43
-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.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/ujson/default.nix36
-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/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.nix69
-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/unicode-slugify/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/unicodecsv/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/unicodedata2/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/unicorn/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/unicrypto/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/unidecode/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/unidic-lite/default.nix29
-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.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/unittest2/collections-compat.patch19
-rw-r--r--nixpkgs/pkgs/development/python-modules/unittest2/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/univers/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/unpaddedbase64/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/unrardll/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/unrpa/default.nix24
-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.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/upcloud-api/default.nix37
-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.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/uproot3-methods/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/uproot3/default.nix47
-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/uranium/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/uri-template/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/uritemplate/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/uritools/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/url-normalize/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/urlextract/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/urlgrabber/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/urllib3/default.nix79
-rw-r--r--nixpkgs/pkgs/development/python-modules/urlpy/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/urwid-readline/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/urwid/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/urwidtrees/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/us/default.nix36
-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.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/ush/default.nix35
-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.nix73
-rw-r--r--nixpkgs/pkgs/development/python-modules/uvicorn/tests.nix49
-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.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/validictory/default.nix26
-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.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/vapoursynth/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/variants/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/varint/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/vcrpy/default.nix51
-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.nix75
-rw-r--r--nixpkgs/pkgs/development/python-modules/vega/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/vega_datasets/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/vehicle/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/velbus-aio/default.nix46
-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.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/versionfinder/default.nix55
-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/vertica-python/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/veryprettytable/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/videocr/default.nix46
-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.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/virtkey/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/virtual-display/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/virtualenv-clone/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/virtualenv/0001-Check-base_prefix-and-base_exec_prefix-for-Python-2.patch37
-rw-r--r--nixpkgs/pkgs/development/python-modules/virtualenv/default.nix93
-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.nix73
-rw-r--r--nixpkgs/pkgs/development/python-modules/vispy/library-paths.patch39
-rw-r--r--nixpkgs/pkgs/development/python-modules/viv-utils/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/vivisect/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/vmprof/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/vncdo/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/vobject/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/volkszaehler/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/voluptuous-serialize/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/voluptuous/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/volvooncall/default.nix62
-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.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/vsure/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/vt-py/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/vulcan-api/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/vultr/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/vulture/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/vxi11/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/w3lib/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/wadllib/default.nix28
-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.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/wallbox/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/wandb/default.nix167
-rw-r--r--nixpkgs/pkgs/development/python-modules/wandb/hardcode-git-path.patch83
-rw-r--r--nixpkgs/pkgs/development/python-modules/waqiasync/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/warcio/default.nix56
-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.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/wasm/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/wasmer/default.nix99
-rw-r--r--nixpkgs/pkgs/development/python-modules/wasmer/tests.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/watchdog/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/watchdog/force-kqueue.patch159
-rw-r--r--nixpkgs/pkgs/development/python-modules/watchfiles/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/watchgod/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/waterfurnace/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/watermark/default.nix44
-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.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/weasyprint/default.nix105
-rw-r--r--nixpkgs/pkgs/development/python-modules/weasyprint/library-paths.patch32
-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/webargs/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/webassets/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/webauthn/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/webcolors/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/webdav4/default.nix89
-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/webrtcvad/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/websocket-client/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/websockets/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/websockify/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/webssh/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/webtest-aiohttp/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/webtest/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/webthing/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/weconnect-mqtt/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/weconnect/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/werkzeug/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/west/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/wfuzz/default.nix72
-rw-r--r--nixpkgs/pkgs/development/python-modules/wget/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/whatthepatch/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/wheel-filename/default.nix46
-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.patch37
-rw-r--r--nixpkgs/pkgs/development/python-modules/wheel/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/whichcraft/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/whirlpool-sixth-sense/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/whisper/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/whispers/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/whitenoise/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/whodap/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/whois/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/whoosh/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/widgetsnbextension/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/widlparser/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/wiffi/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/wifi/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/willow/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/winacl/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/winsspi/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/wktutils/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/wled/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/woob/default.nix95
-rw-r--r--nixpkgs/pkgs/development/python-modules/woodblock/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/word2vec/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/wordcloud/default.nix75
-rw-r--r--nixpkgs/pkgs/development/python-modules/wordfreq/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/worldengine/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/wrapio/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/wrapt/default.nix33
-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.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/wsgidav/default.nix55
-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/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.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/wtforms/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/wurlitzer/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/wxPython/4.0.nix79
-rw-r--r--nixpkgs/pkgs/development/python-modules/wxPython/4.1.nix103
-rw-r--r--nixpkgs/pkgs/development/python-modules/x11_hash/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/x256/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/xapian/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/xapp/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/xarray-einstats/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/xarray/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/xattr/default.nix32
-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.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/xdg/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/xdis/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/xdot/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/xgboost/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/xhtml2pdf/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/xiaomi-ble/default.nix59
-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.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/xlib/default.nix54
-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.nix21
-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.nix95
-rw-r--r--nixpkgs/pkgs/development/python-modules/xmldiff/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/xmljson/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/xmlschema/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/xmlsec/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/xmlsec/reset-lxml-in-tests.patch22
-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/xnd/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/xpath-expressions/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/xpybutil/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/xsdata/default.nix80
-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-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.nix40
-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/yabadaba/default.nix57
-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.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/yalexs/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/yamale/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/yamlfix/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/yamllint/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/yamlloader/default.nix34
-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.nix46
-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.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/yara-python/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/yarg/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/yarl/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/yaspin/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/yaswfp/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/yattag/default.nix17
-rw-r--r--nixpkgs/pkgs/development/python-modules/ydiff/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/yeelight/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/yfinance/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/yolink-api/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/yolk/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/youless-api/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/youtube-search-python/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/youtube-search/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/youtube-transcript-api/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/yowsup/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/yoyo-migrations/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/yq/default.nix55
-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.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/yubico-client/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/z3c-checkversions/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/zadnegoale/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/zake/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/zarr/default.nix48
-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/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.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/zcs/fix-test-yaml.patch13
-rw-r--r--nixpkgs/pkgs/development/python-modules/zdaemon/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/zeep/default.nix100
-rw-r--r--nixpkgs/pkgs/development/python-modules/zeroc-ice/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/zeroconf/default.nix63
-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.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/zfec/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/zha-quirks/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/zict/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/zigpy-cc/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/zigpy-deconz/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/zigpy-xbee/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/zigpy-zigate/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/zigpy-znp/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/zigpy/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/zimports/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/zipfile36/default.nix32
-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.nix38
-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.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/zodbpickle/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/zope-cachedescriptors/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/zope-deferredimport/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/zope-hookable/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/zope-testbrowser/default.nix75
-rw-r--r--nixpkgs/pkgs/development/python-modules/zope_broken/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/zope_component/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/zope_configuration/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/zope_contenttype/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/zope_copy/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/zope_deprecation/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/zope_dottedname/default.nix22
-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_i18nmessageid/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/zope_interface/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/zope_lifecycleevent/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/zope_location/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/zope_proxy/default.nix28
-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.nix28
-rwxr-xr-xnixpkgs/pkgs/development/python-modules/zstandard/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/zstd/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/zulip/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/zwave-js-server-python/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/zwave-me-ws/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/zxcvbn/default.nix27
5725 files changed, 269208 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..ff64a6d1a473
--- /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";
+  };
+
+  checkInputs = [ 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/APScheduler/default.nix b/nixpkgs/pkgs/development/python-modules/APScheduler/default.nix
new file mode 100644
index 000000000000..b6f79b6c5fc6
--- /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.9.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "APScheduler";
+    inherit version;
+    hash = "sha256-ZeZXS2OVSY03HQRfKop+T31Qxq0h73MT0VscfPIN8eM=";
+  };
+
+  buildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    pytz
+    setuptools
+    six
+    tzlocal
+  ];
+
+  checkInputs = [
+    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/Cython/default.nix b/nixpkgs/pkgs/development/python-modules/Cython/default.nix
new file mode 100644
index 000000000000..15ddfbe9f7a5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/Cython/default.nix
@@ -0,0 +1,75 @@
+{ 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.30";
+
+  src = fetchPypi {
+    pname = "Cython";
+    inherit version;
+    sha256 = "sha256-IjW2Laj+b6i5lCLI5YPy+5XhQ4Z9M3tcdeS5oahl+eM=";
+  };
+
+  nativeBuildInputs = [
+    pkg-config
+  ];
+
+  checkInputs = [
+    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)
+    (fetchpatch {
+      name = "trashcan.patch";
+      url = "https://git.sagemath.org/sage.git/plain/build/pkgs/cython/patches/trashcan.patch?id=4569a839f070a1a38d5dbce2a4d19233d25aeed2";
+      sha256 = "sha256-+pOF1XNTEtNseLpqPzrc1Jfwt5hGx7doUoccIhNneYY=";
+    })
+  ];
+
+  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;
+
+  meta = {
+    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/Fabric/default.nix b/nixpkgs/pkgs/development/python-modules/Fabric/default.nix
new file mode 100644
index 000000000000..bafaee5d02b1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/Fabric/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, cryptography
+, invoke
+, mock
+, paramiko
+, pytestCheckHook
+, pytest-relaxed
+}:
+
+buildPythonPackage rec {
+  pname = "fabric";
+  version = "2.7.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-dvj+9ZzyBh29hJu85P5JvdggiEOFAEsMpZE2rD2xKeQ=";
+  };
+
+  # only relevant to python < 3.4
+  postPatch = ''
+    substituteInPlace setup.py \
+        --replace ', "pathlib2"' ' '
+  '';
+
+  propagatedBuildInputs = [ invoke paramiko cryptography ];
+
+  checkInputs = [ 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 = [ maintainers.costrouc ];
+  };
+}
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..3a01c9ba9831
--- /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";
+  };
+
+  checkInputs = [ 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/FormEncode/default.nix b/nixpkgs/pkgs/development/python-modules/FormEncode/default.nix
new file mode 100644
index 000000000000..4244d358c8dd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/FormEncode/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, isPy27
+, fetchPypi
+, setuptools-scm
+, six
+, dnspython
+, pycountry
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "FormEncode";
+  version = "2.0.1";
+
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "8f2974112c2557839d5bae8b76490104c03830785d923abbdef148bf3f710035";
+  };
+
+  postPatch = ''
+    sed -i '/setuptools_scm_git_archive/d' setup.py
+  '';
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  propagatedBuildInputs = [ six ];
+
+  checkInputs = [
+    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/GeoIP/default.nix b/nixpkgs/pkgs/development/python-modules/GeoIP/default.nix
new file mode 100644
index 000000000000..0e4b66fe962f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/GeoIP/default.nix
@@ -0,0 +1,28 @@
+{lib, buildPythonPackage, fetchPypi
+, geoip, nose}:
+
+buildPythonPackage rec {
+  pname = "GeoIP";
+  version = "1.3.2";
+
+  checkInputs = [ nose ];
+  propagatedBuildInputs = [
+    geoip
+  ];
+
+  src = fetchPypi {
+    inherit pname 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/GitPython/default.nix b/nixpkgs/pkgs/development/python-modules/GitPython/default.nix
new file mode 100644
index 000000000000..8d89c1af8d0c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/GitPython/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, substituteAll
+, git
+, gitdb
+, ddt
+, pythonOlder
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "gitpython";
+  version = "3.1.27";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "gitpython-developers";
+    repo = "GitPython";
+    rev = version;
+    sha256 = "sha256-RA+6JFXHUQoXGErV8+aYuJPsfXzNSZK3kTm6eMbQIss=";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./hardcode-git-path.patch;
+      inherit git;
+    })
+  ];
+
+  propagatedBuildInputs = [
+    gitdb
+    ddt
+  ] ++ lib.optionals (pythonOlder "3.10") [
+    typing-extensions
+  ];
+
+  # Tests require a git repo
+  doCheck = false;
+
+  pythonImportsCheck = [ "git" ];
+
+  meta = with lib; {
+    description = "Python Git Library";
+    homepage = "https://github.com/gitpython-developers/GitPython";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/GitPython/hardcode-git-path.patch b/nixpkgs/pkgs/development/python-modules/GitPython/hardcode-git-path.patch
new file mode 100644
index 000000000000..937479959926
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/GitPython/hardcode-git-path.patch
@@ -0,0 +1,13 @@
+diff --git a/git/cmd.py b/git/cmd.py
+index a4faefe..51ad442 100644
+--- a/git/cmd.py
++++ b/git/cmd.py
+@@ -175,7 +175,7 @@ class Git(LazyMixin):
+ 
+     # CONFIGURATION
+ 
+-    git_exec_name = "git"           # default that should work on linux and windows
++    git_exec_name = "@git@/bin/git"
+ 
+     # Enables debugging of GitPython's git commands
+     GIT_PYTHON_TRACE = os.environ.get("GIT_PYTHON_TRACE", False)
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..486f8a4556f5
--- /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/IPy/default.nix b/nixpkgs/pkgs/development/python-modules/IPy/default.nix
new file mode 100644
index 000000000000..05587ef07401
--- /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";
+  };
+
+  checkInputs = [ 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/JPype1/default.nix b/nixpkgs/pkgs/development/python-modules/JPype1/default.nix
new file mode 100644
index 000000000000..698a4165455d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/JPype1/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, pythonOlder
+, typing-extensions
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "JPype1";
+  version = "1.4.0";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-DF9mXuPm4xwn6dLUjdEr9OtP5oWII+ahEgGgNSdMz+E=";
+  };
+
+  propagatedBuildInputs = lib.optionals (pythonOlder "3.8") [
+    typing-extensions
+  ];
+
+  checkInputs = [
+    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/JayDeBeApi/default.nix b/nixpkgs/pkgs/development/python-modules/JayDeBeApi/default.nix
new file mode 100644
index 000000000000..0263b4b752d4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/JayDeBeApi/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, JPype1
+}:
+
+buildPythonPackage rec {
+  pname = "JayDeBeApi";
+  version = "1.2.3";
+
+  src = fetchPypi {
+    inherit pname 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/Logbook/default.nix b/nixpkgs/pkgs/development/python-modules/Logbook/default.nix
new file mode 100644
index 000000000000..fa05a7a6dffa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/Logbook/default.nix
@@ -0,0 +1,29 @@
+{ lib, buildPythonPackage, fetchPypi, isPy3k, pytest, mock, brotli }:
+
+buildPythonPackage rec {
+  pname = "Logbook";
+  version = "1.5.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1s1gyfw621vid7qqvhddq6c3z2895ci4lq3g0r1swvpml2nm9x36";
+  };
+
+  checkInputs = [ pytest ] ++ lib.optionals (!isPy3k) [ mock ];
+
+  propagatedBuildInputs = [ brotli ];
+
+  checkPhase = ''
+    find tests -name \*.pyc -delete
+    py.test tests
+  '';
+
+  # Some of the tests use localhost networking.
+  __darwinAllowLocalNetworking = true;
+
+  meta = {
+    homepage = "https://pythonhosted.org/Logbook/";
+    description = "A logging replacement for Python";
+    license = lib.licenses.bsd3;
+  };
+}
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..694f3138c928
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/Mako/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, isPyPy
+
+# propagates
+, markupsafe
+
+# extras: Babel
+, babel
+
+# tests
+, mock
+, pytestCheckHook
+, lingua
+, chameleon
+}:
+
+buildPythonPackage rec {
+  pname = "Mako";
+  version = "1.2.1";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-8FSl/0dDSS8aqezEcXLLM7QrnZk8/8wUbJ3hfnF7Awc=";
+  };
+
+  propagatedBuildInputs = [
+    markupsafe
+  ];
+
+  passthru.optional-dependencies = {
+    babel = [
+      babel
+    ];
+  };
+
+  checkInputs = [
+    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/Nikola/default.nix b/nixpkgs/pkgs/development/python-modules/Nikola/default.nix
new file mode 100644
index 000000000000..b15f07bfcaeb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/Nikola/default.nix
@@ -0,0 +1,112 @@
+{ 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.2";
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-lfSrBRwkWMHTFEJ4KmrWIx9XIMO5I9XxcuJe7zTxJsE=";
+  };
+
+  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
+  ];
+
+  checkInputs = [
+    freezegun
+    mock
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "--cov nikola --cov-report term-missing" ""
+  '';
+
+  disabledTests = [
+    # AssertionError
+    "test_compiling_markdown"
+  ];
+
+  pythonImportsCheck = [ "nikola" ];
+
+  meta = with lib; {
+    description = "Static website and blog generator";
+    homepage = "https://getnikola.com/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jluttine ];
+    # All tests fail
+    broken = stdenv.isDarwin;
+  };
+}
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..27c62ea66326
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/Pmw/default.nix
@@ -0,0 +1,23 @@
+{ lib , buildPythonPackage , fetchPypi, tkinter }:
+
+buildPythonPackage rec {
+  pname = "Pmw";
+  version = "2.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "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 = "http://pmw.sourceforge.net/";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ mounium ];
+  };
+}
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..0c599b18d73a
--- /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.0.0";
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "Rtree";
+    inherit version;
+    sha256 = "sha256-0Eg0ghITRrCTuaQlGNQPkhrfRFkVt66jB+smdoyDloI=";
+  };
+
+  postPatch = ''
+    substituteInPlace rtree/finder.py --replace \
+      'find_library("spatialindex_c")' '"${libspatialindex}/lib/libspatialindex_c${stdenv.hostPlatform.extensions.sharedLibrary}"'
+  '';
+
+  buildInputs = [ libspatialindex ];
+
+  checkInputs = [
+    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/Theano/default.nix b/nixpkgs/pkgs/development/python-modules/Theano/default.nix
new file mode 100644
index 000000000000..f596a6d804db
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/Theano/default.nix
@@ -0,0 +1,104 @@
+{ lib, stdenv
+, runCommandCC
+, fetchPypi
+, buildPythonPackage
+, isPyPy
+, pythonOlder
+, isPy3k
+, nose
+, numpy
+, scipy
+, setuptools
+, six
+, libgpuarray
+, cudaSupport ? false, cudaPackages ? {}
+, cudnnSupport ? false
+}:
+
+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
+  checkInputs = [ 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 = [ ];
+  };
+}
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..624bb4388a5d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/WSME/default.nix
@@ -0,0 +1,67 @@
+{ 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 {
+    inherit pname version;
+    sha256 = "bd2dfc715bedcc8f4649611bc0c8a238f483dc01cff7102bc1efa6bea207b64b";
+  };
+
+  nativeBuildInputs = [ pbr ];
+
+  propagatedBuildInputs = [
+    netaddr
+    pytz
+    simplegeneric
+    six
+    webob
+  ];
+
+  checkInputs = [
+    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/Wand/default.nix b/nixpkgs/pkgs/development/python-modules/Wand/default.nix
new file mode 100644
index 000000000000..86aad7708ad9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/Wand/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, imagemagickBig
+}:
+
+buildPythonPackage rec {
+  pname = "Wand";
+  version = "0.6.10";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-Nz9KfyhmyGjDHOkQ4fmzapLRMmQKIAaOwXzqMoT+3Fc=";
+  };
+
+  postPatch = ''
+    substituteInPlace wand/api.py --replace \
+      "magick_home = os.environ.get('MAGICK_HOME')" \
+      "magick_home = '${imagemagickBig}'"
+  '';
+
+  # tests not included with pypi release
+  doCheck = false;
+
+  passthru.imagemagick = imagemagickBig;
+
+  meta = with lib; {
+    description = "Ctypes-based simple MagickWand API binding for Python";
+    homepage = "http://wand-py.org/";
+    license = [ licenses.mit ];
+    maintainers = with maintainers; [ infinisil ];
+  };
+}
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..747887f2eaaf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/XlsxWriter/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "xlsxwriter";
+  version = "3.0.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "jmcnamara";
+    repo = "XlsxWriter";
+    rev = "RELEASE_${version}";
+    hash = "sha256-9fIxNkOdM+Bz1F9AWq02H3LLQnefxGSAtp9kM2OtJ9M=";
+  };
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "xlsxwriter"
+  ];
+
+  meta = with lib; {
+    description = "Module for creating Excel XLSX files";
+    homepage = "https://xlsxwriter.readthedocs.io/";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ jluttine ];
+  };
+}
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..de3ec6fa7f05
--- /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 ];
+  checkInputs = [ 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..58d07696de20
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aardwolf/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, arc4
+, asn1crypto
+, asn1tools
+, asysocks
+, buildPythonPackage
+, colorama
+, fetchPypi
+, minikerberos
+, pillow
+, pyperclip
+, pythonOlder
+, tqdm
+, unicrypto
+, winsspi
+}:
+
+buildPythonPackage rec {
+  pname = "aardwolf";
+  version = "0.0.8";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-plz1D+Lr5rV8iJo7IUmuXfjxLvVxX9lgyxyYXUlPH0k=";
+  };
+
+  propagatedBuildInputs = [
+    arc4
+    asn1crypto
+    asn1tools
+    asysocks
+    colorama
+    minikerberos
+    pillow
+    pyperclip
+    tqdm
+    unicrypto
+    winsspi
+  ];
+
+  # Module doesn't have tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "aardwolf"
+  ];
+
+  meta = with lib; {
+    description = "Asynchronous RDP protocol implementation";
+    homepage = "https://github.com/skelsec/aardwolf";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/abodepy/default.nix b/nixpkgs/pkgs/development/python-modules/abodepy/default.nix
new file mode 100644
index 000000000000..47fc6148ed24
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/abodepy/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchFromGitHub, pytestCheckHook, colorlog, lomond
+, requests, isPy3k, requests-mock }:
+
+buildPythonPackage rec {
+  pname = "abodepy";
+  version = "1.2.2";
+
+  disabled = !isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "MisterWil";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-GrvNCgWGGBbUUONwS18csh4/A0MMkSk5Z6LlDhlQqok=";
+  };
+
+  propagatedBuildInputs = [ colorlog lomond requests ];
+  checkInputs = [ pytestCheckHook requests-mock ];
+
+  meta = with lib; {
+    homepage = "https://github.com/MisterWil/abodepy";
+    description = "An Abode alarm Python library running on Python 3";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jamiemagee ];
+  };
+}
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..402fab32f55a
--- /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.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-OqOfiYMpwhVv9SXfppznCeQtd6qxi/SRdxnW8mCqagg=";
+  };
+
+  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/accupy/default.nix b/nixpkgs/pkgs/development/python-modules/accupy/default.nix
new file mode 100644
index 000000000000..fff517c84fbe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/accupy/default.nix
@@ -0,0 +1,75 @@
+{ lib
+, 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;
+
+  checkInputs = [
+    perfplot
+    pytestCheckHook
+    matplotlib
+    dufte
+  ];
+
+  postConfigure = ''
+   substituteInPlace setup.py \
+     --replace "/usr/include/eigen3/" "${eigen}/include/eigen3/"
+  '';
+
+  preBuild = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  # 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 = [ maintainers.costrouc ];
+  };
+}
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..618510363683
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/accuweather/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, aiohttp
+, aioresponses
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-asyncio
+, pytest-error-for-skips
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "accuweather";
+  version = "0.3.0";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "bieniu";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-Kn2hP0mdnC4+Lk8wsTznC23CsYLYKhya+HlHox1Fo2o=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "pytest-runner" ""
+    substituteInPlace setup.cfg \
+      --replace "--cov --cov-report term-missing" ""
+  '';
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  checkInputs = [
+    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";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ jamiemagee ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/acebinf/default.nix b/nixpkgs/pkgs/development/python-modules/acebinf/default.nix
new file mode 100644
index 000000000000..7889e007d83e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/acebinf/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pyvcf
+}:
+
+buildPythonPackage rec {
+  pname = "ACEBinf";
+  version = "1.0.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1168pny671l6zfm2vv1pwspnflmzi7f4v8yldjl7zlz0b9cm5zlz";
+  };
+
+  buildInputs = [ pyvcf ];
+
+  # no tests
+  doCheck = false;
+  pythonImportsCheck = [ "acebinf" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/ACEnglish/acebinf";
+    description = "Collection of simple utilities used when building bioinformatics tools";
+    license = licenses.unlicense;
+    maintainers = with maintainers; [ ris ];
+  };
+}
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..79c1ecffb037
--- /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 ];
+
+  checkInputs = [ 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..97e725bb7119
--- /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 = "source/${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..f81f382b956e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/acoustics/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, matplotlib
+, numpy
+, pandas
+, pytestCheckHook
+, pythonOlder
+, scipy
+, tabulate
+}:
+
+buildPythonPackage rec {
+  pname = "acoustics";
+  version = "0.2.6";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-0CvMhCUc+i7dPiHH+IXdlj+OjFh/l1wvnU4dmxQrzFI=";
+  };
+
+  propagatedBuildInputs = [
+    matplotlib
+    numpy
+    pandas
+    scipy
+    tabulate
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    export HOME=$TMPDIR
+    mkdir -p $HOME/.matplotlib
+    echo "backend: ps" > $HOME/.matplotlib/matplotlibrc
+  '';
+
+  pytestFlagsArray = [
+    "-Wignore::DeprecationWarning"
+  ];
+
+  disabledTestPaths = [
+    # All tests fail with TypeError
+    "tests/test_aio.py"
+  ];
+
+  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/actdiag/default.nix b/nixpkgs/pkgs/development/python-modules/actdiag/default.nix
new file mode 100644
index 000000000000..dd0a1c20cc76
--- /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;
+    sha256 = "sha256-WmprkHOgvlsOIg8H77P7fzEqxGnj6xaL7Df7urRkg3o=";
+  };
+
+  propagatedBuildInputs = [
+    blockdiag
+    setuptools
+  ];
+
+  checkInputs = [
+    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 SuperSandro2000 ];
+  };
+}
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..bd44626f8bcf
--- /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
+  ];
+
+  checkInputs = [
+    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-nrfutil/default.nix b/nixpkgs/pkgs/development/python-modules/adafruit-nrfutil/default.nix
new file mode 100644
index 000000000000..532fd301a1a4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/adafruit-nrfutil/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, pythonOlder
+, pyserial
+, click
+, ecdsa
+, behave
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "adafruit-nrfutil";
+  version = "0.5.3.post17";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "adafruit";
+    repo = "Adafruit_nRF52_nrfutil";
+    rev = version;
+    sha256 = "sha256-mHHKOQE9AGBX8RAyaPOy+JS3fTs98+AFdq9qsVy7go4=";
+  };
+
+  patches = [
+    # Pull a patch which fixes the tests, but is not yet released in a new version:
+    # https://github.com/adafruit/Adafruit_nRF52_nrfutil/pull/38
+    (fetchpatch {
+      name = "fix-tests.patch";
+      url = "https://github.com/adafruit/Adafruit_nRF52_nrfutil/commit/e5fbcc8ee5958041db38c04139ba686bf7d1b845.patch";
+      sha256 = "sha256-0tbJldGtYcDdUzA3wZRv0lenXVn6dqV016U9nMpQ6/w=";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    pyserial
+    click
+    ecdsa
+  ];
+
+  checkInputs = [
+    behave
+    nose
+  ];
+
+  preCheck = ''
+    mkdir test-reports
+  '';
+
+  pythonImportsCheck = [
+    "nordicsemi"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/adafruit/Adafruit_nRF52_nrfutil";
+    description = "Modified version of Nordic's nrfutil 0.5.x for use with the Adafruit Feather nRF52";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ stargate01 ];
+  };
+}
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..0cb34b22bd0b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/adafruit-platformdetect/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools-scm
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "adafruit-platformdetect";
+  version = "3.27.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "Adafruit-PlatformDetect";
+    inherit version;
+    hash = "sha256-HAymQ08RauE8oATYzKE+UaqMsmNK3O+VyLLd6w/jPFc=";
+  };
+
+  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";
+    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..d3712ba46c24
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/adafruit-pureio/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "Adafruit-PureIO";
+  version = "1.1.9";
+
+  src = fetchPypi {
+    pname = "Adafruit_PureIO";
+    inherit version;
+    sha256 = "0yd8hw676s7plq75gac4z0ilfcfydjkk3wv76bc73xy70zxj5brc";
+  };
+
+  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";
+    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..45c256b6647b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/adal/default.nix
@@ -0,0 +1,49 @@
+{ 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=";
+  };
+
+  propagatedBuildInputs = [
+    pyjwt
+    python-dateutil
+    requests
+  ];
+
+  checkInputs = [
+    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..315395522b8b
--- /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.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "Danielhiversen";
+    repo = "pyAdaxLocal";
+    rev = version;
+    hash = "sha256-pzhaBRCn02asT0ZLt1EmnaX2g5wr/CoiItWJ/ZYe0Ok=";
+  };
+
+  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..c7b0dcb45b31
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/adax/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, aiohttp
+, async-timeout
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "adax";
+  version = "0.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "Danielhiversen";
+    repo = "pyadax";
+    rev = version;
+    sha256 = "sha256-EMSX2acklwWOYiEeLHYG5mwdiGnWAUo5dGMiHCmZrko=";
+  };
+
+  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";
+    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..79fc34cc0ecb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/adb-enhanced/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, docopt
+, fetchFromGitHub
+, jdk11
+, psutil
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "adb-enhanced";
+  version = "2.5.14";
+
+  disabled = pythonOlder "3.4";
+
+  src = fetchFromGitHub {
+    owner = "ashishb";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-GaPOYBQEGI40MutjjY8exABqGge2p/buk9v+NcZ5oJs=";
+  };
+
+  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..ff49aec1fbbc
--- /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
+  ];
+
+  checkInputs = [ 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..383a3fe782b0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/adb-shell/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, aiofiles
+, buildPythonPackage
+, cryptography
+, fetchFromGitHub
+, isPy3k
+, libusb1
+, mock
+, pyasn1
+, pythonAtLeast
+, pycryptodome
+, pytestCheckHook
+, rsa
+}:
+
+buildPythonPackage rec {
+  pname = "adb-shell";
+  version = "0.4.3";
+  format = "setuptools";
+
+  disabled = !isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "JeffLIrion";
+    repo = "adb_shell";
+    rev = "v${version}";
+    hash = "sha256-+RU3nyJpHq0r/9erEbjUILpwIPWq14HdOX7LkSxySs4=";
+  };
+
+  propagatedBuildInputs = [
+    cryptography
+    pyasn1
+    rsa
+  ];
+
+  passthru.optional-dependencies = {
+    async = [
+      aiofiles
+    ];
+    usb = [
+      libusb1
+    ];
+  };
+
+  checkInputs = [
+    mock
+    pycryptodome
+    pytestCheckHook
+  ]
+  ++ passthru.optional-dependencies.async
+  ++ passthru.optional-dependencies.usb;
+
+  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..3c97f2ff802c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/adblock/default.nix
@@ -0,0 +1,81 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, buildPythonPackage
+, rustPlatform
+, pkg-config
+, openssl
+, publicsuffix-list
+, pythonOlder
+, libiconv
+, CoreFoundation
+, Security
+, pytestCheckHook
+, toml
+}:
+
+buildPythonPackage rec {
+  pname = "adblock";
+  version = "0.5.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  # Pypi only has binary releases
+  src = fetchFromGitHub {
+    owner = "ArniDagur";
+    repo = "python-adblock";
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-6FH+AVK7+Yg1a6oKbFV80TuGGE4Y7I3mMVzwVHdHYO4=";
+  };
+
+  cargoDeps = rustPlatform.fetchCargoTarball {
+    inherit src;
+    name = "${pname}-${version}";
+    hash = "sha256-JI/C+Woi/dJWUGUum8daecjFWiQgxY6BFYZ5MpTcRvU=";
+  };
+
+  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";
+
+  checkInputs = [
+    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/";
+    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..5b0131576cd3
--- /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 = "2.2.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "asottile";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-hJVVRhaElroZ1GVlbGK49gzts2tozLqp9xfoaPdbb3I=";
+  };
+
+  propagatedBuildInputs = [
+    tokenize-rt
+  ];
+
+  pythonImportsCheck = [
+    "add_trailing_comma"
+  ];
+
+  checkInputs = [
+    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..2bb531cff908
--- /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";
+  };
+
+  checkInputs = [ 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..7b10b0de1b62
--- /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
+  ];
+
+  checkInputs = [
+    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..134132f9931e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/adguardhome/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, aiohttp
+, aresponses
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, yarl
+}:
+
+buildPythonPackage rec {
+  pname = "adguardhome";
+  version = "0.5.1";
+  format = "pyproject";
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "frenck";
+    repo = "python-${pname}";
+    rev = "v${version}";
+    sha256 = "sha256-HAgt52Bo2NOUkpr5xvWTcRyrLKpfcBDlVAZxgDNI7hY=";
+  };
+
+  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
+  ];
+
+  checkInputs = [
+    aresponses
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "adguardhome" ];
+
+  meta = with lib; {
+    description = "Python client for the AdGuard Home API";
+    homepage = "https://github.com/frenck/python-adguardhome";
+    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..fd4fb79a5999
--- /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.7.3.1";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "Phlya";
+    repo = pname;
+    rev = version;
+    sha256 = "1a6hizx1cnplj0irn8idgda2lacsb61dw464cwx798pjr1gd401n";
+  };
+
+  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..c46ffb6f69fc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/adlfs/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, aiohttp
+, azure-core
+, azure-datalake-store
+, azure-identity
+, azure-storage-blob
+, buildPythonPackage
+, fetchFromGitHub
+, fsspec
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "adlfs";
+  version = "2022.7.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "fsspec";
+    repo = pname;
+    rev = version;
+    hash = "sha256-79HPJip+nocYo/r8LCb9vdYKVuEh0BBrz/eTJF0eGTA=";
+  };
+
+  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";
+    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..90c8645547fe
--- /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.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    pname = "advantage_air";
+    inherit version;
+    hash = "sha256-I9HMDLZX9xKDJuYSAweM2r4v3ZKevHTn5dHTYxN3EuE=";
+  };
+
+  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..7462dfb86837
--- /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}";
+    sha256 = "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..9c344f720aec
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aemet-opendata/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, geopy
+, requests
+, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "aemet-opendata";
+  version = "0.2.1";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "Noltari";
+    repo = "AEMET-OpenData";
+    rev = version;
+    sha256 = "0jl1897m3qmr48n469mq7d66k1j0rn7hlbcahm0ylf5i3ma03aiw";
+  };
+
+  propagatedBuildInputs = [
+    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";
+    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..8ebed55e1bc7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aenum/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, pyparsing
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "aenum";
+  version = "3.1.11";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-rtLCc1R65yoNXuhpcZwCpkPaFr9QfICVj6rcfgOOP3M=";
+  };
+
+  checkInputs = [
+    pyparsing
+  ];
+
+  # py2 likes to reorder tests
+  doCheck = isPy3k;
+
+  checkPhase = ''
+    runHook preCheck
+    ${python.interpreter} aenum/test.py
+    runHook postCheck
+  '';
+
+  pythonImportsCheck = [
+    "aenum"
+  ];
+
+  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..73c2da783d58
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aeppl/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, aesara
+, buildPythonPackage
+, fetchFromGitHub
+, numdifftools
+, numpy
+, pytestCheckHook
+, pythonOlder
+, scipy
+}:
+
+buildPythonPackage rec {
+  pname = "aeppl";
+  version = "0.0.33";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "aesara-devs";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-P4QgEt/QfIeCx/wpaCncXtjrDM2uiOIuObxPlTtn1CY=";
+  };
+
+  propagatedBuildInputs = [
+    aesara
+    numpy
+    scipy
+  ];
+
+  checkInputs = [
+    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";
+    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..5d91bc4de885
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aesara/default.nix
@@ -0,0 +1,87 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, cons
+, cython
+, etuples
+, fetchFromGitHub
+, filelock
+, jax
+, jaxlib
+, logical-unification
+, minikanren
+, numba
+, numba-scipy
+, numpy
+, pytestCheckHook
+, pythonOlder
+, scipy
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "aesara";
+  version = "2.7.9";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "aesara-devs";
+    repo = "aesara";
+    rev = "refs/tags/rel-${version}";
+    hash = "sha256-s7qqFSY4teL2uiGg6CkpPtr7lNNAj61nCn83Zr7/JaQ=";
+  };
+
+  nativeBuildInputs = [
+    cython
+  ];
+
+  propagatedBuildInputs = [
+    cons
+    etuples
+    filelock
+    logical-unification
+    minikanren
+    numpy
+    scipy
+    typing-extensions
+  ];
+
+  checkInputs = [
+    jax
+    jaxlib
+    numba
+    numba-scipy
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --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/"
+  ];
+
+  meta = with lib; {
+    broken = (stdenv.isLinux && stdenv.isAarch64);
+    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";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ Etjean ];
+  };
+}
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..b6b0dce3c24b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aesedb/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, aiowinreg
+, buildPythonPackage
+, colorama
+, fetchPypi
+, pycryptodomex
+, pythonOlder
+, tqdm
+, unicrypto
+}:
+
+buildPythonPackage rec {
+  pname = "aesedb";
+  version = "0.0.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-2m4VxqTD9zvUpZ1O8/SBprAzG4vUX4z3LthMpP5Hc8g=";
+  };
+
+  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";
+    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..29593503252a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/afdko/default.nix
@@ -0,0 +1,106 @@
+{ 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
+, antlr4_9
+, libxml2
+, pytestCheckHook
+# Enables some expensive tests, useful for verifying an update
+, runAllTests ? false
+, afdko
+}:
+
+buildPythonPackage rec {
+  pname = "afdko";
+  version = "3.9.0";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1fjsaz6bp028fbmry6fzfcih78mdzycqmky1wsz5y0bg4kfk4shh";
+  };
+
+  format = "pyproject";
+
+  nativeBuildInputs = [
+    setuptools-scm
+    scikit-build
+    cmake
+  ];
+
+  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
+
+    ./libxml2-cmake-find-package.patch
+  ];
+
+  # 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
+  ];
+
+  checkInputs = [ pytestCheckHook ];
+  preCheck = ''
+    export PATH=$PATH:$out/bin
+
+    # Update tests to match ufinormalizer-0.6.1 expectations:
+    #   https://github.com/adobe-type-tools/afdko/issues/1418
+    find tests -name layerinfo.plist -delete
+  '';
+  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_type1mm_inputs"
+  ];
+
+  passthru.tests = {
+    fullTestsuite = afdko.override { runAllTests = true; };
+  };
+
+  meta = with lib; {
+    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/libxml2-cmake-find-package.patch b/nixpkgs/pkgs/development/python-modules/afdko/libxml2-cmake-find-package.patch
new file mode 100644
index 000000000000..87604199d3e9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/afdko/libxml2-cmake-find-package.patch
@@ -0,0 +1,22 @@
+commit c423d1ddf0345aed7ecaf4c8b9e1fa5108aafc6f
+Author: sternenseemann <sternenseemann@systemli.org>
+Date:   Sat Jul 2 12:35:56 2022 +0200
+
+    Force use of CMake-shipped FindLibXml2 module
+    
+    This is needed to work around a nixpkgs bug:
+    https://github.com/NixOS/nixpkgs/issues/125008
+
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index a75b6fb1..c1408283 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -42,7 +42,7 @@ set(ANTLR4_TAG tags/4.9.3)
+ find_path(ANTLR4_HEADER antlr4-runtime.h PATH_SUFFIXES antlr4-runtime)
+ set(ANTLR4_INCLUDE_DIRS ${ANTLR4_HEADER})
+ 
+-FIND_PACKAGE(LibXml2)
++FIND_PACKAGE(LibXml2 REQUIRED MODULE)
+ IF (NOT ${LibXml2_FOUND})
+    MESSAGE(STATUS "Could not locate LibXml2, will install externally.")
+    set(LIBXML2_TAG tags/v2.9.13)
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..4b7696223a73
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/affine/default.nix
@@ -0,0 +1,22 @@
+{ buildPythonPackage, pytest, lib, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "affine";
+  version = "2.3.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-1nbeZhV61q+Z/9lOD1Tonfw1sPtyUurS7QrS3KQxvdA=";
+  };
+
+  checkInputs = [ pytest ];
+  checkPhase = "py.test";
+
+  meta = with lib; {
+    description = "Matrices describing affine transformation of the plane";
+    license = licenses.bsd3;
+    homepage = "https://github.com/sgillies/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..323c0a225312
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/afsapi/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, lxml
+, pytest-aiohttp
+, pytestCheckHook
+, pythonOlder
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "afsapi";
+  version = "0.2.7";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "wlcrs";
+    repo = "python-afsapi";
+    rev = "refs/tags/${version}";
+    hash = "sha256-TTZk/8mfG5lBr8SyMbqSaYDskWKnUlMkAUp94DXPCKo=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    lxml
+  ];
+
+  checkInputs = [
+    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";
+    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..d02d71d866f7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/agate-excel/default.nix
@@ -0,0 +1,26 @@
+{ lib, fetchPypi, buildPythonPackage
+, agate, openpyxl, xlrd, olefile, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "agate-excel";
+  version = "0.2.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "62315708433108772f7f610ca769996b468a4ead380076dbaf6ffe262831b153";
+  };
+
+  propagatedBuildInputs = [ agate openpyxl xlrd olefile ];
+
+  checkInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "agate" ];
+
+  meta = with lib; {
+    description = "Adds read support for excel files to agate";
+    homepage    = "https://github.com/wireservice/agate-excel";
+    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..827f73f27e7a
--- /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.5.8";
+
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "581e062ae878cc087d3d0948670d46b16589df0790bf814524b0587a359f2ada";
+  };
+
+  propagatedBuildInputs = [ agate sqlalchemy ];
+
+  checkInputs = [ 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..29f580636480
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/agate/default.nix
@@ -0,0 +1,73 @@
+{ lib
+, babel
+, buildPythonPackage
+, cssselect
+, fetchFromGitHub
+, glibcLocales
+, isodate
+, leather
+, lxml
+, nose
+, parsedatetime
+, PyICU
+, python-slugify
+, pytimeparse
+, pythonOlder
+, pytz
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "agate";
+  version = "1.6.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "wireservice";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-tuUoLvztCYHIPJTBgw1eByM0zfaHDyc+h7SWsxutKos=";
+  };
+
+  propagatedBuildInputs = [
+    babel
+    isodate
+    leather
+    parsedatetime
+    python-slugify
+    pytimeparse
+    six
+  ];
+
+  checkInputs = [
+    cssselect
+    glibcLocales
+    lxml
+    nose
+    PyICU
+    pytz
+  ];
+
+  postPatch = ''
+    # No Python 2 support, thus constraint is not needed
+    substituteInPlace setup.py \
+      --replace "'parsedatetime>=2.1,!=2.5,!=2.6'," "'parsedatetime>=2.1',"
+  '';
+
+  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";
+    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..7c4326db6415
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aggdraw/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, pytest
+, python
+, pillow
+, numpy
+}:
+
+buildPythonPackage rec {
+  pname = "aggdraw";
+  version = "1.3.15";
+
+  src = fetchFromGitHub {
+    owner = "pytroll";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-w3HlnsHYB0R+HZOXtzygC2RST3gllPI7SYtwSCVXhTU=";
+  };
+
+  checkInputs = [
+    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/ailment/default.nix b/nixpkgs/pkgs/development/python-modules/ailment/default.nix
new file mode 100644
index 000000000000..30c524ce9bce
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ailment/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pyvex
+}:
+
+buildPythonPackage rec {
+  pname = "ailment";
+  version = "9.2.14";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "angr";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-Axjyqn1TtZbYdgaC6hOhIQM3FBs0a1oHNK8wLuWQLHM=";
+  };
+
+  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..b0629483d014
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aio-geojson-client/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, aiohttp
+, aresponses
+, asynctest
+, buildPythonPackage
+, fetchFromGitHub
+, geojson
+, haversine
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aio-geojson-client";
+  version = "0.17";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "exxamalte";
+    repo = "python-aio-geojson-client";
+    rev = "v${version}";
+    hash = "sha256-5GiQgtbvYeleovFbXO2vlr2XPsDIWZiElM64O+urMcY=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    geojson
+    haversine
+  ];
+
+  checkInputs = [
+    aresponses
+    asynctest
+    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";
+    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..df13e8d7519a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aio-geojson-generic-client/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, aiohttp
+, aresponses
+, asynctest
+, buildPythonPackage
+, aio-geojson-client
+, fetchFromGitHub
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, pytz
+}:
+
+buildPythonPackage rec {
+  pname = "aio-geojson-generic-client";
+  version = "0.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "exxamalte";
+    repo = "python-aio-geojson-generic-client";
+    rev = "v${version}";
+    hash = "sha256-6Gc3SRRQiISBZnCg7a+rCQHR4NQipBHmG5gWZZXIsxY=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    aio-geojson-client
+    pytz
+  ];
+
+  checkInputs = [
+    aresponses
+    asynctest
+    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";
+    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..f3076160f9c6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aio-geojson-geonetnz-quakes/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, aio-geojson-client
+, aiohttp
+, aresponses
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-asyncio
+, pytestCheckHook
+, pytz
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aio-geojson-geonetnz-quakes";
+  version = "0.14";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "exxamalte";
+    repo = "python-aio-geojson-geonetnz-quakes";
+    rev = "v${version}";
+    hash = "sha256-T3vQodb0/3YEjsyHLSI8DBKK75J8hvsaBqyQI7GkT3U=";
+  };
+
+  propagatedBuildInputs = [
+    aio-geojson-client
+    aiohttp
+    pytz
+  ];
+
+  checkInputs = [
+    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/pythonaio-geojson-geonetnz-quakes";
+    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..3ba2b430801e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aio-geojson-geonetnz-volcano/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, aio-geojson-client
+, aiohttp
+, aresponses
+, asynctest
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-asyncio
+, pytestCheckHook
+, pytz
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aio-geojson-geonetnz-volcano";
+  version = "0.7";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "exxamalte";
+    repo = "python-aio-geojson-geonetnz-volcano";
+    rev = "v${version}";
+    sha256 = "sha256-2iVUHMk4ydmGmmGS6lJV5pvxJHyP9bRSeh/dOXbquE0=";
+  };
+
+  propagatedBuildInputs = [
+    aio-geojson-client
+    aiohttp
+    pytz
+  ];
+
+  checkInputs = [
+    aresponses
+    asynctest
+    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";
+    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..c790188ea269
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aio-geojson-nsw-rfs-incidents/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, aio-geojson-client
+, aiohttp
+, aresponses
+, asynctest
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-asyncio
+, pytestCheckHook
+, pytz
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aio-geojson-nsw-rfs-incidents";
+  version = "0.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "exxamalte";
+    repo = "python-aio-geojson-nsw-rfs-incidents";
+    rev = "v${version}";
+    sha256 = "sha256-rWlt4MYnuY+CzszFVDniWBnqpQW3WldSEl00ns3ko3U=";
+  };
+
+  propagatedBuildInputs = [
+    aio-geojson-client
+    aiohttp
+    pytz
+  ];
+
+  checkInputs = [
+    aresponses
+    asynctest
+    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";
+    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..0fde28910415
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aio-geojson-usgs-earthquakes/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, aio-geojson-client
+, aiohttp
+, aresponses
+, asynctest
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-asyncio
+, pytestCheckHook
+, pytz
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aio-geojson-usgs-earthquakes";
+  version = "0.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "exxamalte";
+    repo = "python-aio-geojson-usgs-earthquakes";
+    rev = "v${version}";
+    hash = "sha256-Hb0/BdK/jjxlPl9WJJpFdOCzZpZDCguXoGreGIyN8oo=";
+  };
+
+  propagatedBuildInputs = [
+    aio-geojson-client
+    aiohttp
+    pytz
+  ];
+
+  checkInputs = [
+    aresponses
+    asynctest
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  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";
+    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..f62c8b1bcfb7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aio-georss-client/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, aiohttp
+, aresponses
+, asynctest
+, buildPythonPackage
+, dateparser
+, fetchFromGitHub
+, haversine
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, requests
+, xmltodict
+}:
+
+buildPythonPackage rec {
+  pname = "aio-georss-client";
+  version = "0.10";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "exxamalte";
+    repo = "python-aio-georss-client";
+    rev = "v${version}";
+    sha256 = "sha256-g/BlRRBImJihVlAfSMsPIPV0GJns0/pStF8TKSxpDI4=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    haversine
+    xmltodict
+    requests
+    dateparser
+  ];
+
+  checkInputs = [
+    aresponses
+    asynctest
+    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";
+    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..96e105fab213
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aio-georss-gdacs/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, aio-georss-client
+, aresponses
+, buildPythonPackage
+, dateparser
+, fetchFromGitHub
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aio-georss-gdacs";
+  version = "0.7";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "exxamalte";
+    repo = "python-aio-georss-gdacs";
+    rev = "v${version}";
+    sha256 = "sha256-6z0l0PcFTQgOBj8cBgBMPJIqWG53u7h4WbYkBqU4FNE=";
+  };
+
+  propagatedBuildInputs = [
+    aio-georss-client
+    dateparser
+  ];
+
+  checkInputs = [
+    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";
+    license = with 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..61b67cb32a31
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioairzone/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aioairzone";
+  version = "0.4.9";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "Noltari";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-qG+EPZjH3I4TRGka7J21ukGpuJQfA/Nuy6DbIUnykcs=";
+  };
+
+  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";
+    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..01df805ab668
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioaladdinconnect/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aioaladdinconnect";
+  version = "0.1.41";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "AIOAladdinConnect";
+    inherit version;
+    hash = "sha256-o9dwGBMDL8kweqts4t73vxXQrVxYn9dBJDudpQNkKdo=";
+  };
+
+  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";
+    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..2396b24f6d9f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioambient/default.nix
@@ -0,0 +1,71 @@
+{ lib
+, aiohttp
+, aresponses
+, asynctest
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytest-aiohttp
+, pytest-asyncio
+, pytestCheckHook
+, python-engineio
+, python-socketio
+, pythonOlder
+, websockets
+}:
+
+buildPythonPackage rec {
+  pname = "aioambient";
+  version = "2021.12.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "bachya";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-nFCLMpkuSVPecKrtJ/z7KuyGw4Z9X79wKXmWsewbxvY=";
+  };
+
+  postPatch = ''
+    # https://github.com/bachya/aioambient/pull/97
+    substituteInPlace pyproject.toml \
+      --replace 'websockets = ">=8.1,<10.0"' 'websockets = ">=8.1,<11.0"'
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    python-engineio
+    python-socketio
+    websockets
+  ];
+
+  checkInputs = [
+    aresponses
+    asynctest
+    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";
+    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..5d8c934e4275
--- /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; [ costrouc ];
+  };
+}
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..0a9b8fffae74
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioapns/default.nix
@@ -0,0 +1,35 @@
+{ buildPythonPackage
+, fetchPypi
+, h2
+, lib
+, pyjwt
+, pyopenssl
+}:
+
+buildPythonPackage rec {
+  pname = "aioapns";
+  version = "2.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "2ce526910bc2514a84b8105abe80508526ceafc0097c89f86bbbc501f8666c99";
+  };
+
+  propagatedBuildInputs = [
+    h2
+    pyopenssl
+    pyjwt
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "aioapns" ];
+
+  meta = with lib; {
+    description = "An efficient APNs Client Library for Python/asyncio";
+    homepage = "https://github.com/Fatal1ty/aioapns";
+    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..1c31dac5f596
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioaseko/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aioaseko";
+  version = "0.0.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "milanmeu";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-nJRVNBYfBcLYnBsTpQZYMHYWh0+hQObVKJ7sOXFwDjc=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  # 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";
+    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..c2a8bded2b6b
--- /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
+  ];
+
+  checkInputs = [
+    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..4c8cd7a45dc8
--- /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;
+    sha256 = "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/aiobiketrax/default.nix b/nixpkgs/pkgs/development/python-modules/aiobiketrax/default.nix
new file mode 100644
index 000000000000..41e96f26cc52
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiobiketrax/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, aiohttp
+, auth0-python
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pyjwt
+, pytest-aiohttp
+, pytestCheckHook
+, python-dateutil
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aiobiketrax";
+  version = "0.2.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "basilfx";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-zaHetU0ZG3xkYrO6qA4o+NX8V5td/E08tPEohEwMjh0=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    auth0-python
+    python-dateutil
+    pyjwt
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "aiobiketrax"
+  ];
+
+  meta = with lib; {
+    description = "Library for interacting with the PowUnity BikeTrax GPS tracker";
+    homepage = "https://github.com/basilfx/aiobiketrax";
+    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..462a4088f660
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioblescan/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aioblescan";
+  version = "0.2.13";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "frawau";
+    repo = pname;
+    rev = version;
+    hash = "sha256-n1FiBsuVpVJrIq6+kuMNugpEaUOFQ/Gk/QU7Hry4YrU=";
+  };
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "aioblescan"
+  ];
+
+  meta = with lib; {
+    description = "Library to listen for BLE advertized packets";
+    homepage = "https://github.com/frawau/aioblescan";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..81977915fd52
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiobotocore/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, wrapt
+, aioitertools
+, aiohttp
+, botocore
+}:
+
+buildPythonPackage rec {
+  pname = "aiobotocore";
+  version = "2.3.4";
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-ZVTr6ldk9m9L5USk/KoJU+6A5gDde9gYukiT1yvxK/s=";
+  };
+
+  # 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 = [ wrapt aiohttp aioitertools botocore ];
+
+  # tests not distributed on pypi
+  doCheck = false;
+  pythonImportsCheck = [ "aiobotocore" ];
+
+  meta = with lib; {
+    description = "Python client for amazon services";
+    license = licenses.asl20;
+    homepage = "https://github.com/aio-libs/aiobotocore";
+    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..d921f3c08049
--- /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;
+    sha256 = "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..54979dbd7ba4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiocache/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, aioredis
+, buildPythonPackage
+, fetchFromGitHub
+, msgpack
+}:
+
+buildPythonPackage rec {
+  pname = "aiocache";
+  version = "0.11.1";
+
+  src = fetchFromGitHub {
+    owner = "aio-libs";
+    repo = pname;
+    rev = version;
+    sha256 = "1czs8pvhzi92qy2dch2995rb62mxpbhd80dh2ir7zpa9qcm6wxvx";
+  };
+
+  propagatedBuildInputs = [
+    aioredis
+    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/tomasbasham/ratelimit";
+    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..db9cb191c9cf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiocoap/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pygments
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aiocoap";
+  version = "0.4.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "chrysn";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-m/tU1qf+CB9/2eoXktpBSgwjj8lMuMQ/WGYL6HhMNxA=";
+  };
+
+  propagatedBuildInputs = [
+    pygments
+  ];
+
+  checkInputs = [
+    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/";
+    license = with licenses; [ mit ];
+    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..4156d799ad74
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioconsole/default.nix
@@ -0,0 +1,57 @@
+{ 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.5.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "vxgmichel";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-/20FR7yc2aMA9cL3l7XAL/kak3cBBTniAICLC/TOI+U=";
+  };
+
+  checkInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "--cov aioconsole --count 2" ""
+  '';
+
+  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..dc70baab9e5c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiocontextvars/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-runner
+, pytest
+, pytest-asyncio
+, contextvars
+, sqlalchemy
+, isPy27
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aiocontextvars";
+  version = "0.2.2";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "fantix";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0a2gmrm9csiknc8n3si67sgzffkydplh9d7ga1k87ygk2aj22mmk";
+  };
+
+  buildInputs = [
+    pytest-runner
+  ];
+
+  checkInputs = [
+    pytest
+    pytest-asyncio
+  ];
+
+  propagatedBuildInputs = [
+    sqlalchemy
+  ] ++ lib.optionals (pythonOlder "3.7") [ contextvars ];
+
+  checkPhase = ''
+    pytest
+  '';
+
+  meta = with lib; {
+    description = "Asyncio support for PEP-567 contextvars backport";
+    homepage = "https://github.com/fantix/aiocontextvars";
+    license = licenses.bsd3;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..56f3561d84f3
--- /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;
+    sha256 = "sha256-SFRlE/ry63kB5lpk66e2U8gBBu0A7ZyjQZw9ELZVWgE=";
+  };
+
+  propagatedBuildInputs = [
+    croniter
+    tzlocal
+  ];
+
+  checkInputs = [
+    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/aiocurrencylayer/default.nix b/nixpkgs/pkgs/development/python-modules/aiocurrencylayer/default.nix
new file mode 100644
index 000000000000..0eb84fdba662
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiocurrencylayer/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, httpx
+, poetry-core
+, pytest-asyncio
+, pytest-httpx
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aiocurrencylayer";
+  version = "1.0.3";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "home-assistant-ecosystem";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-t2Pcoakk25vtUYajIZVITsrEUSdwwiA3fbdswy3n9P8=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    httpx
+  ];
+
+  checkInputs = [
+    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";
+    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..d8fb5c6b38b6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiodiscover/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, dnspython
+, fetchFromGitHub
+, ifaddr
+, netifaces
+, pyroute2
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aiodiscover";
+  version = "1.4.11";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "bdraco";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-s5g8otQSWTAOkN4q1LrM/FxVlOnGSv8XKtIDkdwcHMg=";
+  };
+
+  propagatedBuildInputs = [
+    dnspython
+    netifaces
+    pyroute2
+    ifaddr
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace '"pytest-runner>=5.2",' "" \
+      --replace "pyroute2>=0.5.18,!=0.6.1" "pyroute2"
+  '';
+
+  checkInputs = [
+    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";
+    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..9c626618ff0a
--- /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.optional (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/aioeafm/default.nix b/nixpkgs/pkgs/development/python-modules/aioeafm/default.nix
new file mode 100644
index 000000000000..d8b8c11cef99
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioeafm/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, poetry
+, 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";
+  };
+
+  nativeBuildInputs = [ poetry ];
+
+  propagatedBuildInputs = [ aiohttp ];
+
+  checkInputs = [
+    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..32a6152efc12
--- /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 = "2022.7.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "home-assistant-libs";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-GALBhapE31CM2mqBrgcdQf5SJV+edN3kj35r0cf7BcU=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    meteocalc
+  ];
+
+  checkInputs = [
+    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/aioemonitor/default.nix b/nixpkgs/pkgs/development/python-modules/aioemonitor/default.nix
new file mode 100644
index 000000000000..e78cb83b3f4c
--- /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
+  ];
+
+  checkInputs = [
+    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..5afbf32310c7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioesphomeapi/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, mock
+, noiseprotocol
+, protobuf
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, zeroconf
+}:
+
+buildPythonPackage rec {
+  pname = "aioesphomeapi";
+  version = "10.11.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "esphome";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-Wb46t+bdXGDYKzMr73YNWw1ULSLEV1xFcK16jHITnRg=";
+  };
+
+  propagatedBuildInputs = [
+    noiseprotocol
+    protobuf
+    zeroconf
+  ];
+
+  checkInputs = [
+    mock
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "aioesphomeapi"
+  ];
+
+  meta = with lib; {
+    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..cc1ebe3f6178
--- /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 ];
+
+  checkInputs = [ 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/aiofiles/default.nix b/nixpkgs/pkgs/development/python-modules/aiofiles/default.nix
new file mode 100644
index 000000000000..592f8facaebb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiofiles/default.nix
@@ -0,0 +1,54 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aiofiles";
+  version = "0.8.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "Tinche";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-V7F+xalFGMgTgT30Gmd9FVV3cPndI/i9cB5vEuW/KVc=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  checkInputs = [
+    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 = {
+    description = "File support for asyncio";
+    homepage = "https://github.com/Tinche/aiofiles";
+    license = with lib.licenses; [ asl20 ];
+    maintainers = with lib.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..70b41a0af310
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioflo/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, aiohttp
+, aresponses
+, buildPythonPackage
+, fetchFromGitHub
+, 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;
+    sha256 = "sha256-7NrOoc1gi8YzZaKvCnHnzAKPlMnMhqxjdyZGN5H/8TQ=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  checkInputs = [
+    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..8f0ef50e7fd0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioftp/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, stdenv
+, async-timeout
+, buildPythonPackage
+, fetchPypi
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, siosocks
+, trustme
+}:
+
+buildPythonPackage rec {
+  pname = "aioftp";
+  version = "0.21.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-xtrlCzqgfwlbLZOoN9Y23ZPyNaqv5Ure+Cvg+OVWf9I=";
+  };
+
+  propagatedBuildInputs = [
+    siosocks
+  ];
+
+  checkInputs = [
+    async-timeout
+    pytest-asyncio
+    pytestCheckHook
+    trustme
+  ];
+
+  pytestFlagsArray = [
+    "--asyncio-mode=legacy"
+  ];
+
+  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; [ costrouc ];
+  };
+}
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..38bd95989f6a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiogithubapi/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, aiohttp
+, aresponses
+, async-timeout
+, backoff
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aiogithubapi";
+  version = "22.3.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "ludeeus";
+    repo = pname;
+    rev = version;
+    hash = "sha256-5gKANZtDhIoyfyLdS15JDWTxHBFkaHDUlbVVhRs7MSE=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    async-timeout
+    backoff
+  ];
+
+  checkInputs = [
+    aresponses
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  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}"'
+  '';
+
+  pythonImportsCheck = [
+    "aiogithubapi"
+  ];
+
+  meta = with lib; {
+    description = "Python client for the GitHub API";
+    homepage = "https://github.com/ludeeus/aiogithubapi";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..511400ccfc59
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioguardian/default.nix
@@ -0,0 +1,72 @@
+{ lib
+, aiohttp
+, async-timeout
+, asyncio-dgram
+, asynctest
+, buildPythonPackage
+, docutils
+, fetchFromGitHub
+, poetry-core
+, pytest-aiohttp
+, pytest-asyncio
+, pytestCheckHook
+, voluptuous
+}:
+
+buildPythonPackage rec {
+  pname = "aioguardian";
+  version = "2022.07.0";
+
+  src = fetchFromGitHub {
+    owner = "bachya";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-87MumQ6MuhRRDHrcH1nmOPviKDaT4crYnq5Pd26qsLw=";
+  };
+
+  format = "pyproject";
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    async-timeout
+    asyncio-dgram
+    docutils
+    voluptuous
+  ];
+
+  checkInputs = [
+    asyncio-dgram
+    asynctest
+    pytest-aiohttp
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'docutils = "<0.18"' 'docutils = "*"'
+  '';
+
+  disabledTestPaths = [
+    "examples/"
+  ];
+
+  pythonImportsCheck = [
+    "aioguardian"
+  ];
+
+  meta = with lib; {
+    description = " Python library to interact with Elexa Guardian devices";
+    longDescription = ''
+      aioguardian is a Pytho3, asyncio-focused library for interacting with the
+      Guardian line of water valves and sensors from Elexa.
+    '';
+    homepage = "https://github.com/bachya/aioguardian";
+    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..6e77c5589ec0
--- /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.9";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-T30pLzPWD+5pb0ShkpNdiBFO45RdiMYgCOSg8rx+t+Y=";
+  };
+
+  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..bd223d437dd9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiohomekit/default.nix
@@ -0,0 +1,73 @@
+{ lib
+, buildPythonPackage
+, aiocoap
+, bleak
+, bleak-retry-connector
+, chacha20poly1305-reuseable
+, commentjson
+, cryptography
+, fetchFromGitHub
+, orjson
+, poetry-core
+, pytest-aiohttp
+, pytestCheckHook
+, pythonOlder
+, zeroconf
+}:
+
+buildPythonPackage rec {
+  pname = "aiohomekit";
+  version = "1.2.11";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "Jc2k";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-A/exf2XTlogowdeFLmxO/P7JeGIE8CDsOX9tR0HOXws=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiocoap
+    bleak
+    bleak-retry-connector
+    chacha20poly1305-reuseable
+    commentjson
+    cryptography
+    orjson
+    zeroconf
+  ];
+
+  doCheck = lib.versionAtLeast pytest-aiohttp.version "1.0.0";
+
+  checkInputs = [
+    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";
+    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..df8c1fffdb91
--- /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
+  ];
+
+  checkInputs = [
+    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-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-jinja2/default.nix b/nixpkgs/pkgs/development/python-modules/aiohttp-jinja2/default.nix
new file mode 100644
index 000000000000..3e3148fce7c2
--- /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";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-fDul6sBgtpH05QU0ry15/KKnVxLr0rJeb8sSlYWfkQs=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    jinja2
+  ];
+
+  checkInputs = [
+    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; [ peterhoeg ];
+  };
+}
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..4b150b9edeae
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiohttp-remotes/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchPypi
+, pytest-aiohttp
+, pytestCheckHook
+, pythonOlder
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "aiohttp-remotes";
+  version = "1.2.0";
+  format = "flit";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    pname = "aiohttp_remotes";
+    inherit version;
+    sha256 = "f95c3a6be5e2de746a85ce9af49ec548da6db8378d7e81bb171ec77b13562a6c";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ] ++ lib.optionals (pythonOlder "3.7") [
+    typing-extensions
+  ];
+
+  checkInputs = [
+    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..0cf747e70ba0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiohttp-retry/default.nix
@@ -0,0 +1,47 @@
+{ 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
+  ];
+
+  checkInputs = [
+    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..2a6e8b2c1b86
--- /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.7.1";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "aiohttp_socks";
+    sha256 = "2215cac4891ef3fa14b7d600ed343ed0f0a670c23b10e4142aa862b3db20341a";
+  };
+
+  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..a8e3499ee584
--- /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
+  ];
+
+  checkInputs = [
+    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..1f01a7b57e5a
--- /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}";
+    sha256 = "sha256-3Q00FidZWV1KueuHyHKQf1PsDJGOaRW6v/kBy7lzD4Q=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  checkInputs = [
+    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..bca1f6002f4e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiohttp/default.nix
@@ -0,0 +1,113 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+# install_requires
+, attrs
+, charset-normalizer
+, multidict
+, async-timeout
+, yarl
+, frozenlist
+, aiosignal
+, aiodns
+, brotli
+, cchardet
+, asynctest
+, typing-extensions
+, idna-ssl
+# tests_require
+, async_generator
+, freezegun
+, gunicorn
+, pytest-mock
+, pytestCheckHook
+, re-assert
+, trustme
+}:
+
+buildPythonPackage rec {
+  pname = "aiohttp";
+  version = "3.8.1";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "fc5471e1a54de15ef71c1bc6ebe80d4dc681ea600e68bfd1cbce40427f0b7578";
+  };
+
+  postPatch = ''
+    sed -i '/--cov/d' setup.cfg
+  '';
+
+  propagatedBuildInputs = [
+    attrs
+    charset-normalizer
+    multidict
+    async-timeout
+    yarl
+    typing-extensions
+    frozenlist
+    aiosignal
+    aiodns
+    brotli
+    cchardet
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    asynctest
+    typing-extensions
+  ] ++ lib.optionals (pythonOlder "3.7") [
+    idna-ssl
+  ];
+
+  checkInputs = [
+    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"
+  ] ++ 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; {
+    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..657ebc1aa9a1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiohue/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, aiohttp
+, asyncio-throttle
+, awesomeversion
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aiohue";
+  version = "4.5.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "home-assistant-libs";
+    repo = pname;
+    rev = version;
+    hash = "sha256-Lcs+Ieh5TEUE+sHqFAZr9rsAZMsI9t2/w87r36IUa1A=";
+  };
+
+  propagatedBuildInputs = [
+    awesomeversion
+    aiohttp
+    asyncio-throttle
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  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";
+    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..3e7c4c7b85a5
--- /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;
+    sha256 = "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..97e21dc61522
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioimaplib/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, pythonOlder
+, pythonAtLeast
+, asynctest
+, buildPythonPackage
+, docutils
+, fetchFromGitHub
+, imaplib2
+, mock
+, nose
+, pyopenssl
+, pytestCheckHook
+, pytz
+, tzlocal
+}:
+
+buildPythonPackage rec {
+  pname = "aioimaplib";
+  version = "1.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "bamthomas";
+    repo = pname;
+    rev = version;
+    hash = "sha256-7Ta0BhtQSm228vvUa5z+pzM3UC7+BskgBNjxsbEb9P0=";
+  };
+
+  checkInputs = [
+    asynctest
+    docutils
+    imaplib2
+    mock
+    nose
+    pyopenssl
+    pytestCheckHook
+    pytz
+    tzlocal
+  ];
+
+  disabledTests = [
+    # https://github.com/bamthomas/aioimaplib/issues/77
+    "test_get_quotaroot"
+  ];
+
+  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..451fb9e7fa10
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioitertools/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchpatch
+, fetchPypi
+, pythonAtLeast
+, pythonOlder
+
+# native
+, flit-core
+
+# propagates
+, typing-extensions
+
+# tests
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "aioitertools";
+  version = "0.10.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-fR0dSgPUYsWghAeH098JjxJYR+DTi4M7MPj4y8RaFCA=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = lib.optionals (pythonOlder "3.10") [
+    typing-extensions
+  ];
+
+  pythonImportsCheck = [
+    "aioitertools"
+  ];
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest discover
+  '';
+
+  meta = with lib; {
+    description = "Implementation of itertools, builtins, and more for AsyncIO and mixed-type iterables";
+    license = licenses.mit;
+    homepage = "https://pypi.org/project/aioitertools/";
+    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..0ae7c3e8a06c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiojobs/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, aiohttp
+, pytestCheckHook
+, pytest-aiohttp
+, pygments
+}:
+
+buildPythonPackage rec {
+  pname = "aiojobs";
+  version = "1.0.0";
+  format = "flit";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "aio-libs";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "EQwD0b2B9qFVd/8thKInaio0hpPzvVIjvCN0TcARu2w=";
+  };
+
+  nativeBuildInputs = [
+    pygments
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    pytest-aiohttp
+  ];
+
+  pythonImportsCheck = [
+    "aiojobs"
+  ];
+
+  meta = with lib; {
+    description = "Jobs scheduler for managing background task (asyncio)";
+    homepage = "https://github.com/aio-libs/aiojobs";
+    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..c853b1d25a35
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiokafka/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, dataclasses
+, kafka-python
+, cython
+, zlib
+}:
+
+buildPythonPackage rec {
+  pname = "aiokafka";
+  version = "0.7.2";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "aio-libs";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-D+91k4zVg28qPbWIrvyXi6WtDs1jeJt9jFGsrSBA3cs=";
+  };
+
+  nativeBuildInputs = [
+    cython
+  ];
+
+  buildInputs = [
+    zlib
+  ];
+
+  propagatedBuildInputs = [
+    kafka-python
+  ] ++ lib.optionals (pythonOlder "3.7") [
+    dataclasses
+  ];
+
+  # checks require running kafka server
+  doCheck = false;
+
+  pythonImportsCheck = [ "aiokafka" ];
+
+  meta = with lib; {
+    description = "Kafka integration with asyncio";
+    homepage = "https://aiokafka.readthedocs.org";
+    license = licenses.asl20;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..c153ff37d8c2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiokef/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, async-timeout
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-cov
+, pytestCheckHook
+, pytest-mypy
+, 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";
+  };
+
+  propagatedBuildInputs = [
+    async-timeout
+    tenacity
+  ];
+
+  checkInputs = [
+    pytest-cov
+    pytest-mypy
+    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..201fdb32a0be
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiolifx-effects/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, isPy3k
+, aiolifx
+}:
+
+buildPythonPackage rec {
+  pname = "aiolifx-effects";
+  version = "0.2.2";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit version;
+    pname = "aiolifx_effects";
+    sha256 = "sha256-qkXJDYdJ+QyQWn/u7g6t4QJG1uSqle+a5RhTkPPsHKo=";
+  };
+
+  propagatedBuildInputs = [ aiolifx ];
+
+  # tests are not implemented
+  doCheck = false;
+
+  pythonImportsCheck = [ "aiolifx_effects" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/amelchio/aiolifx_effects";
+    license = licenses.mit;
+    description = "Light effects (pulse, colorloop ...) for LIFX lights running on aiolifx";
+    maintainers = with maintainers; [ netixx ];
+  };
+}
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..62aeb1fd9996
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiolifx/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, pythonOlder
+, ifaddr
+, bitstring
+}:
+
+buildPythonPackage rec {
+  pname = "aiolifx";
+  version = "0.8.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-k47cXi2CDtFIV3gzfdYU4i17ry0ABXcWK5CcWhwTdT0=";
+  };
+
+  propagatedBuildInputs = [
+    bitstring
+    ifaddr
+  ];
+
+  # tests are not implemented
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "aiolifx"
+  ];
+
+  meta = with lib; {
+    description = "Module for local communication with LIFX devices over a LAN";
+    homepage = "https://github.com/frawau/aiolifx";
+    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..9f8f81e2fca8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiolimiter/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, poetry-core
+, importlib-metadata
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, toml
+}:
+
+buildPythonPackage rec {
+  pname = "aiolimiter";
+  version = "1.0.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "mjpieters";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-4wByVZoOLhrXFx9oK19GBmRcjGoJolQ3Gwx9vQV/n8s=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  checkInputs = [
+    pytest-asyncio
+    pytestCheckHook
+    toml
+  ];
+
+  patches = [
+    # Switch to poetry-core, https://github.com/mjpieters/aiolimiter/pull/77
+    (fetchpatch {
+      name = "switch-to-peotry-core.patch";
+      url = "https://github.com/mjpieters/aiolimiter/commit/84a85eff42621b0daff8fcf6bb485db313faae0b.patch";
+      sha256 = "sha256-xUfJwLvMF2Xt/V1bKBFn/fjn1uyw7bGNo9RpWxtyr50=";
+    })
+  ];
+
+  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";
+    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..80e110cbd8f0
--- /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";
+  };
+
+  checkInputs = [
+    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/aiolookin/default.nix b/nixpkgs/pkgs/development/python-modules/aiolookin/default.nix
new file mode 100644
index 000000000000..f0b5e145d8ba
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiolookin/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, faker
+, fetchFromGitHub
+, pytest-aiohttp
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aiolookin";
+  version = "0.1.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "ANMalko";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-xFxkhKM/lX/kSg709wID7HlkfNKDlOcL3STUZOrHZJ8=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  checkInputs = [
+    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";
+    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..855748f665cf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiolyric/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "aiolyric";
+  version = "1.0.10";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "timmo001";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-yKeG0UCQ8haT1hvywoIwKQ519GK2wFg0wXaRTFeKYIk=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # AssertionError, https://github.com/timmo001/aiolyric/issues/5
+    "test_location"
+  ];
+
+  pythonImportsCheck = [
+    "aiolyric"
+  ];
+
+  meta = with lib; {
+    description = "Python module for the Honeywell Lyric Platform";
+    homepage = "https://github.com/timmo001/aiolyric";
+    license = with licenses; [ mit ];
+    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..ef3f86ad331d
--- /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}";
+    sha256 = "sha256-Vx51WBjjNPIfLlwMnAuwHnGNljhnjKkU0tWB9M9rjsw=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    backoff
+    yarl
+  ];
+
+  checkInputs = [
+    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/aiomultiprocess/default.nix b/nixpkgs/pkgs/development/python-modules/aiomultiprocess/default.nix
new file mode 100644
index 000000000000..6403f396eaac
--- /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}";
+    sha256 = "sha256-yOP69FXDb2Grmtszx7oa6uiJGUar8su3KwqQPI+xjrw=";
+  };
+
+  nativeBuildInputs = [ flit-core ];
+
+  checkInputs = [ 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..470e84eb6cce
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiomusiccast/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, poetry-core
+, aiohttp
+}:
+
+buildPythonPackage rec {
+  pname = "aiomusiccast";
+  version = "0.14.5";
+
+  format = "pyproject";
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "vigonotion";
+    repo = "aiomusiccast";
+    rev = "refs/tags/${version}";
+    hash = "sha256-YssBrG4sFtQtrzKU/O/tWEVL9eq8dpszejY/1So5Mec=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace '"0.0.0"' '"${version}"'
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  # 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";
+    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..dfa02c979433
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiomysensors/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, aiofiles
+, asyncio-mqtt
+, awesomeversion
+, buildPythonPackage
+, click
+, fetchFromGitHub
+, marshmallow
+, poetry-core
+, pyserial-asyncio
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aiomysensors";
+  version = "0.3.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "MartinHjelmare";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-EGVoHEJrpGtp8OrhQhRZVaN1GhL4QCo/azp6pzgYYcs=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiofiles
+    asyncio-mqtt
+    awesomeversion
+    click
+    marshmallow
+    pyserial-asyncio
+  ];
+
+  checkInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace " --cov=src --cov-report=term-missing:skip-covered" "" \
+      --replace 'marshmallow = "^3.17"' 'marshmallow = "*"'
+  '';
+
+  pythonImportsCheck = [
+    "aiomysensors"
+  ];
+
+  meta = with lib; {
+    description = "Library to connect to MySensors gateways";
+    homepage = "https://github.com/MartinHjelmare/aiomysensors";
+    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..420b3aaf8b9c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiomysql/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pymysql
+, pythonOlder
+, setuptools-scm
+, setuptools-scm-git-archive
+}:
+
+buildPythonPackage rec {
+  pname = "aiomysql";
+  version = "0.1.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "aio-libs";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-rYEos2RuE2xI59httYlN21smBH4/fU4uT48FWwrI6Qg=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+    setuptools-scm-git-archive
+  ];
+
+  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; [ costrouc ];
+  };
+}
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..40686bf7d113
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aionanoleaf/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aionanoleaf";
+  version = "0.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "milanmeu";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-bz568DlodWtSu2WTTd/QMhdiX9IkllW7UYVXuNlKFaY=";
+  };
+
+  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";
+    license = licenses.lgpl3Plus;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aionotify/default.nix b/nixpkgs/pkgs/development/python-modules/aionotify/default.nix
new file mode 100644
index 000000000000..13ae51d25227
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aionotify/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, asynctest
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aionotify";
+  version = "0.2.0";
+
+  src = fetchFromGitHub {
+    owner = "rbarrois";
+    repo = "aionotify";
+    rev = "v${version}";
+    sha256 = "1sk9i8czxgsbrswsf1nlb4c82vgnlzi8zrvrxdip92w2z8hqh43y";
+  };
+
+  disabled = pythonOlder "3.5";
+
+  preCheck = ''
+    substituteInPlace tests/test_usage.py \
+      --replace "asyncio.wait_for(task, timeout, loop=self.loop)" "asyncio.wait_for(task, timeout)"
+  '';
+
+  checkInputs = [
+    asynctest
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/rbarrois/aionotify";
+    description = "Simple, asyncio-based inotify library for Python";
+    license = with lib.licenses; [ bsd2 ];
+    platforms = platforms.linux;
+    maintainers = with lib.maintainers; [ ];
+  };
+}
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..4e161ba6804b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aionotion/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, aiohttp
+, aresponses
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytest-aiohttp
+, pytest-asyncio
+, pytest-cov
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aionotion";
+  version = "2021.10.0";
+  format = "pyproject";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "bachya";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-5bu2XveDi2e6lGdI/T+0apqXzcnqdztVtaHEpp+Vkzs=";
+  };
+
+  nativeBuildInputs = [ poetry-core ];
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  checkInputs = [
+    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..728c28eddd88
--- /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.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "bdraco";
+    repo = pname;
+    rev = version;
+    hash = "sha256-/Db32OomEkrBtq5lfT8zBGgvaUWnWE/sTqwNVNB9XAg=";
+  };
+
+  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..18b6ae78b6f2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioopenexchangerates/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, aiohttp
+, aioresponses
+, pydantic
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytest-aiohttp
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aioopenexchangerates";
+  version = "0.4.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "MartinHjelmare";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-qm9B4m5CLhfqnZj+sdHZ+iA0+YnDR9Dh3lCy/YADkEI=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    pydantic
+  ];
+
+  checkInputs = [
+    aioresponses
+    pytest-aiohttp
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace " --cov=aioopenexchangerates --cov-report=term-missing:skip-covered" ""
+  '';
+
+  pythonImportsCheck = [
+    "aioopenexchangerates"
+  ];
+
+  meta = with lib; {
+    description = "Library for the Openexchangerates API";
+    homepage = "https://github.com/MartinHjelmare/aioopenexchangerates";
+    license = with 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..b78a552f01fa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiopg/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, async-timeout
+, buildPythonPackage
+, fetchFromGitHub
+, psycopg2
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aiopg";
+  version = "1.3.4";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "aio-libs";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-WzyBgUxqxLvyNNMoRO2FuLxAyNvhBrA7U5eZqHxaL4Q=";
+  };
+
+  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..a4571a79b05d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioprocessing/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aioprocessing";
+  version = "2.0.0";
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "469dfb746e8c4e0c727ba135cfabf9e034c554f6a73c27f908bfe3625dd74b9e";
+  };
+
+  # Tests aren't included in pypi package
+  doCheck = false;
+
+  pythonImportsCheck = [ "aioprocessing" ];
+
+  meta = {
+    description = "A library that integrates the multiprocessing module with asyncio";
+    homepage = "https://github.com/dano/aioprocessing";
+    license = lib.licenses.bsd2;
+    maintainers = with lib.maintainers; [ uskudnik ];
+  };
+}
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..c2d4add41dac
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiopulse/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, async-timeout
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aiopulse";
+  version = "0.4.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-Wp8NUjRlO+6ASqIt3C0YJRh0EKcEukXVMp4I+TCTElo=";
+  };
+
+  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";
+    license = with licenses; [ asl20 ];
+    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..3aa3116b0f5e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiopvapi/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, aiohttp
+, async-timeout
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aiopvapi";
+  version = "1.6.19";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "sander76";
+    repo = "aio-powerview-api";
+    # no tags on git, no sdist on pypi: https://github.com/sander76/aio-powerview-api/issues/12
+    rev = "89711e2a0cb4640eb458767d289dcfa3acafb10f";
+    sha256 = "18gbz9rcf183syvxvvhhl62af3b7463rlqxxs49w4m805hkvirdp";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    async-timeout
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    # async_timeout 4.0.0 removes loop, https://github.com/sander76/aio-powerview-api/pull/13
+    # Patch doesn't apply due to different line endings
+    substituteInPlace aiopvapi/helpers/aiorequest.py \
+      --replace ", loop=self.loop)" ")"
+  '';
+
+  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..032bf995a7d4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiopvpc/default.nix
@@ -0,0 +1,69 @@
+{ lib
+, aiohttp
+, async-timeout
+, backports-zoneinfo
+, buildPythonPackage
+, fetchFromGitHub
+, holidays
+, poetry-core
+, pytest-asyncio
+, pytest-timeout
+, pytestCheckHook
+, pythonOlder
+, tzdata
+}:
+
+buildPythonPackage rec {
+  pname = "aiopvpc";
+  version = "3.0.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "azogue";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-eTCQddoZIaCs7iKGNBC8aSq6ek4vwYXgIXx35UlME/k=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    holidays
+    tzdata
+    async-timeout
+  ] ++ lib.optionals (pythonOlder "3.9") [
+    backports-zoneinfo
+  ];
+
+  checkInputs = [
+    pytest-asyncio
+    pytest-timeout
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Failures seem related to changes in holidays-0.13, https://github.com/azogue/aiopvpc/issues/44
+    "test_number_of_national_holidays"
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml --replace \
+      " --cov --cov-report term --cov-report html" ""
+  '';
+
+  pythonImportsCheck = [
+    "aiopvpc"
+  ];
+
+  meta = with lib; {
+    description = "Python module to download Spanish electricity hourly prices (PVPC)";
+    homepage = "https://github.com/azogue/aiopvpc";
+    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..a2e66b42af74
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiopyarr/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, aiohttp
+, aresponses
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aiopyarr";
+  version = "22.7.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "tkdrob";
+    repo = pname;
+    rev = version;
+    hash = "sha256-ALFaWy/wY8PTuMixHEWaXXmKNSLf9Cm2pgffVHnAWLg=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  checkInputs = [
+    aresponses
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "aiopyarr"
+  ];
+
+  meta = with lib; {
+    description = "Python API client for Lidarr/Radarr/Readarr/Sonarr";
+    homepage = "https://github.com/tkdrob/aiopyarr";
+    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..ad089ef708e7
--- /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;
+    sha256 = "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..4bc5ae32d753
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioqsw/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aioqsw";
+  version = "0.1.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "Noltari";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-ASFdV/4IH3eaxJJ+Hj7YRZ7Ejp35bqT9DH2NUcD3S9A=";
+  };
+
+  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";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..79bc2a787b96
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiorecollect/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, aiohttp
+, aresponses
+, buildPythonPackage
+, fetchFromGitHub
+, freezegun
+, poetry-core
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aiorecollect";
+  version = "2021.10.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "bachya";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-cLutszJ8VXGcqb8kZv7Qn1ZD/LRYjVgQWQxNMHNd0UQ=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  checkInputs = [
+    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";
+    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..5ea482278944
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioredis/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, async-timeout
+, typing-extensions
+, hiredis
+, isPyPy
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aioredis";
+  version = "2.0.1";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "eaa51aaf993f2d71f54b70527c440437ba65340588afeb786cd87c55c89cd98e";
+  };
+
+  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/aioredis";
+    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..a23b1eca77ca
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioresponses/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, aiohttp
+, asynctest
+, buildPythonPackage
+, ddt
+, fetchPypi
+, pbr
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aioresponses";
+  version = "0.7.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-LGTtVxDujLTpWMVpGE2tEvTJzVk5E1yzj4jGqCYczrM=";
+  };
+
+  nativeBuildInputs = [
+    pbr
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  checkInputs = [
+    asynctest
+    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..2b4cb28bbb59
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioridwell/default.nix
@@ -0,0 +1,72 @@
+{ lib
+, aiohttp
+, aresponses
+, buildPythonPackage
+, fetchFromGitHub
+, freezegun
+, poetry-core
+, pyjwt
+, pytest-aiohttp
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, pytz
+, titlecase
+, types-pytz
+}:
+
+buildPythonPackage rec {
+  pname = "aioridwell";
+  version = "2022.03.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "bachya";
+    repo = pname;
+    rev = version;
+    hash = "sha256-UiHT1YbBb9UTughVw2oJxRtvhUDVqQWqEcXMEXwy2cI=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    pyjwt
+    pytz
+    titlecase
+  ];
+
+  checkInputs = [
+    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";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..83ed397e47d0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiortm/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, click
+, fetchFromGitHub
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+, yarl
+}:
+
+buildPythonPackage rec {
+  pname = "aiortm";
+  version = "0.3.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "MartinHjelmare";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-DTFynPFf0NUBieXDiMKhCNwBqx3s/xzggNmnz/IKjbU=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    click
+    yarl
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace " --cov=aiortm --cov-report=term-missing:skip-covered" ""
+  '';
+
+  pythonImportsCheck = [
+    "aiortm"
+  ];
+
+  meta = with lib; {
+    description = "Library for the Remember the Milk API";
+    homepage = "https://github.com/MartinHjelmare/aiortm";
+    license = with licenses; [ asl20 ];
+    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..bc6954900ae2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiorun/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pygments
+, pytestCheckHook
+, uvloop
+}:
+
+buildPythonPackage rec {
+  pname = "aiorun";
+  version = "2021.10.1";
+  format = "flit";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "cjrh";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-9e1vUWDBv3BYWuKR/rZUvaIxFFetzBQaygXKnl4PDd8=";
+  };
+
+  propagatedBuildInputs = [
+    pygments
+  ];
+
+  checkInputs = [
+    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";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ costrouc ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiosenseme/default.nix b/nixpkgs/pkgs/development/python-modules/aiosenseme/default.nix
new file mode 100644
index 000000000000..ff90bed8e5a5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiosenseme/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, ifaddr
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aiosenseme";
+  version = "0.6.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "bdraco";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-ShK4DP1lAtAFI6z2kf5T1ecbNTKUn2kqUjps2ABRegg=";
+  };
+
+  propagatedBuildInputs = [
+    ifaddr
+  ];
+
+  pythonImportsCheck = [
+    "aiosenseme"
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Module to interact with SenseME fans and lights by Big Ass Fans";
+    homepage = "https://github.com/bdraco/aiosenseme";
+    license = with licenses; [ gpl3Only ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..beb561861470
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiosenz/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, authlib
+, buildPythonPackage
+, fetchFromGitHub
+, httpx
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aiosenz";
+  version = "1.0.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "milanmeu";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-ODdWPS14zzptxuS6mff51f0s1SYnIqjF40DmvT0sL0w=";
+  };
+
+  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..c8c521edbe65
--- /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.0";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "080j3ws3j2arj2f16mzqn1qliy0bzmb0gzk5jvm5ldkhsf1s061h";
+  };
+
+  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..a3dfa62705a5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioshelly/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, netifaces
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aioshelly";
+  version = "3.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "home-assistant-libs";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-Id4qg7uSvpjXpEx0/EvSMvFxgkR78/NOoOmmwngj7Qw=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    netifaces
+  ];
+
+  # 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..a76bba9c0ac2
--- /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.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "kumaraditya303";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-CQIzNu1NrGDOh2uVif/EzB5C5t/Y/h9oT56Gp6jrOPQ=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  checkInputs = [
+    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..9d815dfac059
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiosignal/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, frozenlist
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aiosignal";
+  version = "1.2.0";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "aio-libs";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1pamfc2l95s1q86jvmbp17chjy129gk01kwy8xm88d2ijy8s1caq";
+  };
+
+  propagatedBuildInputs = [
+    frozenlist
+  ];
+
+  checkInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace pytest.ini \
+      --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";
+    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..0f3e8c041e0c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioskybell/default.nix
@@ -0,0 +1,47 @@
+{ 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=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    aiofiles
+  ];
+
+  checkInputs = [
+    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..7d5dfa0ba519
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioslimproto/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aioslimproto";
+  version = "2.1.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "home-assistant-libs";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-Er7UsJDBDXD8CQSkUIOeO78HQaCsrRycU18LOjBpv/w=";
+  };
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # AssertionError: assert ['mixer', 'volume', '50'] == ['volume', '50']
+    "test_msg_instantiation"
+  ];
+
+  pythonImportsCheck = [
+    "aioslimproto"
+  ];
+
+  meta = with lib; {
+    description = "Module to control Squeezebox players";
+    homepage = "https://github.com/home-assistant-libs/aioslimproto";
+    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..20f38aef3634
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiosmb/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, asysocks
+, buildPythonPackage
+, colorama
+, fetchPypi
+, minikerberos
+, prompt-toolkit
+, pycryptodomex
+, pythonOlder
+, six
+, tqdm
+, winacl
+, winsspi
+}:
+
+buildPythonPackage rec {
+  pname = "aiosmb";
+  version = "0.3.8";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-CvqQEJPwrZHQuEId7GbIC9LpyyN6jaQFmEQTpddHU5g=";
+  };
+
+  propagatedBuildInputs = [
+    asysocks
+    colorama
+    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";
+    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..254f1bfa4fe3
--- /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.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "aio-libs";
+    repo = pname;
+    rev = version;
+    sha256 = "0hbpyns1j1fpvpj7gyb8cz359j7l4hzfqbig74xp4xih59sih0wj";
+  };
+
+  propagatedBuildInputs = [
+    atpublic
+    attrs
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    typing-extensions
+  ];
+
+  checkInputs = [
+    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..a3a2e8295a0d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiosmtplib/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, aiosmtpd
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, hypothesis
+, poetry-core
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aiosmtplib";
+  version = "1.1.6";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "cole";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-bo+u3I+ZX95UYkEam2TB6d6rvbYKa5Qu/9oNX5le478=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  checkInputs = [
+    aiosmtpd
+    hypothesis
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  patches = [
+    # Switch to poetry-core, https://github.com/cole/aiosmtplib/pull/183
+    (fetchpatch {
+      name = "switch-to-poetry-core.patch";
+      url = "https://github.com/cole/aiosmtplib/commit/3aba1c132d9454e05d4281f4c8aa618b4e1b783d.patch";
+      hash = "sha256-KlA46gD6swfJ/3OLO3xWZWa66Gx1/izmUMQ60PQy0po=";
+    })
+  ];
+
+  pythonImportsCheck = [
+    "aiosmtplib"
+  ];
+
+  meta = with lib; {
+    description = "Module which provides a SMTP client";
+    homepage = "https://github.com/cole/aiosmtplib";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..022e34e23c1b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiosqlite/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, aiounittest
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, pytestCheckHook
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "aiosqlite";
+  version = "0.17.0";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-8OaswkvEhkFJJnrIL7Rt+zvkRV+Z/iHfgmCcxua67lE=";
+  };
+
+  checkInputs = [
+    aiounittest
+    pytestCheckHook
+    typing-extensions
+  ];
+
+  # 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";
+    license = licenses.mit;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..060da226b937
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiostream/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+, pytest-cov
+, pytest-asyncio
+}:
+
+buildPythonPackage rec {
+  pname = "aiostream";
+  version = "0.4.4";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "vxgmichel";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "07if27z1h0mg236sj9lc8nl0bqy9sdrj83ls73mrc69h76bzg5xi";
+  };
+
+  checkInputs = [ pytestCheckHook pytest-cov pytest-asyncio ];
+
+  meta = with lib; {
+    description = "Generator-based operators for asynchronous iteration";
+    homepage = "https://aiostream.readthedocs.io";
+    license = licenses.gpl3Only;
+    maintainers = [ 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..958467823dc1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioswitcher/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, assertpy
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytest-asyncio
+, pytest-mockservers
+, pytest-resource-path
+, pytest-sugar
+, pytestCheckHook
+, time-machine
+}:
+
+buildPythonPackage rec {
+  pname = "aioswitcher";
+  version = "2.0.9";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "TomerFi";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-vsMQG664ySMQfdl4tGJKMY0MZXVl39QaFxu7kMtZWCM=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  preCheck = ''
+    export TZ=Asia/Jerusalem
+  '';
+
+  checkInputs = [
+    assertpy
+    pytest-asyncio
+    pytest-mockservers
+    pytest-resource-path
+    pytest-sugar
+    pytestCheckHook
+    time-machine
+  ];
+
+  pytestFlagsArray = [
+    "--asyncio-mode=legacy"
+  ];
+
+  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";
+    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..624c86fb314b
--- /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}";
+    sha256 = "sha256-vn8S2/kRW5C2Hbes9oLM4LGm1jWWK0zeLdujR14y6EI=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    yarl
+  ];
+
+  checkInputs = [
+    aioresponses
+    expects
+    pytestCheckHook
+    pytest-asyncio
+    pytest-mock
+  ];
+
+  pytestFlagsArray = [
+    "--asyncio-mode=legacy"
+  ];
+
+  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..cb560d88c7c1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiotractive/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, yarl
+}:
+
+buildPythonPackage rec {
+  pname = "aiotractive";
+  version = "0.5.5";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "zhulik";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-VCwIAeSAN4tMwB8TXN/ukrws0qYv/jHHeEu++m56AHA=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    yarl
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "aiotractive" ];
+
+  meta = with lib; {
+    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..b25fa9839b3c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiounifi/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, aiohttp
+, aioresponses
+, buildPythonPackage
+, fetchFromGitHub
+, orjson
+, pytest-aiohttp
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aiounifi";
+  version = "34";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "Kane610";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-NxxM1rU781QTfNWfE6maNovPZNDwU54ST1lxhTKmmBA=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    orjson
+  ];
+
+  checkInputs = [
+    aioresponses
+    pytest-aiohttp
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "--asyncio-mode=auto"
+  ];
+
+  pythonImportsCheck = [
+    "aiounifi"
+  ];
+
+  meta = with lib; {
+    description = "Python library for communicating with Unifi Controller API";
+    homepage = "https://github.com/Kane610/aiounifi";
+    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..d2f9ad916904
--- /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}";
+    sha256 = "sha256-7lDOI1SHPpRZLTHRTmfbKlZH18T73poJdFyVmb+HKms=";
+  };
+
+  propagatedBuildInputs = [
+    wrapt
+  ];
+
+  checkInputs = [
+    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 = [ maintainers.costrouc ];
+  };
+}
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..c41a39023706
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiovlc/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, click
+, fetchFromGitHub
+, pytest-asyncio
+, pytest-timeout
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aiovlc";
+  version = "0.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "MartinHjelmare";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "jB2V/Wpxmp92wba41mWZAeO63wy3NrkupllGxJMNkFM=";
+  };
+
+  propagatedBuildInputs = [
+    click
+  ];
+
+  checkInputs = [
+    pytest-asyncio
+    pytest-timeout
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "aiovlc"
+  ];
+
+  meta = with lib; {
+    description = "Python module to control VLC";
+    homepage = "https://github.com/MartinHjelmare/aiovlc";
+    license = licenses.asl20;
+    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..67d21b7ebfab
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiowatttime/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, aiohttp
+, aresponses
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytest-aiohttp
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aiowatttime";
+  version = "2021.10.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "bachya";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-cWXhQMgRYBzOVgUQWONIwWFB5n/f0lqkSjUb9IoPwtI=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  checkInputs = [
+    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..17d6d85c3ce2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiowebostv/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, websockets
+}:
+
+buildPythonPackage rec {
+  pname = "aiowebostv";
+  version = "0.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "home-assistant-libs";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-A7GiAQIuEXmCfo2pDJESCdAEaLumi1ACXnBMdGKwSvE=";
+  };
+
+  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";
+    license = with licenses; [ asl20 ];
+    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..59a2483d02ee
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiowinreg/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, winacl
+, prompt-toolkit
+}:
+
+buildPythonPackage rec {
+  pname = "aiowinreg";
+  version = "0.0.7";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1p88q2b6slm1sw3234r40s9jd03fqlkcx8y3iwg6ihf0z4ww14d1";
+  };
+
+  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";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..e1da7baaa6b5
--- /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;
+    sha256 = "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..40cb085a17e8
--- /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}";
+    sha256 = "sha256-weliT/FYnRX+pzVAyRWFly7lfj2z7P+hpq5SIhyIgmI=";
+  };
+
+  propagatedBuildInputs = [ aiohttp ];
+
+  checkInputs = [
+    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-cloud/default.nix b/nixpkgs/pkgs/development/python-modules/airthings-cloud/default.nix
new file mode 100644
index 000000000000..8315847683d0
--- /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;
+    sha256 = "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..1c567181f9b4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/airtouch4pyapi/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, numpy
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "airtouch4pyapi";
+  version = "1.0.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "LonePurpleWolf";
+    repo = pname;
+    # https://github.com/LonePurpleWolf/airtouch4pyapi/issues/5
+    rev = "34783888846783c058fe79cec16feda45504f701";
+    sha256 = "17c7fm72p085pg9msvsfdggbskvm12a6jlb5bw1cndrqsqcrxywx";
+  };
+
+  patches = [
+    # https://github.com/LonePurpleWolf/airtouch4pyapi/pull/10
+    (fetchpatch {
+      url = "https://github.com/LonePurpleWolf/airtouch4pyapi/commit/5b5d91fad63495c83422e7a850897946ac95b25d.patch";
+      hash = "sha256-tVlCLXuOJSqjbs0jj0iHCIXWZE8wmMV3ChzmE6uq3SM=";
+    })
+  ];
+
+  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..b3482cd74679
--- /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";
+  };
+
+  checkInputs = [ 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..72eda332f951
--- /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.12";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02";
+  };
+
+  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..ca6c6cca9632
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aladdin-connect/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, requests
+, buildPythonPackage
+, fetchFromGitHub
+}:
+
+buildPythonPackage rec {
+  pname = "aladdin-connect";
+  version = "0.4";
+
+  src = fetchFromGitHub {
+    owner = "shoejosh";
+    repo = pname;
+    rev = version;
+    sha256 = "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";
+    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..23b4173f8da8
--- /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;
+    sha256 = "sha256-q2s+wngDKtWm5mxGHNAc63Ed6tiQD9gLHVoQZNWFB0w=";
+  };
+
+  propagatedBuildInputs = [
+    pyftdi
+    pyopenssl
+    pyserial
+    pyusb
+  ];
+
+  checkInputs = [
+    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/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..aefe80a3b0b3
--- /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.8.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-zQteRbFLcGQmuDPwY2m5ptXuA/gm7DI4cjzoyq9uX/o=";
+  };
+
+  propagatedBuildInputs = [
+    Mako
+    python-dateutil
+    sqlalchemy
+  ] ++ lib.optionals (pythonOlder "3.9") [
+    importlib-resources
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  pythonImportsCheck = [
+    "alembic"
+  ];
+
+  checkInputs = [
+    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/algebraic-data-types/default.nix b/nixpkgs/pkgs/development/python-modules/algebraic-data-types/default.nix
new file mode 100644
index 000000000000..7c4f9a4f6082
--- /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=";
+  };
+
+  checkInputs = [
+    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/aliyun-python-sdk-cdn/default.nix b/nixpkgs/pkgs/development/python-modules/aliyun-python-sdk-cdn/default.nix
new file mode 100644
index 000000000000..7a34db334fab
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aliyun-python-sdk-cdn/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, aliyun-python-sdk-core
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aliyun-python-sdk-cdn";
+  version = "3.7.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-GAY4o9lr+1m8g1T7EhL5jLjEdfMWC/1vJ3UC4PQzvjI=";
+  };
+
+  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";
+    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..b349fe9e7b74
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aliyun-python-sdk-config/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, aliyun-python-sdk-core
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aliyun-python-sdk-config";
+  version = "2.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-FQNj11G2d985KkpVycJyUqugul/EXu4PpuvD/YGPkBc=";
+  };
+
+  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";
+    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..272a2ea5cccb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aliyun-python-sdk-core/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, cryptography
+, fetchPypi
+, jmespath
+, pythonOlder
+, pythonRelaxDepsHook
+}:
+
+buildPythonPackage rec {
+  pname = "aliyun-python-sdk-core";
+  version = "2.13.36";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-IL1UmE+jFtpwDH81WlGrC4FmkOKg/O+3te8BP+0NqSg=";
+  };
+
+  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";
+    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..2663fef3c786
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aliyun-python-sdk-dbfs/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, aliyun-python-sdk-core
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aliyun-python-sdk-dbfs";
+  version = "2.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-NdhmJnuGLy96HsJCKoHWdBdqGa7bdWRVUJOPPSEs6FQ=";
+  };
+
+  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";
+    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..cc5c77d67c53
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aliyun-python-sdk-iot/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, aliyun-python-sdk-core
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aliyun-python-sdk-iot";
+  version = "8.41.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-t/SIEW1JMTyeOhhxx6IhLsbQa0D3aqD2hqGk8+Ka0ns=";
+  };
+
+  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";
+    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..4356c00a7c73
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aliyun-python-sdk-kms/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, aliyun-python-sdk-core
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aliyun-python-sdk-kms";
+  version = "2.16.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-p/GFdyyI86DdqFa2Zt2kNtguAPnxHqW78S3KsmEO41g=";
+  };
+
+  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";
+    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..7217822bbcce
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aliyun-python-sdk-sts/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, aliyun-python-sdk-core
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aliyun-python-sdk-sts";
+  version = "3.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-CpUMw2qdY+5a99WgFLp0p00kQVnuvf3yMOZqTztqnRA=";
+  };
+
+  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";
+    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..9e1aac84f307
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/allpairspy/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchPypi, six, pytest }:
+
+buildPythonPackage rec {
+  pname = "allpairspy";
+  version = "2.5.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9358484c91abe74ba18daf9d6d6904c5be7cc8818397d05248c9d336023c28b1";
+  };
+
+  propagatedBuildInputs = [ six ];
+
+  checkInputs = [ pytest ];
+
+  checkPhase = ''
+    py.test
+  '';
+
+  meta = with lib; {
+    description = "Pairwise test combinations generator";
+    homepage = "https://github.com/thombashi/allpairspy";
+    license = licenses.mit;
+  };
+}
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..e7cd81d5b5d5
--- /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.9.45";
+
+  disabled = pythonOlder "3.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-aK0SgQIXpuUoSTz8jg5IPKQM2Xvk2EfkSGigsy/GFNo=";
+  };
+
+  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..49b5f683a6b4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/allure-pytest/default.nix
@@ -0,0 +1,80 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, six
+, pythonOlder
+, allure-python-commons
+, pytest
+, pytestCheckHook
+, pytest-check
+, pytest-flakes
+, pytest-lazy-fixture
+, pytest-rerunfailures
+, pytest-xdist
+, pyhamcrest
+, mock
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "allure-pytest";
+  version = "2.9.45";
+
+  disabled = pythonOlder "3.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "18ys5gi64jlfya6a7shj5lqhwc6cplwgyq3s2n5mg5x513g0yqi0";
+  };
+
+  buildInputs = [
+    pytest
+  ];
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  pythonImportsCheck = [ "allure_pytest" ];
+
+  propagatedBuildInputs = [
+    allure-python-commons
+    six
+  ];
+
+  checkInputs = [
+    pyhamcrest
+    mock
+    pytestCheckHook
+    pytest-check
+    pytest-flakes
+    pytest-lazy-fixture
+    pytest-rerunfailures
+    pytest-xdist
+  ];
+
+  pytestFlagsArray = [
+    "--basetemp"
+    "$(mktemp -d)"
+    "--alluredir"
+    "$(mktemp -d allure-results.XXXXXXX)"
+    "-W"
+    "ignore::pytest.PytestExperimentalApiWarning"
+    "-p"
+    "pytester"
+  ];
+
+  # we are skipping some of the integration tests for now
+  disabledTests = [
+    "test_pytest_check"
+    "test_pytest_check_example"
+    "test_select_by_testcase_id_test"
+  ];
+
+  meta = with lib; {
+    description = "Allure pytest integration. It's developed as pytest plugin and distributed via pypi";
+    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..3c43e698b8e7
--- /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.9.45";
+
+  disabled = pythonOlder "3.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0rn8ccxxrm27skv3avdiw56zc4fk2h7nrk3jamqmx6fnvmshiz5f";
+  };
+
+  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..56eb0bbf55ed
--- /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.9.45";
+
+  disabled = pythonOlder "3.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "17alymsivw8fs89j6phbqgrbprasw8kj72kxa5y8qpn3xa5d4f62";
+  };
+
+  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..7a67f9d6b0d1
--- /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
+  ];
+
+  checkInputs = [
+    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..e4bec8fafa4b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/altair/default.nix
@@ -0,0 +1,62 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27
+, entrypoints
+, glibcLocales
+, ipython
+, jinja2
+, jsonschema
+, numpy
+, pandas
+, pytestCheckHook
+, pythonOlder
+, recommonmark
+, six
+, sphinx
+, toolz
+, typing ? null
+, vega_datasets
+}:
+
+buildPythonPackage rec {
+  pname = "altair";
+  version = "4.2.0";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d87d9372e63b48cd96b2a6415f0cf9457f50162ab79dc7a31cd7e024dd840026";
+  };
+
+  propagatedBuildInputs = [
+    entrypoints
+    jsonschema
+    numpy
+    pandas
+    six
+    toolz
+    jinja2
+  ] ++ lib.optionals (pythonOlder "3.5") [ typing ];
+
+  checkInputs = [
+    glibcLocales
+    ipython
+    pytestCheckHook
+    recommonmark
+    sphinx
+    vega_datasets
+  ];
+
+  pythonImportsCheck = [ "altair" ];
+
+  # avoid examples directory, which fetches web resources
+  preCheck = ''
+    cd altair/tests
+  '';
+
+  meta = with lib; {
+    description = "A declarative statistical visualization library for Python.";
+    homepage = "https://github.com/altair-viz/altair";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ teh ];
+    platforms = platforms.unix;
+  };
+}
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..e90137ba22b7
--- /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-2021-12-10";
+  # python setup.py --version
+  realVersion = "0.1.dev49+g${lib.substring 0 7 src.rev}";
+
+  src = fetchFromGitHub {
+    owner = "amaranth-lang";
+    repo = "amaranth-soc";
+    rev = "217d4ea76ad3b3bbf146980d168bc7b3b9d95a18";
+    sha256 = "dMip82L7faUn16RDeG3NgMv0nougpwTwDWLX0doD2YA=";
+  };
+
+  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..938b44202b9b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/amaranth/default.nix
@@ -0,0 +1,74 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, setuptools
+, setuptools-scm
+, pyvcd
+, jinja2
+, importlib-resources
+, importlib-metadata
+, git
+
+# for tests
+, pytestCheckHook
+, symbiyosys
+, yices
+, yosys
+}:
+
+buildPythonPackage rec {
+  pname = "amaranth";
+  version = "0.3";
+  # python setup.py --version
+  realVersion = "0.3";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "amaranth-lang";
+    repo = "amaranth";
+    rev = "39a83f4d995d16364cc9b99da646ff8db6394166";
+    sha256 = "P9AG3t30eGeeCN5+t7mjhRoOWIGZVzWQji9eYXphjA0=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION="${realVersion}";
+
+  nativeBuildInputs = [
+    git
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    jinja2
+    pyvcd
+    setuptools
+  ] ++
+    lib.optional (pythonOlder "3.9") importlib-resources ++
+    lib.optional (pythonOlder "3.8") importlib-metadata;
+
+  checkInputs = [
+    pytestCheckHook
+    symbiyosys
+    yices
+    yosys
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "Jinja2~=2.11" "Jinja2>=2.11" \
+      --replace "pyvcd~=0.2.2" "pyvcd"
+
+    # jinja2.contextfunction was removed in jinja2 v3.1
+    substituteInPlace amaranth/build/plat.py \
+      --replace "@jinja2.contextfunction" "@jinja2.pass_context"
+  '';
+
+  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/amazon-ion/default.nix b/nixpkgs/pkgs/development/python-modules/amazon-ion/default.nix
new file mode 100644
index 000000000000..0e97eda4701f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/amazon-ion/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, jsonconversion
+, six
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "amazon-ion";
+  version = "0.9.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  # test vectors require git submodule
+  src = fetchFromGitHub {
+    owner = "amzn";
+    repo = "ion-python";
+    rev = "v${version}";
+    fetchSubmodules = true;
+    hash = "sha256-BLlKxm63KsmMFajS4uJne/LPNXboOfy4uVm8HqO9Wfo=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "'pytest-runner'," ""
+  '';
+
+  propagatedBuildInputs = [
+    jsonconversion
+    six
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  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..06f61981561b
--- /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.0.6";
+
+  src = fetchFromGitHub {
+    owner = "awslabs";
+    repo = "amazon-kinesis-client-python";
+    rev = "v${version}";
+    sha256 = "0gbpwhpd9i13vi0cch48qqrma90p230psqrkbfcjvdah69w434l4";
+  };
+
+  # argparse is just required for python2.6
+  prePatch = ''
+    substituteInPlace setup.py \
+      --replace "'argparse'," ""
+  '';
+
+  propagatedBuildInputs =  [ mock boto ];
+
+  checkInputs = [ 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..203254717933
--- /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}";
+    sha256 = "sha256-2wX2CLr6kdVw2AGPW6DmYI2OBfQFI/iWVorok2d3wx4=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    yarl
+  ];
+
+  checkInputs = [
+    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..667e5fff5e19
--- /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;
+    sha256 = "sha256-5SWJnTxRm6mzP0RxrgA+jnV+Gp23WjqQA57wbT2V9Dk=";
+  };
+
+  propagatedBuildInputs = [
+    urllib3
+    python-dateutil
+  ];
+
+  checkInputs = [
+    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..dcdf918344a3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/amcrest/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, argcomplete
+, buildPythonPackage
+, fetchFromGitHub
+, mock
+, httpx
+, pytestCheckHook
+, pythonOlder
+, requests
+, responses
+, urllib3
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "amcrest";
+  version = "1.9.7";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "tchellomello";
+    repo = "python-amcrest";
+    rev = version;
+    sha256 = "sha256-An7MnGtZsmEZU/y6E0sivdexFD6HJRTB1juXqHfbDzE=";
+  };
+
+  propagatedBuildInputs = [
+    argcomplete
+    httpx
+    requests
+    urllib3
+    typing-extensions
+  ];
+
+  checkInputs = [
+    mock
+    pytestCheckHook
+    responses
+  ];
+
+  pythonImportsCheck = [ "amcrest" ];
+
+  meta = with lib; {
+    description = "Python module for Amcrest and Dahua Cameras";
+    homepage = "https://github.com/tchellomello/python-amcrest";
+    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..5a26e341958b
--- /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.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-rXF7SQtrcFWQn6oZXoKkQytwb4+VhUBQFy9Ckx5HhCY=";
+  };
+
+  nativeBuildInputs = [ setuptools-scm ];
+  propagatedBuildInputs = [
+    docutils
+    pyparsing
+  ];
+  checkInputs = [ 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..ec4dd4dfcbee
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/amqp/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, case
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+, vine
+}:
+
+buildPythonPackage rec {
+  pname = "amqp";
+  version = "5.1.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-LBsT/swIk+lGxly9XzZCeGHP+k6iIB2Pb8oi4qNzteI=";
+  };
+
+  propagatedBuildInputs = [
+    vine
+  ];
+
+  checkInputs = [
+    case
+    pytestCheckHook
+  ];
+
+  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";
+    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..71c07c07cc9b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/amqtt/default.nix
@@ -0,0 +1,75 @@
+{ lib
+, buildPythonPackage
+, docopt
+, fetchFromGitHub
+, fetchpatch
+, hypothesis
+, passlib
+, poetry-core
+, pytest-logdog
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, 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=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    docopt
+    passlib
+    pyyaml
+    transitions
+    websockets
+  ];
+
+  checkInputs = [
+    hypothesis
+    pytest-logdog
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "--asyncio-mode=legacy"
+  ];
+
+  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/androguard/default.nix b/nixpkgs/pkgs/development/python-modules/androguard/default.nix
new file mode 100644
index 000000000000..5584f2bd6719
--- /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
+  ];
+
+  checkInputs = [
+    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..5af0c0b63cdc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/androidtv/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, adb-shell
+, aiofiles
+, buildPythonPackage
+, fetchFromGitHub
+, mock
+, pure-python-adb
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "androidtv";
+  version = "0.0.68";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "JeffLIrion";
+    repo = "python-androidtv";
+    rev = "v${version}";
+    hash = "sha256-cRupsdHpzzxV57ZsuWqZBvtbMYWwXFSVLqsNJ7kfpPA=";
+  };
+
+  propagatedBuildInputs = [
+    adb-shell
+    pure-python-adb
+  ];
+
+  passthru.optional-dependencies = {
+    async = [
+      aiofiles
+    ];
+    inherit (adb-shell.optional-dependencies) usb;
+  };
+
+  checkInputs = [
+    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/angr/default.nix b/nixpkgs/pkgs/development/python-modules/angr/default.nix
new file mode 100644
index 000000000000..dde5372e1870
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/angr/default.nix
@@ -0,0 +1,111 @@
+{ 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
+, sympy
+, sqlalchemy
+, rpyc
+, sortedcontainers
+, unicorn
+}:
+
+let
+  # Only the pinned release in setup.py works properly
+  unicorn' = unicorn.overridePythonAttrs (old: rec {
+    pname = "unicorn";
+    version = "1.0.2-rc4";
+    src =  fetchFromGitHub {
+      owner = "unicorn-engine";
+      repo = pname;
+      rev = version;
+      sha256 = "17nyccgk7hpc4hab24yn57f1xnmr7kq4px98zbp2bkwcrxny8gwy";
+    };
+    doCheck = false;
+  });
+in
+
+buildPythonPackage rec {
+  pname = "angr";
+  version = "9.2.14";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-lxquiow2hI0xqdPLyZTZtxIo5nR60OtJV/kf6ukGF4c=";
+  };
+
+  propagatedBuildInputs = [
+    ailment
+    archinfo
+    cachetools
+    capstone
+    cffi
+    claripy
+    cle
+    cppheaderparser
+    dpkt
+    GitPython
+    itanium_demangler
+    mulpyplexer
+    nampa
+    networkx
+    progressbar2
+    protobuf
+    psutil
+    pycparser
+    pyvex
+    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..2f5ecae9db97
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/angrcli/default.nix
@@ -0,0 +1,61 @@
+{ 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=";
+  };
+
+  propagatedBuildInputs = [
+    angr
+    cmd2
+    pygments
+  ];
+
+  checkInputs = [
+    coreutils
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace tests/test_derefs.py \
+      --replace "/bin/ls" "${coreutils}/bin/ls"
+  '';
+
+  disabledTests = [
+    "test_sims"
+    "test_proper_termination"
+    "test_branching"
+    "test_morph"
+  ];
+
+  pythonImportsCheck = [
+    "angrcli"
+  ];
+
+  meta = with lib; {
+    broken = (stdenv.isLinux && stdenv.isAarch64);
+    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..cfd27ae4cbfe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/angrop/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, angr
+, buildPythonPackage
+, fetchFromGitHub
+, progressbar
+, pythonOlder
+, pythonRelaxDepsHook
+, tqdm
+}:
+
+buildPythonPackage rec {
+  pname = "angrop";
+  version = "9.2.6";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "angr";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-qaDAicmYZxLPTl17il61ij01prRv2H4xxe07Xg4KWhI=";
+  };
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+  ];
+
+  propagatedBuildInputs = [
+    angr
+    progressbar
+    tqdm
+  ];
+
+  pythonRelaxDeps = [
+    "angr"
+  ];
+
+  # 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..62db58d611e4
--- /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;
+    sha256 = "sha256-cuMRdmfu32aVG7LZP0KWpWuUsHioqVkFoFJhH7PxuXM=";
+  };
+
+  propagatedBuildInputs = [
+    python-dateutil
+  ];
+
+  checkInputs = [
+    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..c9ed6bd90ede
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/annexremote/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, isPy3k
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, nose
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "annexremote";
+  version = "1.6.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Lykos153";
+    repo = "AnnexRemote";
+    rev = "v${version}";
+    sha256 = "08myswj1vqkl4s1glykq6xn76a070nv5mxj0z8ibl6axz89bvypi";
+  };
+
+  checkInputs = [
+    nose
+  ];
+
+  checkPhase = ''
+    nosetests -v -e "^TestExport_MissingName" -e "^TestRemoveexportdirectory"
+  '';
+
+  pythonImportsCheck = [
+    "annexremote"
+  ];
+
+  meta = with lib; {
+    description = "Helper module to easily develop git-annex remotes";
+    homepage = "https://github.com/Lykos153/AnnexRemote";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ montag451 ];
+  };
+}
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..97841a6a62d8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/annoy/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, h5py
+, nose
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "annoy";
+  version = "1.17.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-vxd9vq+4H2OyrB4SRrHyairMguc7pGY4c00p2CWBIto=";
+  };
+
+  nativeBuildInputs = [
+    h5py
+  ];
+
+  checkInputs = [
+    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";
+    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..96115aaee439
--- /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";
+  };
+
+  checkInputs = [
+    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..5847e3ad0f9e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ansi/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "ansi";
+  version = "0.3.6";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "tehmaze";
+    repo = pname;
+    rev = "${pname}-${version}";
+    hash = "sha256-2gu2Dba3LOjMhbCCZrBqzlOor5KqDYThhe8OP8J3O2M=";
+  };
+
+  checkInputs = [
+    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..6489832c43a9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ansi2html/default.nix
@@ -0,0 +1,29 @@
+{ lib, buildPythonPackage, fetchPypi, isPy3k, six, mock, pytestCheckHook, setuptools, setuptools-scm }:
+
+buildPythonPackage rec {
+  pname = "ansi2html";
+  version = "1.8.0";
+  format = "pyproject";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-OLgqKYSCofomE/D5yb6z23Ko+DLurFjrLke/Ms039tU=";
+  };
+
+  nativeBuildInputs = [ setuptools-scm ];
+  propagatedBuildInputs = [ six setuptools ];
+
+  preCheck = "export PATH=$PATH:$out/bin";
+  checkInputs = [ mock 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/ansible-compat/default.nix b/nixpkgs/pkgs/development/python-modules/ansible-compat/default.nix
new file mode 100644
index 000000000000..8ecac450b1ea
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ansible-compat/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, ansible-core
+, flaky
+, pytest-mock
+, pytestCheckHook
+, pyyaml
+, setuptools-scm
+, subprocess-tee
+}:
+
+buildPythonPackage rec {
+  pname = "ansible-compat";
+  version = "2.2.0";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-Z2247ARJ0fBwOGJbjruM7vX4rToa8+6C1O1mubBMtvo=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    pyyaml
+    subprocess-tee
+  ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d)
+    export PATH=$PATH:$out/bin
+  '';
+
+  checkInputs = [
+    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 = "A python package containing functions that help interacting with various versions of Ansible";
+    homepage = "https://github.com/ansible/ansible-compat";
+    license = licenses.mit;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ansible-doctor/default.nix b/nixpkgs/pkgs/development/python-modules/ansible-doctor/default.nix
new file mode 100644
index 000000000000..67dc34f19b84
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ansible-doctor/default.nix
@@ -0,0 +1,77 @@
+{ lib
+, anyconfig
+, appdirs
+, buildPythonPackage
+, colorama
+, environs
+, fetchFromGitHub
+, jinja2
+, jsonschema
+, nested-lookup
+, pathspec
+, poetry-core
+, python-json-logger
+, pythonOlder
+, ruamel-yaml
+}:
+
+buildPythonPackage rec {
+  pname = "ansible-doctor";
+  version = "1.4.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "thegeeklab";
+    repo = "ansible-doctor";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-kfBEV3PXU+C7FD9xiBMvdamb3b2KXp+Qi23/xUnoXHM=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    anyconfig
+    appdirs
+    colorama
+    environs
+    jinja2
+    jsonschema
+    nested-lookup
+    pathspec
+    python-json-logger
+    ruamel-yaml
+  ];
+
+  postInstall = ''
+    rm $out/lib/python*/site-packages/LICENSE
+  '';
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'version = "0.0.0"' 'version = "${version}"' \
+      --replace 'Jinja2 = "3.1.2"' 'Jinja2 = "*"' \
+      --replace 'anyconfig = "0.13.0"' 'anyconfig = "*"' \
+      --replace 'environs = "9.5.0"' 'environs = "*"' \
+      --replace 'jsonschema = "4.6.0"' 'jsonschema = "*"' \
+      --replace '"ruamel.yaml" = "0.17.21"' '"ruamel.yaml" = "*"' \
+      --replace 'python-json-logger = "2.0.2"' 'python-json-logger = "*"'
+  '';
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "ansibledoctor"
+  ];
+
+  meta = with lib; {
+    description = "Annotation based documentation for your Ansible roles";
+    homepage = "https://github.com/thegeeklab/ansible-doctor";
+    license = licenses.lgpl3Only;
+    maintainers = with maintainers; [ tboerger ];
+  };
+}
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..5901e8f56abb
--- /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;
+    sha256 = "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 = [ maintainers.costrouc ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ansible-later/default.nix b/nixpkgs/pkgs/development/python-modules/ansible-later/default.nix
new file mode 100644
index 000000000000..9e0af254b3f9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ansible-later/default.nix
@@ -0,0 +1,90 @@
+{ lib
+, ansible
+, ansible-core
+, anyconfig
+, appdirs
+, buildPythonPackage
+, colorama
+, fetchFromGitHub
+, flake8
+, jsonschema
+, nested-lookup
+, pathspec
+, poetry-core
+, pytest-mock
+, python-json-logger
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, toolz
+, unidiff
+, yamllint
+}:
+
+buildPythonPackage rec {
+  pname = "ansible-later";
+  version = "2.0.16";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "thegeeklab";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-AlLy8rqqNrJtoI01OHq8W1Oi8iN8RiBdtq2sZ7zlTyM=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'version = "0.0.0"' 'version = "${version}"' \
+      --replace " --cov=ansiblelater --cov-report=xml:coverage.xml --cov-report=term --cov-append --no-cov-on-fail" "" \
+      --replace 'PyYAML = "6.0"' 'PyYAML = "*"' \
+      --replace 'unidiff = "0.7.3"' 'unidiff = "*"' \
+      --replace 'jsonschema = "' 'jsonschema = "^' \
+      --replace 'python-json-logger = "' 'python-json-logger = "^' \
+      --replace 'toolz = "0.11.2' 'toolz = "*' \
+      --replace 'yamllint = "' 'yamllint = "^'
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    ansible
+    ansible-core
+    anyconfig
+    appdirs
+    colorama
+    flake8
+    jsonschema
+    nested-lookup
+    pathspec
+    python-json-logger
+    pyyaml
+    toolz
+    unidiff
+    yamllint
+  ];
+
+  checkInputs = [
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  postInstall = ''
+    rm $out/lib/python*/site-packages/LICENSE
+  '';
+
+  pythonImportsCheck = [
+    "ansiblelater"
+  ];
+
+  meta = with lib; {
+    description = "Best practice scanner for Ansible roles and playbooks";
+    homepage = "https://github.com/thegeeklab/ansible-later";
+    license = licenses.mit;
+    maintainers = with maintainers; [ tboerger ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ansible-lint/default.nix b/nixpkgs/pkgs/development/python-modules/ansible-lint/default.nix
new file mode 100644
index 000000000000..90da98520120
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ansible-lint/default.nix
@@ -0,0 +1,102 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools-scm
+, ansible-compat
+, ansible-core
+, enrich
+, flaky
+, jsonschema
+, pythonOlder
+, pytest
+, pytest-xdist
+, pytestCheckHook
+, pyyaml
+, rich
+, ruamel-yaml
+, wcmatch
+, yamllint
+}:
+
+buildPythonPackage rec {
+  pname = "ansible-lint";
+  version = "6.4.0";
+  format = "pyproject";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-xadjBsrpBqJgz3KGyofE0DukSSsu17/qIa0R/fPH6NE=";
+  };
+
+  postPatch = ''
+    # it is fine if lint tools are missing
+    substituteInPlace conftest.py \
+      --replace "sys.exit(1)" ""
+  '';
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    ansible-compat
+    ansible-core
+    enrich
+    jsonschema
+    pytest # yes, this is an actual runtime dependency
+    pyyaml
+    rich
+    ruamel-yaml
+    wcmatch
+    yamllint
+  ];
+
+  # tests can't be easily run without installing things from ansible-galaxy
+  doCheck = false;
+
+  checkInputs = [
+    flaky
+    pytest-xdist
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    # ansible wants to write to $HOME and crashes if it can't
+    export HOME=$(mktemp -d)
+    export PATH=$PATH:${lib.makeBinPath [ ansible-core ]}
+
+    # create a working ansible-lint executable
+    export PATH=$PATH:$PWD/src/ansiblelint
+    ln -rs src/ansiblelint/__main__.py src/ansiblelint/ansible-lint
+    patchShebangs src/ansiblelint/__main__.py
+
+    # create symlink like in the git repo so test_included_tasks does not fail
+    ln -s ../roles examples/playbooks/roles
+  '';
+
+  disabledTests = [
+    # requires network
+    "test_cli_auto_detect"
+    "test_install_collection"
+    "test_prerun_reqs_v1"
+    "test_prerun_reqs_v2"
+    "test_require_collection_wrong_version"
+    # re-execs ansible-lint which does not works correct
+    "test_custom_kinds"
+    "test_run_inside_role_dir"
+    "test_run_multiple_role_path_no_trailing_slash"
+    "test_runner_exclude_globs"
+
+    "test_discover_lintables_umlaut"
+  ];
+
+  makeWrapperArgs = [ "--prefix PATH : ${lib.makeBinPath [ ansible-core ]}" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/ansible/ansible-lint";
+    description = "Best practices checker for Ansible";
+    license = licenses.mit;
+    maintainers = with maintainers; [ sengaya SuperSandro2000 ];
+  };
+}
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..c261e5b163b7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ansible-runner/default.nix
@@ -0,0 +1,96 @@
+{ lib
+, stdenv
+, ansible-core
+, buildPythonPackage
+, fetchPypi
+, mock
+, openssh
+, pbr
+, pexpect
+, psutil
+, pytest-mock
+, pytest-timeout
+, pytest-xdist
+, pytestCheckHook
+, python-daemon
+, pyyaml
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "ansible-runner";
+  version = "2.2.1";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-zZtssRdAEbTi4KWZPU0E2SjN5f4iqJk67UQ4STOHwYI=";
+  };
+
+  nativeBuildInputs = [
+    pbr
+  ];
+
+  propagatedBuildInputs = [
+    ansible-core
+    psutil
+    pexpect
+    python-daemon
+    pyyaml
+    six
+  ];
+
+  checkInputs = [
+    ansible-core # required to place ansible CLI onto the PATH in tests
+    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"
+  ] ++ lib.optional stdenv.isDarwin [
+    # test_process_isolation_settings is currently broken on Darwin Catalina
+    # https://github.com/ansible/ansible-runner/issues/413
+    "process_isolation_settings"
+  ];
+
+  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; [ costrouc ];
+  };
+}
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..2b01eff0b91f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ansible/core.nix
@@ -0,0 +1,82 @@
+{ lib
+, callPackage
+, buildPythonPackage
+, fetchPypi
+, installShellFiles
+, ansible
+, cryptography
+, jinja2
+, junit-xml
+, lxml
+, ncclient
+, packaging
+, paramiko
+, pexpect
+, psutil
+, pycrypto
+, pyyaml
+, requests
+, resolvelib
+, scp
+, windowsSupport ? false, pywinrm
+, xmltodict
+}:
+
+buildPythonPackage rec {
+  pname = "ansible-core";
+  version = "2.13.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-t3nQ5VqXcXwO5ehrSGqmfAfCgJ70d74qyErQkajdLds=";
+  };
+
+  # 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
+  ];
+
+  propagatedBuildInputs = [
+    # depend on ansible instead of the other way around
+    ansible
+    # from requirements.txt
+    cryptography
+    jinja2
+    packaging
+    pyyaml
+    resolvelib # This library is a PITA, since ansible requires a very old version of it
+    # optional dependencies
+    junit-xml
+    lxml
+    ncclient
+    paramiko
+    pexpect
+    psutil
+    pycrypto
+    requests
+    scp
+    xmltodict
+  ] ++ lib.optional windowsSupport pywinrm;
+
+  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..d2f7dba38669
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ansible/default.nix
@@ -0,0 +1,85 @@
+{ lib
+, pythonOlder
+, buildPythonPackage
+, fetchPypi
+, jsonschema
+, jxmlease
+, ncclient
+, netaddr
+, paramiko
+, pynetbox
+, scp
+, textfsm
+, ttp
+, xmltodict
+
+# optionals
+, withJunos ? false
+, withNetbox ? false
+}:
+
+let
+  pname = "ansible";
+  version = "6.2.0";
+in
+buildPythonPackage {
+  inherit pname version;
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-va8rL9km/xifveL+/nI0cz8yw2/EEwM/pdk5RfvcBqY=";
+  };
+
+  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
+    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
+    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..fab91690ab23
--- /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";
+  };
+
+  checkInputs = [ 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..ba0c06f536aa
--- /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";
+  };
+
+  checkInputs = [ 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..b74c7e321799
--- /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}";
+    sha256 = "sha256-HGeVapv2Z5GtPwSp3+dvUwAH0bFqu+Bmk5E6SRr7NO4=";
+  };
+
+  propagatedBuildInputs = [ colorama ];
+
+  checkInputs = [ 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..1d0aef1ee5d3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ansiwrap/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, ansicolors
+, buildPythonPackage
+, coverage
+, fetchPypi
+, pytest-cov
+, pytestCheckHook
+, textwrap3
+}:
+
+buildPythonPackage rec {
+  pname = "ansiwrap";
+  version = "0.8.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "ca0c740734cde59bf919f8ff2c386f74f9a369818cdc60efe94893d01ea8d9b7";
+  };
+
+  checkInputs = [
+    ansicolors
+    coverage
+    pytest-cov
+    pytestCheckHook
+  ];
+
+  propagatedBuildInputs = [ textwrap3 ];
+
+  pythonImportsCheck = [ "ansiwrap" ];
+
+  meta = with lib; {
+    description = "Textwrap, but savvy to ANSI colors and styles";
+    homepage = "https://github.com/jonathaneunice/ansiwrap";
+    license = licenses.asl20;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..1ab91cacbcc3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/antlr4-python3-runtime/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, isPy3k
+, python
+, antlr4 }:
+
+buildPythonPackage rec {
+  pname = "antlr4-python3-runtime";
+  inherit (antlr4.runtime.cpp) version src;
+  disabled = python.pythonOlder "3.6";
+
+  sourceRoot = "source/runtime/Python3";
+
+  # in 4.9, test was renamed to tests
+  checkPhase = ''
+    cd test*
+    ${python.interpreter} ctest.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..b34a711f6a9e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/anyascii/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "anyascii";
+  version = "0.3.1";
+  format = "setuptools";
+  disabled = pythonOlder "3.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-3t9XcoIG4obJHu18dZUFpeRcjNATZ91Awvcki7FcEfY=";
+  };
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    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..489e200afb04
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/anybadge/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "anybadge";
+  version = "1.11.1";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "jongracecox";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-6br4WUwE1ovAneYUeTHcUN3PH5Wm1rnLYCpXDUshk7Q=";
+  };
+
+  # setup.py reads its version from the TRAVIS_TAG environment variable
+  TRAVIS_TAG = "v${version}";
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "anybadge"
+  ];
+
+  meta = with lib; {
+    description = "Python tool for generating badges for your projects";
+    homepage = "https://github.com/jongracecox/anybadge";
+    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..17794d5c8c46
--- /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;
+    sha256 = "sha256-A/8uF2KvOI+7vtHBq3+fHsAGqR2n2zpouWPabneV0qw=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "--cov=src -vv" ""
+  '';
+
+  propagatedBuildInputs = [
+    setuptools
+  ];
+
+  checkInputs = [
+    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..fde9fe67fcca
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/anyio/default.nix
@@ -0,0 +1,92 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, pythonOlder
+, setuptools
+, setuptools-scm
+, idna
+, sniffio
+, typing-extensions
+, curio
+, hypothesis
+, mock
+, pytest-mock
+, pytestCheckHook
+, trio
+, trustme
+, uvloop
+}:
+
+buildPythonPackage rec {
+  pname = "anyio";
+  version = "3.5.0";
+  format = "pyproject";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "agronholm";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-AZ9M/NBCBlMIUpRJgKbJRL/oReZDUh2Jhwtoxoo0tMs=";
+  };
+
+  patches = [
+    (fetchpatch {
+      # Pytest 7.0 compatibility
+      url = "https://github.com/agronholm/anyio/commit/fed7cc4f95e196f68251bcb9253da3b143ea8e7e.patch";
+      sha256 = "sha256-VmZmiQEmWJ4aPz0Wx+GTMZo7jXRDScnRYf2Hu2hiRVw=";
+    })
+  ];
+
+  preBuild = ''
+    export SETUPTOOLS_SCM_PRETEND_VERSION=${version}
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    idna
+    sniffio
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    typing-extensions
+  ];
+
+  checkInputs = [
+    curio
+    hypothesis
+    pytest-mock
+    pytestCheckHook
+    trio
+    trustme
+    uvloop
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    mock
+  ];
+
+  disabledTests = [
+    # block devices access
+    "test_is_block_device"
+  ];
+
+  disabledTestPaths = [
+    # lots of DNS lookups
+    "tests/test_sockets.py"
+  ] ++ lib.optionals stdenv.isDarwin [
+    # darwin sandboxing limitations
+    "tests/streams/test_tls.py"
+  ];
+
+  pythonImportsCheck = [ "anyio" ];
+
+  meta = with lib; {
+    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/anytree/default.nix b/nixpkgs/pkgs/development/python-modules/anytree/default.nix
new file mode 100644
index 000000000000..fa92bc44891a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/anytree/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, substituteAll
+, six
+, withGraphviz ? true
+, graphviz
+, fontconfig
+# Tests
+, pytestCheckHook
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "anytree";
+  version = "2.8.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3f0f93f355a91bc3e6245319bf4c1d50e3416cc7a35cc1133c1ff38306bbccab";
+  };
+
+  patches = lib.optionals withGraphviz [
+    (substituteAll {
+      src = ./graphviz.patch;
+      inherit graphviz;
+    })
+  ];
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  # 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;
+
+  checkInputs = [ pytestCheckHook nose ];
+
+  pytestFlagsArray = lib.optionals (pythonOlder "3.4") [
+    # Use enums, which aren't available pre-python3.4
+    "--ignore=tests/test_resolver.py"
+    "--ignore=tests/test_search.py"
+  ];
+
+  meta = with lib; {
+    description = "Powerful and Lightweight Python Tree Data Structure";
+    homepage = "https://github.com/c0fec0de/anytree";
+    license = licenses.asl20;
+    maintainers = [ ];
+  };
+}
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/aocd/default.nix b/nixpkgs/pkgs/development/python-modules/aocd/default.nix
new file mode 100644
index 000000000000..f9e2f177a88a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aocd/default.nix
@@ -0,0 +1,58 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub, requests
+, pytestCheckHook, tzlocal, pytest-mock, pytest-freezegun, pytest-raisin
+, pytest-socket, requests-mock, pebble, python-dateutil, termcolor
+, beautifulsoup4, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "aocd";
+  version = "1.1.2";
+
+  src = fetchFromGitHub {
+    owner = "wimglenn";
+    repo = "advent-of-code-data";
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-3Cs9tiyWXtyeDXf4FK4gXokCZgtxv4Z5jmSv47t04ag=";
+  };
+
+  propagatedBuildInputs = [
+    python-dateutil
+    requests
+    termcolor
+    beautifulsoup4
+    pebble
+    tzlocal
+    setuptools
+  ];
+
+  # 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"
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    pytest-mock
+    pytest-freezegun
+    pytest-raisin
+    pytest-socket
+    requests-mock
+  ];
+
+  pythonImportsCheck = [ "aocd" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/wimglenn/advent-of-code-data";
+    description = "Get your Advent of Code data with a single import statement";
+    license = licenses.mit;
+    maintainers = with maintainers; [ aadibajpai ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/apache-airflow/default.nix b/nixpkgs/pkgs/development/python-modules/apache-airflow/default.nix
new file mode 100644
index 000000000000..d6257e537bd5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/apache-airflow/default.nix
@@ -0,0 +1,249 @@
+{ lib
+, stdenv
+, python
+, buildPythonPackage
+, fetchFromGitHub
+, alembic
+, argcomplete
+, attrs
+, blinker
+, cached-property
+, cattrs
+, clickclick
+, colorlog
+, croniter
+, cryptography
+, dataclasses
+, dill
+, flask
+, flask_login
+, flask-wtf
+, flask-appbuilder
+, flask-caching
+, GitPython
+, graphviz
+, gunicorn
+, httpx
+, iso8601
+, importlib-resources
+, importlib-metadata
+, inflection
+, itsdangerous
+, jinja2
+, jsonschema
+, lazy-object-proxy
+, lockfile
+, markdown
+, markupsafe
+, marshmallow-oneofschema
+, numpy
+, openapi-spec-validator
+, pandas
+, pendulum
+, psutil
+, pygments
+, pyjwt
+, python-daemon
+, python-dateutil
+, python-nvd3
+, python-slugify
+, python3-openid
+, pythonOlder
+, pyyaml
+, rich
+, setproctitle
+, sqlalchemy
+, sqlalchemy-jsonfield
+, swagger-ui-bundle
+, tabulate
+, tenacity
+, termcolor
+, unicodecsv
+, werkzeug
+, pytestCheckHook
+, freezegun
+, mkYarnPackage
+}:
+let
+  version = "2.3.3";
+
+  airflow-src = fetchFromGitHub rec {
+    owner = "apache";
+    repo = "airflow";
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-N+6ljfSo6+UvSAnvDav6G0S49JZ1VJwxmaiKPV3/DjA=";
+  };
+
+  # airflow bundles a web interface, which is built using webpack by an undocumented shell script in airflow's source tree.
+  # This replicates this shell script, fixing bugs in yarn.lock and package.json
+
+  airflow-frontend = mkYarnPackage {
+    name = "airflow-frontend";
+
+    src = "${airflow-src}/airflow/www";
+    packageJSON = ./package.json;
+    yarnLock = ./yarn.lock;
+    yarnNix = ./yarn.nix;
+
+    distPhase = "true";
+
+    configurePhase = ''
+      cp -r $node_modules node_modules
+    '';
+
+    buildPhase = ''
+      yarn --offline build
+      find package.json yarn.lock static/css static/js -type f | sort | xargs md5sum > static/dist/sum.md5
+    '';
+
+    installPhase = ''
+      mkdir -p $out/static/
+      cp -r static/dist $out/static
+    '';
+  };
+
+in
+buildPythonPackage rec {
+  pname = "apache-airflow";
+  inherit version;
+  src = airflow-src;
+
+  disabled = pythonOlder "3.6";
+
+  propagatedBuildInputs = [
+    alembic
+    argcomplete
+    attrs
+    blinker
+    cached-property
+    cattrs
+    clickclick
+    colorlog
+    croniter
+    cryptography
+    dill
+    flask
+    flask-appbuilder
+    flask-caching
+    flask_login
+    flask-wtf
+    GitPython
+    graphviz
+    gunicorn
+    httpx
+    iso8601
+    importlib-resources
+    inflection
+    itsdangerous
+    jinja2
+    jsonschema
+    lazy-object-proxy
+    lockfile
+    markdown
+    markupsafe
+    marshmallow-oneofschema
+    numpy
+    openapi-spec-validator
+    pandas
+    pendulum
+    psutil
+    pygments
+    pyjwt
+    python-daemon
+    python-dateutil
+    python-nvd3
+    python-slugify
+    python3-openid
+    pyyaml
+    rich
+    setproctitle
+    sqlalchemy
+    sqlalchemy-jsonfield
+    swagger-ui-bundle
+    tabulate
+    tenacity
+    termcolor
+    unicodecsv
+    werkzeug
+  ] ++ lib.optionals (pythonOlder "3.7") [
+    dataclasses
+  ] ++ lib.optionals (pythonOlder "3.9") [
+    importlib-metadata
+  ];
+
+  buildInputs = [
+    airflow-frontend
+  ];
+
+  checkInputs = [
+    freezegun
+    pytestCheckHook
+  ];
+
+  INSTALL_PROVIDERS_FROM_SOURCES = "true";
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "attrs>=20.0, <21.0" "attrs" \
+      --replace "cattrs~=1.1, <1.7.0" "cattrs" \
+      --replace "colorlog>=4.0.2, <6.0" "colorlog" \
+      --replace "croniter>=0.3.17, <1.1" "croniter" \
+      --replace "docutils<0.17" "docutils" \
+      --replace "flask-login>=0.3, <0.5" "flask-login" \
+      --replace "flask-wtf>=0.14.3, <0.15" "flask-wtf" \
+      --replace "flask>=1.1.0, <2.0" "flask" \
+      --replace "importlib_resources~=1.4" "importlib_resources" \
+      --replace "itsdangerous>=1.1.0, <2.0" "itsdangerous" \
+      --replace "markupsafe>=1.1.1, <2.0" "markupsafe" \
+      --replace "pyjwt<2" "pyjwt" \
+      --replace "python-slugify>=3.0.0,<5.0" "python-slugify" \
+      --replace "sqlalchemy_jsonfield~=1.0" "sqlalchemy-jsonfield" \
+      --replace "tenacity~=6.2.0" "tenacity" \
+      --replace "werkzeug~=1.0, >=1.0.1" "werkzeug"
+
+    substituteInPlace tests/core/test_core.py \
+      --replace "/bin/bash" "${stdenv.shell}"
+  '' + lib.optionalString stdenv.isDarwin ''
+    # Fix failing test on Hydra
+    substituteInPlace airflow/utils/db.py \
+      --replace "/tmp/sqlite_default.db" "$TMPDIR/sqlite_default.db"
+  '';
+
+  # allow for gunicorn processes to have access to Python packages
+  makeWrapperArgs = [
+    "--prefix PYTHONPATH : $PYTHONPATH"
+  ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d)
+    export AIRFLOW_HOME=$HOME
+    export AIRFLOW__CORE__UNIT_TEST_MODE=True
+    export AIRFLOW_DB="$HOME/airflow.db"
+    export PATH=$PATH:$out/bin
+
+    airflow version
+    airflow db init
+    airflow db reset -y
+  '';
+
+  pytestFlagsArray = [
+    "tests/core/test_core.py"
+  ];
+
+  disabledTests = lib.optionals stdenv.isDarwin [
+    "bash_operator_kill" # psutil.AccessDenied
+  ];
+
+  postInstall = ''
+    cp -rv ${airflow-frontend}/static/dist $out/lib/${python.libPrefix}/site-packages/airflow/www/static
+  '';
+
+  meta = with lib; {
+    description = "Programmatically author, schedule and monitor data pipelines";
+    homepage = "https://airflow.apache.org/";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ bhipple costrouc ingenieroariel ];
+    # requires extremely outdated versions of multiple dependencies
+    broken = true;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/apache-airflow/package.json b/nixpkgs/pkgs/development/python-modules/apache-airflow/package.json
new file mode 100644
index 000000000000..f9dad24a06f9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/apache-airflow/package.json
@@ -0,0 +1,80 @@
+{
+  "name": "airflow-frontend",
+  "version": "2.1.1rc1",
+  "description": "Apache Airflow is a platform to programmatically author, schedule and monitor workflows.",
+  "scripts": {
+    "test": "echo \"Error: no test specified\" && exit 1",
+    "dev": "NODE_ENV=dev webpack --watch --colors --progress --debug --output-pathinfo --devtool eval-cheap-source-map --mode development",
+    "prod": "NODE_ENV=production node --max_old_space_size=4096 ./node_modules/webpack/bin/webpack.js -p --colors --progress",
+    "build": "NODE_ENV=production webpack --colors --progress",
+    "lint": "eslint --ignore-path=.eslintignore --ext .js,.html .",
+    "lint:fix": "eslint --fix --ignore-path=.eslintignore --ext .js,.html ."
+  },
+  "author": "Apache",
+  "license": "Apache-2.0",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/apache/airflow.git"
+  },
+  "homepage": "https://airflow.apache.org/",
+  "keywords": [
+    "big",
+    "data",
+    "workflow",
+    "airflow",
+    "d3",
+    "nerds",
+    "database",
+    "flask"
+  ],
+  "devDependencies": {
+    "babel": "^6.23.0",
+    "babel-core": "^6.26.3",
+    "babel-eslint": "^10.1.0",
+    "babel-loader": "^8.1.0",
+    "babel-plugin-css-modules-transform": "^1.6.1",
+    "babel-polyfill": "^6.26.0",
+    "clean-webpack-plugin": "^3.0.0",
+    "copy-webpack-plugin": "^6.0.3",
+    "css-loader": "^3.4.2",
+    "eslint": "^7.5.0",
+    "eslint-config-airbnb-base": "^14.2.0",
+    "eslint-plugin-html": "^6.0.2",
+    "eslint-plugin-import": "^2.22.0",
+    "eslint-plugin-node": "^11.1.0",
+    "eslint-plugin-promise": "^4.2.1",
+    "eslint-plugin-standard": "^4.0.1",
+    "file-loader": "^6.0.0",
+    "imports-loader": "^1.1.0",
+    "mini-css-extract-plugin": "1.6.0",
+    "moment-locales-webpack-plugin": "^1.2.0",
+    "optimize-css-assets-webpack-plugin": "6.0.0",
+    "style-loader": "^1.2.1",
+    "stylelint": "^13.6.1",
+    "stylelint-config-standard": "^20.0.0",
+    "url-loader": "4.1.0",
+    "webpack": "^4.16.3",
+    "webpack-cli": "^3.1.0",
+    "webpack-manifest-plugin": "^2.2.0"
+  },
+  "dependencies": {
+    "bootstrap-3-typeahead": "^4.0.2",
+    "codemirror": "^5.59.1",
+    "d3": "^3.4.4",
+    "d3-shape": "^2.1.0",
+    "d3-tip": "^0.9.1",
+    "dagre-d3": "^0.6.4",
+    "datatables.net": "^1.10.23",
+    "datatables.net-bs": "^1.10.23",
+    "eonasdan-bootstrap-datetimepicker": "^4.17.47",
+    "jquery": ">=3.4.0",
+    "jshint": "^2.12.0",
+    "moment-timezone": "^0.5.28",
+    "nvd3": "^1.8.6",
+    "redoc": "^2.0.0-rc.48",
+    "url-search-params-polyfill": "^8.1.0"
+  },
+  "resolutions": {
+    "lodash": "^4.17.21"
+  }
+}
diff --git a/nixpkgs/pkgs/development/python-modules/apache-airflow/yarn.lock b/nixpkgs/pkgs/development/python-modules/apache-airflow/yarn.lock
new file mode 100644
index 000000000000..df97316e2d9f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/apache-airflow/yarn.lock
@@ -0,0 +1,7740 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13":
+  version "7.12.13"
+  resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.13.tgz#dcfc826beef65e75c50e21d3837d7d95798dd658"
+  integrity sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==
+  dependencies:
+    "@babel/highlight" "^7.12.13"
+
+"@babel/code-frame@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a"
+  integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==
+  dependencies:
+    "@babel/highlight" "^7.10.4"
+
+"@babel/compat-data@^7.13.15":
+  version "7.14.0"
+  resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.14.0.tgz#a901128bce2ad02565df95e6ecbf195cf9465919"
+  integrity sha512-vu9V3uMM/1o5Hl5OekMUowo3FqXLJSw+s+66nt0fSWVWTtmosdzn45JHOB3cPtZoe6CTBDzvSw0RdOY85Q37+Q==
+
+"@babel/core@>=7.9.0":
+  version "7.14.0"
+  resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.14.0.tgz#47299ff3ec8d111b493f1a9d04bf88c04e728d88"
+  integrity sha512-8YqpRig5NmIHlMLw09zMlPTvUVMILjqCOtVgu+TVNWEBvy9b5I3RRyhqnrV4hjgEK7n8P9OqvkWJAFmEL6Wwfw==
+  dependencies:
+    "@babel/code-frame" "^7.12.13"
+    "@babel/generator" "^7.14.0"
+    "@babel/helper-compilation-targets" "^7.13.16"
+    "@babel/helper-module-transforms" "^7.14.0"
+    "@babel/helpers" "^7.14.0"
+    "@babel/parser" "^7.14.0"
+    "@babel/template" "^7.12.13"
+    "@babel/traverse" "^7.14.0"
+    "@babel/types" "^7.14.0"
+    convert-source-map "^1.7.0"
+    debug "^4.1.0"
+    gensync "^1.0.0-beta.2"
+    json5 "^2.1.2"
+    semver "^6.3.0"
+    source-map "^0.5.0"
+
+"@babel/generator@^7.10.5":
+  version "7.10.5"
+  resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.10.5.tgz#1b903554bc8c583ee8d25f1e8969732e6b829a69"
+  integrity sha512-3vXxr3FEW7E7lJZiWQ3bM4+v/Vyr9C+hpolQ8BGFr9Y8Ri2tFLWTixmwKBafDujO1WVah4fhZBeU1bieKdghig==
+  dependencies:
+    "@babel/types" "^7.10.5"
+    jsesc "^2.5.1"
+    source-map "^0.5.0"
+
+"@babel/generator@^7.14.0":
+  version "7.14.1"
+  resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.14.1.tgz#1f99331babd65700183628da186f36f63d615c93"
+  integrity sha512-TMGhsXMXCP/O1WtQmZjpEYDhCYC9vFhayWZPJSZCGkPJgUqX0rF0wwtrYvnzVxIjcF80tkUertXVk5cwqi5cAQ==
+  dependencies:
+    "@babel/types" "^7.14.1"
+    jsesc "^2.5.1"
+    source-map "^0.5.0"
+
+"@babel/helper-compilation-targets@^7.13.16":
+  version "7.13.16"
+  resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.16.tgz#6e91dccf15e3f43e5556dffe32d860109887563c"
+  integrity sha512-3gmkYIrpqsLlieFwjkGgLaSHmhnvlAYzZLlYVjlW+QwI+1zE17kGxuJGmIqDQdYp56XdmGeD+Bswx0UTyG18xA==
+  dependencies:
+    "@babel/compat-data" "^7.13.15"
+    "@babel/helper-validator-option" "^7.12.17"
+    browserslist "^4.14.5"
+    semver "^6.3.0"
+
+"@babel/helper-function-name@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz#d2d3b20c59ad8c47112fa7d2a94bc09d5ef82f1a"
+  integrity sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==
+  dependencies:
+    "@babel/helper-get-function-arity" "^7.10.4"
+    "@babel/template" "^7.10.4"
+    "@babel/types" "^7.10.4"
+
+"@babel/helper-function-name@^7.12.13":
+  version "7.12.13"
+  resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz#93ad656db3c3c2232559fd7b2c3dbdcbe0eb377a"
+  integrity sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==
+  dependencies:
+    "@babel/helper-get-function-arity" "^7.12.13"
+    "@babel/template" "^7.12.13"
+    "@babel/types" "^7.12.13"
+
+"@babel/helper-get-function-arity@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz#98c1cbea0e2332f33f9a4661b8ce1505b2c19ba2"
+  integrity sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==
+  dependencies:
+    "@babel/types" "^7.10.4"
+
+"@babel/helper-get-function-arity@^7.12.13":
+  version "7.12.13"
+  resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz#bc63451d403a3b3082b97e1d8b3fe5bd4091e583"
+  integrity sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==
+  dependencies:
+    "@babel/types" "^7.12.13"
+
+"@babel/helper-member-expression-to-functions@^7.13.12":
+  version "7.13.12"
+  resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz#dfe368f26d426a07299d8d6513821768216e6d72"
+  integrity sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==
+  dependencies:
+    "@babel/types" "^7.13.12"
+
+"@babel/helper-module-imports@^7.13.12":
+  version "7.13.12"
+  resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz#c6a369a6f3621cb25da014078684da9196b61977"
+  integrity sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==
+  dependencies:
+    "@babel/types" "^7.13.12"
+
+"@babel/helper-module-transforms@^7.14.0":
+  version "7.14.0"
+  resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.14.0.tgz#8fcf78be220156f22633ee204ea81f73f826a8ad"
+  integrity sha512-L40t9bxIuGOfpIGA3HNkJhU9qYrf4y5A5LUSw7rGMSn+pcG8dfJ0g6Zval6YJGd2nEjI7oP00fRdnhLKndx6bw==
+  dependencies:
+    "@babel/helper-module-imports" "^7.13.12"
+    "@babel/helper-replace-supers" "^7.13.12"
+    "@babel/helper-simple-access" "^7.13.12"
+    "@babel/helper-split-export-declaration" "^7.12.13"
+    "@babel/helper-validator-identifier" "^7.14.0"
+    "@babel/template" "^7.12.13"
+    "@babel/traverse" "^7.14.0"
+    "@babel/types" "^7.14.0"
+
+"@babel/helper-optimise-call-expression@^7.12.13":
+  version "7.12.13"
+  resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz#5c02d171b4c8615b1e7163f888c1c81c30a2aaea"
+  integrity sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==
+  dependencies:
+    "@babel/types" "^7.12.13"
+
+"@babel/helper-replace-supers@^7.13.12":
+  version "7.13.12"
+  resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz#6442f4c1ad912502481a564a7386de0c77ff3804"
+  integrity sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==
+  dependencies:
+    "@babel/helper-member-expression-to-functions" "^7.13.12"
+    "@babel/helper-optimise-call-expression" "^7.12.13"
+    "@babel/traverse" "^7.13.0"
+    "@babel/types" "^7.13.12"
+
+"@babel/helper-simple-access@^7.13.12":
+  version "7.13.12"
+  resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz#dd6c538afb61819d205a012c31792a39c7a5eaf6"
+  integrity sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==
+  dependencies:
+    "@babel/types" "^7.13.12"
+
+"@babel/helper-split-export-declaration@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz#2c70576eaa3b5609b24cb99db2888cc3fc4251d1"
+  integrity sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==
+  dependencies:
+    "@babel/types" "^7.10.4"
+
+"@babel/helper-split-export-declaration@^7.12.13":
+  version "7.12.13"
+  resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz#e9430be00baf3e88b0e13e6f9d4eaf2136372b05"
+  integrity sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==
+  dependencies:
+    "@babel/types" "^7.12.13"
+
+"@babel/helper-validator-identifier@^7.10.4", "@babel/helper-validator-identifier@^7.14.0":
+  version "7.14.0"
+  resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz#d26cad8a47c65286b15df1547319a5d0bcf27288"
+  integrity sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==
+
+"@babel/helper-validator-option@^7.12.17":
+  version "7.12.17"
+  resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz#d1fbf012e1a79b7eebbfdc6d270baaf8d9eb9831"
+  integrity sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==
+
+"@babel/helpers@^7.14.0":
+  version "7.14.0"
+  resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.14.0.tgz#ea9b6be9478a13d6f961dbb5f36bf75e2f3b8f62"
+  integrity sha512-+ufuXprtQ1D1iZTO/K9+EBRn+qPWMJjZSw/S0KlFrxCw4tkrzv9grgpDHkY9MeQTjTY8i2sp7Jep8DfU6tN9Mg==
+  dependencies:
+    "@babel/template" "^7.12.13"
+    "@babel/traverse" "^7.14.0"
+    "@babel/types" "^7.14.0"
+
+"@babel/highlight@^7.10.4", "@babel/highlight@^7.12.13":
+  version "7.14.0"
+  resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.0.tgz#3197e375711ef6bf834e67d0daec88e4f46113cf"
+  integrity sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==
+  dependencies:
+    "@babel/helper-validator-identifier" "^7.14.0"
+    chalk "^2.0.0"
+    js-tokens "^4.0.0"
+
+"@babel/parser@^7.10.4", "@babel/parser@^7.10.5", "@babel/parser@^7.7.0":
+  version "7.10.5"
+  resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.10.5.tgz#e7c6bf5a7deff957cec9f04b551e2762909d826b"
+  integrity sha512-wfryxy4bE1UivvQKSQDU4/X6dr+i8bctjUjj8Zyt3DQy7NtPizJXT8M52nqpNKL+nq2PW8lxk4ZqLj0fD4B4hQ==
+
+"@babel/parser@^7.12.13", "@babel/parser@^7.14.0":
+  version "7.14.1"
+  resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.1.tgz#1bd644b5db3f5797c4479d89ec1817fe02b84c47"
+  integrity sha512-muUGEKu8E/ftMTPlNp+mc6zL3E9zKWmF5sDHZ5MSsoTP9Wyz64AhEf9kD08xYJ7w6Hdcu8H550ircnPyWSIF0Q==
+
+"@babel/runtime@^7.0.0":
+  version "7.10.5"
+  resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.10.5.tgz#303d8bd440ecd5a491eae6117fd3367698674c5c"
+  integrity sha512-otddXKhdNn7d0ptoFRHtMLa8LqDxLYwTjB4nYgM1yy5N6gU/MUf8zqyyLltCH3yAVitBzmwK4us+DD0l/MauAg==
+  dependencies:
+    regenerator-runtime "^0.13.4"
+
+"@babel/runtime@^7.12.5":
+  version "7.13.9"
+  resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.13.9.tgz#97dbe2116e2630c489f22e0656decd60aaa1fcee"
+  integrity sha512-aY2kU+xgJ3dJ1eU6FMB9EH8dIe8dmusF1xEku52joLvw6eAFN0AI+WxCLDnpev2LEejWBAy2sBvBOBAjI3zmvA==
+  dependencies:
+    regenerator-runtime "^0.13.4"
+
+"@babel/template@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.4.tgz#3251996c4200ebc71d1a8fc405fba940f36ba278"
+  integrity sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==
+  dependencies:
+    "@babel/code-frame" "^7.10.4"
+    "@babel/parser" "^7.10.4"
+    "@babel/types" "^7.10.4"
+
+"@babel/template@^7.12.13":
+  version "7.12.13"
+  resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.12.13.tgz#530265be8a2589dbb37523844c5bcb55947fb327"
+  integrity sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==
+  dependencies:
+    "@babel/code-frame" "^7.12.13"
+    "@babel/parser" "^7.12.13"
+    "@babel/types" "^7.12.13"
+
+"@babel/traverse@^7.13.0", "@babel/traverse@^7.14.0":
+  version "7.14.0"
+  resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.14.0.tgz#cea0dc8ae7e2b1dec65f512f39f3483e8cc95aef"
+  integrity sha512-dZ/a371EE5XNhTHomvtuLTUyx6UEoJmYX+DT5zBCQN3McHemsuIaKKYqsc/fs26BEkHs/lBZy0J571LP5z9kQA==
+  dependencies:
+    "@babel/code-frame" "^7.12.13"
+    "@babel/generator" "^7.14.0"
+    "@babel/helper-function-name" "^7.12.13"
+    "@babel/helper-split-export-declaration" "^7.12.13"
+    "@babel/parser" "^7.14.0"
+    "@babel/types" "^7.14.0"
+    debug "^4.1.0"
+    globals "^11.1.0"
+
+"@babel/traverse@^7.7.0":
+  version "7.10.5"
+  resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.10.5.tgz#77ce464f5b258be265af618d8fddf0536f20b564"
+  integrity sha512-yc/fyv2gUjPqzTz0WHeRJH2pv7jA9kA7mBX2tXl/x5iOE81uaVPuGPtaYk7wmkx4b67mQ7NqI8rmT2pF47KYKQ==
+  dependencies:
+    "@babel/code-frame" "^7.10.4"
+    "@babel/generator" "^7.10.5"
+    "@babel/helper-function-name" "^7.10.4"
+    "@babel/helper-split-export-declaration" "^7.10.4"
+    "@babel/parser" "^7.10.5"
+    "@babel/types" "^7.10.5"
+    debug "^4.1.0"
+    globals "^11.1.0"
+    lodash "^4.17.19"
+
+"@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.7.0":
+  version "7.10.5"
+  resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.10.5.tgz#d88ae7e2fde86bfbfe851d4d81afa70a997b5d15"
+  integrity sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==
+  dependencies:
+    "@babel/helper-validator-identifier" "^7.10.4"
+    lodash "^4.17.19"
+    to-fast-properties "^2.0.0"
+
+"@babel/types@^7.12.13", "@babel/types@^7.13.12", "@babel/types@^7.14.0", "@babel/types@^7.14.1":
+  version "7.14.1"
+  resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.14.1.tgz#095bd12f1c08ab63eff6e8f7745fa7c9cc15a9db"
+  integrity sha512-S13Qe85fzLs3gYRUnrpyeIrBJIMYv33qSTg1qoBwiG6nPKwUWAD9odSzWhEedpwOIzSEI6gbdQIWEMiCI42iBA==
+  dependencies:
+    "@babel/helper-validator-identifier" "^7.14.0"
+    to-fast-properties "^2.0.0"
+
+"@exodus/schemasafe@^1.0.0-rc.2":
+  version "1.0.0-rc.3"
+  resolved "https://registry.yarnpkg.com/@exodus/schemasafe/-/schemasafe-1.0.0-rc.3.tgz#dda2fbf3dafa5ad8c63dadff7e01d3fdf4736025"
+  integrity sha512-GoXw0U2Qaa33m3eUcxuHnHpNvHjNlLo0gtV091XBpaRINaB4X6FGCG5XKxSFNFiPpugUDqNruHzaqpTdDm4AOg==
+
+"@nodelib/fs.scandir@2.1.4":
+  version "2.1.4"
+  resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz#d4b3549a5db5de2683e0c1071ab4f140904bbf69"
+  integrity sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==
+  dependencies:
+    "@nodelib/fs.stat" "2.0.4"
+    run-parallel "^1.1.9"
+
+"@nodelib/fs.stat@2.0.4", "@nodelib/fs.stat@^2.0.2":
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz#a3f2dd61bab43b8db8fa108a121cfffe4c676655"
+  integrity sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==
+
+"@nodelib/fs.walk@^1.2.3":
+  version "1.2.6"
+  resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz#cce9396b30aa5afe9e3756608f5831adcb53d063"
+  integrity sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==
+  dependencies:
+    "@nodelib/fs.scandir" "2.1.4"
+    fastq "^1.6.0"
+
+"@npmcli/move-file@^1.0.1":
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.0.1.tgz#de103070dac0f48ce49cf6693c23af59c0f70464"
+  integrity sha512-Uv6h1sT+0DrblvIrolFtbvM1FgWm+/sy4B3pvLp67Zys+thcukzS5ekn7HsZFGpWP4Q3fYJCljbWQE/XivMRLw==
+  dependencies:
+    mkdirp "^1.0.4"
+
+"@redocly/react-dropdown-aria@^2.0.11":
+  version "2.0.11"
+  resolved "https://registry.yarnpkg.com/@redocly/react-dropdown-aria/-/react-dropdown-aria-2.0.11.tgz#532b864b329237e646abe45d0f8edc923e77370a"
+  integrity sha512-rmuSC2JFFl4DkPDdGVrmffT9KcbG2AB5jvhxPIrOc1dO9mHRMUUftQY35KZlvWqqSSqVn+AM+J9dhiTo1ZqR8A==
+
+"@stylelint/postcss-css-in-js@^0.37.2":
+  version "0.37.2"
+  resolved "https://registry.yarnpkg.com/@stylelint/postcss-css-in-js/-/postcss-css-in-js-0.37.2.tgz#7e5a84ad181f4234a2480803422a47b8749af3d2"
+  integrity sha512-nEhsFoJurt8oUmieT8qy4nk81WRHmJynmVwn/Vts08PL9fhgIsMhk1GId5yAN643OzqEEb5S/6At2TZW7pqPDA==
+  dependencies:
+    "@babel/core" ">=7.9.0"
+
+"@stylelint/postcss-markdown@^0.36.2":
+  version "0.36.2"
+  resolved "https://registry.yarnpkg.com/@stylelint/postcss-markdown/-/postcss-markdown-0.36.2.tgz#0a540c4692f8dcdfc13c8e352c17e7bfee2bb391"
+  integrity sha512-2kGbqUVJUGE8dM+bMzXG/PYUWKkjLIkRLWNh39OaADkiabDRdw8ATFCgbMz5xdIcvwspPAluSL7uY+ZiTWdWmQ==
+  dependencies:
+    remark "^13.0.0"
+    unist-util-find-all-after "^3.0.2"
+
+"@trysound/sax@0.1.1":
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.1.1.tgz#3348564048e7a2d7398c935d466c0414ebb6a669"
+  integrity sha512-Z6DoceYb/1xSg5+e+ZlPZ9v0N16ZvZ+wYMraFue4HYrE4ttONKtsvruIRf6t9TBR0YvSOfi1hUU0fJfBLCDYow==
+
+"@types/anymatch@*":
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/@types/anymatch/-/anymatch-1.3.1.tgz#336badc1beecb9dacc38bea2cf32adf627a8421a"
+  integrity sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA==
+
+"@types/color-name@^1.1.1":
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0"
+  integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==
+
+"@types/glob@^7.1.1":
+  version "7.1.3"
+  resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.3.tgz#e6ba80f36b7daad2c685acd9266382e68985c183"
+  integrity sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==
+  dependencies:
+    "@types/minimatch" "*"
+    "@types/node" "*"
+
+"@types/json-schema@^7.0.4":
+  version "7.0.5"
+  resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.5.tgz#dcce4430e64b443ba8945f0290fb564ad5bac6dd"
+  integrity sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ==
+
+"@types/json-schema@^7.0.6":
+  version "7.0.7"
+  resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.7.tgz#98a993516c859eb0d5c4c8f098317a9ea68db9ad"
+  integrity sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==
+
+"@types/json5@^0.0.29":
+  version "0.0.29"
+  resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee"
+  integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4=
+
+"@types/mdast@^3.0.0":
+  version "3.0.3"
+  resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.3.tgz#2d7d671b1cd1ea3deb306ea75036c2a0407d2deb"
+  integrity sha512-SXPBMnFVQg1s00dlMCc/jCdvPqdE4mXaMMCeRlxLDmTAEoegHT53xKtkDnzDTOcmMHUfcjyf36/YYZ6SxRdnsw==
+  dependencies:
+    "@types/unist" "*"
+
+"@types/minimatch@*":
+  version "3.0.3"
+  resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d"
+  integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==
+
+"@types/minimist@^1.2.0":
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.1.tgz#283f669ff76d7b8260df8ab7a4262cc83d988256"
+  integrity sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg==
+
+"@types/node@*":
+  version "14.0.24"
+  resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.24.tgz#b0f86f58564fa02a28b68f8b55d4cdec42e3b9d6"
+  integrity sha512-btt/oNOiDWcSuI721MdL8VQGnjsKjlTMdrKyTcLCKeQp/n4AAMFJ961wMbp+09y8WuGPClDEv07RIItdXKIXAA==
+
+"@types/node@^13.11.1":
+  version "13.13.14"
+  resolved "https://registry.yarnpkg.com/@types/node/-/node-13.13.14.tgz#20cd7d2a98f0c3b08d379f4ea9e6b315d2019529"
+  integrity sha512-Az3QsOt1U/K1pbCQ0TXGELTuTkPLOiFIQf3ILzbOyo0FqgV9SxRnxbxM5QlAveERZMHpZY+7u3Jz2tKyl+yg6g==
+
+"@types/normalize-package-data@^2.4.0":
+  version "2.4.0"
+  resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e"
+  integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==
+
+"@types/parse-json@^4.0.0":
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0"
+  integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==
+
+"@types/source-list-map@*":
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.2.tgz#0078836063ffaf17412349bba364087e0ac02ec9"
+  integrity sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==
+
+"@types/tapable@*":
+  version "1.0.6"
+  resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.6.tgz#a9ca4b70a18b270ccb2bc0aaafefd1d486b7ea74"
+  integrity sha512-W+bw9ds02rAQaMvaLYxAbJ6cvguW/iJXNT6lTssS1ps6QdrMKttqEAMEG/b5CR8TZl3/L7/lH0ZV5nNR1LXikA==
+
+"@types/uglify-js@*":
+  version "3.9.3"
+  resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.9.3.tgz#d94ed608e295bc5424c9600e6b8565407b6b4b6b"
+  integrity sha512-KswB5C7Kwduwjj04Ykz+AjvPcfgv/37Za24O2EDzYNbwyzOo8+ydtvzUfZ5UMguiVu29Gx44l1A6VsPPcmYu9w==
+  dependencies:
+    source-map "^0.6.1"
+
+"@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2":
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.3.tgz#9c088679876f374eb5983f150d4787aa6fb32d7e"
+  integrity sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==
+
+"@types/webpack-sources@*":
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-1.4.0.tgz#e58f1f05f87d39a5c64cf85705bdbdbb94d4d57e"
+  integrity sha512-c88dKrpSle9BtTqR6ifdaxu1Lvjsl3C5OsfvuUbUwdXymshv1TkufUAXBajCCUM/f/TmnkZC/Esb03MinzSiXQ==
+  dependencies:
+    "@types/node" "*"
+    "@types/source-list-map" "*"
+    source-map "^0.7.3"
+
+"@types/webpack@^4.4.31":
+  version "4.41.21"
+  resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.21.tgz#cc685b332c33f153bb2f5fc1fa3ac8adeb592dee"
+  integrity sha512-2j9WVnNrr/8PLAB5csW44xzQSJwS26aOnICsP3pSGCEdsu6KYtfQ6QJsVUKHWRnm1bL7HziJsfh5fHqth87yKA==
+  dependencies:
+    "@types/anymatch" "*"
+    "@types/node" "*"
+    "@types/tapable" "*"
+    "@types/uglify-js" "*"
+    "@types/webpack-sources" "*"
+    source-map "^0.6.0"
+
+"@webassemblyjs/ast@1.9.0":
+  version "1.9.0"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964"
+  integrity sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==
+  dependencies:
+    "@webassemblyjs/helper-module-context" "1.9.0"
+    "@webassemblyjs/helper-wasm-bytecode" "1.9.0"
+    "@webassemblyjs/wast-parser" "1.9.0"
+
+"@webassemblyjs/floating-point-hex-parser@1.9.0":
+  version "1.9.0"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz#3c3d3b271bddfc84deb00f71344438311d52ffb4"
+  integrity sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==
+
+"@webassemblyjs/helper-api-error@1.9.0":
+  version "1.9.0"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz#203f676e333b96c9da2eeab3ccef33c45928b6a2"
+  integrity sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==
+
+"@webassemblyjs/helper-buffer@1.9.0":
+  version "1.9.0"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz#a1442d269c5feb23fcbc9ef759dac3547f29de00"
+  integrity sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==
+
+"@webassemblyjs/helper-code-frame@1.9.0":
+  version "1.9.0"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz#647f8892cd2043a82ac0c8c5e75c36f1d9159f27"
+  integrity sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==
+  dependencies:
+    "@webassemblyjs/wast-printer" "1.9.0"
+
+"@webassemblyjs/helper-fsm@1.9.0":
+  version "1.9.0"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz#c05256b71244214671f4b08ec108ad63b70eddb8"
+  integrity sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==
+
+"@webassemblyjs/helper-module-context@1.9.0":
+  version "1.9.0"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz#25d8884b76839871a08a6c6f806c3979ef712f07"
+  integrity sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==
+  dependencies:
+    "@webassemblyjs/ast" "1.9.0"
+
+"@webassemblyjs/helper-wasm-bytecode@1.9.0":
+  version "1.9.0"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz#4fed8beac9b8c14f8c58b70d124d549dd1fe5790"
+  integrity sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==
+
+"@webassemblyjs/helper-wasm-section@1.9.0":
+  version "1.9.0"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz#5a4138d5a6292ba18b04c5ae49717e4167965346"
+  integrity sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==
+  dependencies:
+    "@webassemblyjs/ast" "1.9.0"
+    "@webassemblyjs/helper-buffer" "1.9.0"
+    "@webassemblyjs/helper-wasm-bytecode" "1.9.0"
+    "@webassemblyjs/wasm-gen" "1.9.0"
+
+"@webassemblyjs/ieee754@1.9.0":
+  version "1.9.0"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz#15c7a0fbaae83fb26143bbacf6d6df1702ad39e4"
+  integrity sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==
+  dependencies:
+    "@xtuc/ieee754" "^1.2.0"
+
+"@webassemblyjs/leb128@1.9.0":
+  version "1.9.0"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.9.0.tgz#f19ca0b76a6dc55623a09cffa769e838fa1e1c95"
+  integrity sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==
+  dependencies:
+    "@xtuc/long" "4.2.2"
+
+"@webassemblyjs/utf8@1.9.0":
+  version "1.9.0"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.9.0.tgz#04d33b636f78e6a6813227e82402f7637b6229ab"
+  integrity sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==
+
+"@webassemblyjs/wasm-edit@1.9.0":
+  version "1.9.0"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz#3fe6d79d3f0f922183aa86002c42dd256cfee9cf"
+  integrity sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==
+  dependencies:
+    "@webassemblyjs/ast" "1.9.0"
+    "@webassemblyjs/helper-buffer" "1.9.0"
+    "@webassemblyjs/helper-wasm-bytecode" "1.9.0"
+    "@webassemblyjs/helper-wasm-section" "1.9.0"
+    "@webassemblyjs/wasm-gen" "1.9.0"
+    "@webassemblyjs/wasm-opt" "1.9.0"
+    "@webassemblyjs/wasm-parser" "1.9.0"
+    "@webassemblyjs/wast-printer" "1.9.0"
+
+"@webassemblyjs/wasm-gen@1.9.0":
+  version "1.9.0"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz#50bc70ec68ded8e2763b01a1418bf43491a7a49c"
+  integrity sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==
+  dependencies:
+    "@webassemblyjs/ast" "1.9.0"
+    "@webassemblyjs/helper-wasm-bytecode" "1.9.0"
+    "@webassemblyjs/ieee754" "1.9.0"
+    "@webassemblyjs/leb128" "1.9.0"
+    "@webassemblyjs/utf8" "1.9.0"
+
+"@webassemblyjs/wasm-opt@1.9.0":
+  version "1.9.0"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz#2211181e5b31326443cc8112eb9f0b9028721a61"
+  integrity sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==
+  dependencies:
+    "@webassemblyjs/ast" "1.9.0"
+    "@webassemblyjs/helper-buffer" "1.9.0"
+    "@webassemblyjs/wasm-gen" "1.9.0"
+    "@webassemblyjs/wasm-parser" "1.9.0"
+
+"@webassemblyjs/wasm-parser@1.9.0":
+  version "1.9.0"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz#9d48e44826df4a6598294aa6c87469d642fff65e"
+  integrity sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==
+  dependencies:
+    "@webassemblyjs/ast" "1.9.0"
+    "@webassemblyjs/helper-api-error" "1.9.0"
+    "@webassemblyjs/helper-wasm-bytecode" "1.9.0"
+    "@webassemblyjs/ieee754" "1.9.0"
+    "@webassemblyjs/leb128" "1.9.0"
+    "@webassemblyjs/utf8" "1.9.0"
+
+"@webassemblyjs/wast-parser@1.9.0":
+  version "1.9.0"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz#3031115d79ac5bd261556cecc3fa90a3ef451914"
+  integrity sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==
+  dependencies:
+    "@webassemblyjs/ast" "1.9.0"
+    "@webassemblyjs/floating-point-hex-parser" "1.9.0"
+    "@webassemblyjs/helper-api-error" "1.9.0"
+    "@webassemblyjs/helper-code-frame" "1.9.0"
+    "@webassemblyjs/helper-fsm" "1.9.0"
+    "@xtuc/long" "4.2.2"
+
+"@webassemblyjs/wast-printer@1.9.0":
+  version "1.9.0"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz#4935d54c85fef637b00ce9f52377451d00d47899"
+  integrity sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==
+  dependencies:
+    "@webassemblyjs/ast" "1.9.0"
+    "@webassemblyjs/wast-parser" "1.9.0"
+    "@xtuc/long" "4.2.2"
+
+"@xtuc/ieee754@^1.2.0":
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790"
+  integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==
+
+"@xtuc/long@4.2.2":
+  version "4.2.2"
+  resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d"
+  integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==
+
+acorn-jsx@^5.2.0:
+  version "5.2.0"
+  resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe"
+  integrity sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==
+
+acorn@^6.4.1:
+  version "6.4.1"
+  resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474"
+  integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==
+
+acorn@^7.3.1:
+  version "7.3.1"
+  resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.3.1.tgz#85010754db53c3fbaf3b9ea3e083aa5c5d147ffd"
+  integrity sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA==
+
+aggregate-error@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.0.1.tgz#db2fe7246e536f40d9b5442a39e117d7dd6a24e0"
+  integrity sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==
+  dependencies:
+    clean-stack "^2.0.0"
+    indent-string "^4.0.0"
+
+ajv-errors@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d"
+  integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==
+
+ajv-keywords@^3.1.0, ajv-keywords@^3.4.1:
+  version "3.5.1"
+  resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.1.tgz#b83ca89c5d42d69031f424cad49aada0236c6957"
+  integrity sha512-KWcq3xN8fDjSB+IMoh2VaXVhRI0BBGxoYp3rx7Pkb6z0cFjYR9Q9l4yZqqals0/zsioCmocC5H6UvsGD4MoIBA==
+
+ajv-keywords@^3.5.2:
+  version "3.5.2"
+  resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d"
+  integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==
+
+ajv@^5.5.2:
+  version "5.5.2"
+  resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965"
+  integrity sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=
+  dependencies:
+    co "^4.6.0"
+    fast-deep-equal "^1.0.0"
+    fast-json-stable-stringify "^2.0.0"
+    json-schema-traverse "^0.3.0"
+
+ajv@^6.1.0, ajv@^6.10.0, ajv@^6.12.2:
+  version "6.12.3"
+  resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.3.tgz#18c5af38a111ddeb4f2697bd78d68abc1cabd706"
+  integrity sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==
+  dependencies:
+    fast-deep-equal "^3.1.1"
+    fast-json-stable-stringify "^2.0.0"
+    json-schema-traverse "^0.4.1"
+    uri-js "^4.2.2"
+
+ajv@^6.10.2, ajv@^6.12.5:
+  version "6.12.6"
+  resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
+  integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
+  dependencies:
+    fast-deep-equal "^3.1.1"
+    fast-json-stable-stringify "^2.0.0"
+    json-schema-traverse "^0.4.1"
+    uri-js "^4.2.2"
+
+ajv@^8.0.1:
+  version "8.3.0"
+  resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.3.0.tgz#25ee7348e32cdc4a1dbb38256bf6bdc451dd577c"
+  integrity sha512-RYE7B5An83d7eWnDR8kbdaIFqmKCNsP16ay1hDbJEU+sa0e3H9SebskCt0Uufem6cfAVu7Col6ubcn/W+Sm8/Q==
+  dependencies:
+    fast-deep-equal "^3.1.1"
+    json-schema-traverse "^1.0.0"
+    require-from-string "^2.0.2"
+    uri-js "^4.2.2"
+
+alphanum-sort@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3"
+  integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=
+
+ansi-colors@^4.1.1:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348"
+  integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==
+
+ansi-regex@^2.0.0:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
+  integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8=
+
+ansi-regex@^4.1.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997"
+  integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==
+
+ansi-regex@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75"
+  integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==
+
+ansi-styles@^2.2.1:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
+  integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=
+
+ansi-styles@^3.2.0, ansi-styles@^3.2.1:
+  version "3.2.1"
+  resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
+  integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
+  dependencies:
+    color-convert "^1.9.0"
+
+ansi-styles@^4.0.0:
+  version "4.2.1"
+  resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359"
+  integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==
+  dependencies:
+    "@types/color-name" "^1.1.1"
+    color-convert "^2.0.1"
+
+ansi-styles@^4.1.0:
+  version "4.3.0"
+  resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
+  integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
+  dependencies:
+    color-convert "^2.0.1"
+
+anymatch@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb"
+  integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==
+  dependencies:
+    micromatch "^3.1.4"
+    normalize-path "^2.1.1"
+
+anymatch@~3.1.1:
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142"
+  integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==
+  dependencies:
+    normalize-path "^3.0.0"
+    picomatch "^2.0.4"
+
+aproba@^1.1.1:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
+  integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==
+
+argparse@^1.0.7:
+  version "1.0.10"
+  resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
+  integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
+  dependencies:
+    sprintf-js "~1.0.2"
+
+arr-diff@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
+  integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=
+
+arr-flatten@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
+  integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==
+
+arr-union@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
+  integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=
+
+array-includes@^3.1.1:
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.1.tgz#cdd67e6852bdf9c1215460786732255ed2459348"
+  integrity sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==
+  dependencies:
+    define-properties "^1.1.3"
+    es-abstract "^1.17.0"
+    is-string "^1.0.5"
+
+array-union@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39"
+  integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=
+  dependencies:
+    array-uniq "^1.0.1"
+
+array-union@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d"
+  integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==
+
+array-uniq@^1.0.1:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6"
+  integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=
+
+array-unique@^0.3.2:
+  version "0.3.2"
+  resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
+  integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=
+
+array.prototype.flat@^1.2.3:
+  version "1.2.3"
+  resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz#0de82b426b0318dbfdb940089e38b043d37f6c7b"
+  integrity sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==
+  dependencies:
+    define-properties "^1.1.3"
+    es-abstract "^1.17.0-next.1"
+
+arrify@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
+  integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=
+
+asn1.js@^4.0.0:
+  version "4.10.1"
+  resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0"
+  integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==
+  dependencies:
+    bn.js "^4.0.0"
+    inherits "^2.0.1"
+    minimalistic-assert "^1.0.0"
+
+assert@^1.1.1:
+  version "1.5.0"
+  resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb"
+  integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==
+  dependencies:
+    object-assign "^4.1.1"
+    util "0.10.3"
+
+assign-symbols@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
+  integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=
+
+astral-regex@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9"
+  integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==
+
+astral-regex@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31"
+  integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==
+
+async-each@^1.0.1:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf"
+  integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==
+
+atob@^2.1.2:
+  version "2.1.2"
+  resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
+  integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==
+
+autoprefixer@^9.8.6:
+  version "9.8.6"
+  resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.6.tgz#3b73594ca1bf9266320c5acf1588d74dea74210f"
+  integrity sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==
+  dependencies:
+    browserslist "^4.12.0"
+    caniuse-lite "^1.0.30001109"
+    colorette "^1.2.1"
+    normalize-range "^0.1.2"
+    num2fraction "^1.2.2"
+    postcss "^7.0.32"
+    postcss-value-parser "^4.1.0"
+
+babel-code-frame@^6.26.0:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b"
+  integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=
+  dependencies:
+    chalk "^1.1.3"
+    esutils "^2.0.2"
+    js-tokens "^3.0.2"
+
+babel-core@^6.26.0, babel-core@^6.26.3:
+  version "6.26.3"
+  resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207"
+  integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==
+  dependencies:
+    babel-code-frame "^6.26.0"
+    babel-generator "^6.26.0"
+    babel-helpers "^6.24.1"
+    babel-messages "^6.23.0"
+    babel-register "^6.26.0"
+    babel-runtime "^6.26.0"
+    babel-template "^6.26.0"
+    babel-traverse "^6.26.0"
+    babel-types "^6.26.0"
+    babylon "^6.18.0"
+    convert-source-map "^1.5.1"
+    debug "^2.6.9"
+    json5 "^0.5.1"
+    lodash "^4.17.4"
+    minimatch "^3.0.4"
+    path-is-absolute "^1.0.1"
+    private "^0.1.8"
+    slash "^1.0.0"
+    source-map "^0.5.7"
+
+babel-eslint@^10.1.0:
+  version "10.1.0"
+  resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.1.0.tgz#6968e568a910b78fb3779cdd8b6ac2f479943232"
+  integrity sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==
+  dependencies:
+    "@babel/code-frame" "^7.0.0"
+    "@babel/parser" "^7.7.0"
+    "@babel/traverse" "^7.7.0"
+    "@babel/types" "^7.7.0"
+    eslint-visitor-keys "^1.0.0"
+    resolve "^1.12.0"
+
+babel-generator@^6.26.0:
+  version "6.26.1"
+  resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90"
+  integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==
+  dependencies:
+    babel-messages "^6.23.0"
+    babel-runtime "^6.26.0"
+    babel-types "^6.26.0"
+    detect-indent "^4.0.0"
+    jsesc "^1.3.0"
+    lodash "^4.17.4"
+    source-map "^0.5.7"
+    trim-right "^1.0.1"
+
+babel-helpers@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2"
+  integrity sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+
+babel-loader@^8.1.0:
+  version "8.1.0"
+  resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.1.0.tgz#c611d5112bd5209abe8b9fa84c3e4da25275f1c3"
+  integrity sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==
+  dependencies:
+    find-cache-dir "^2.1.0"
+    loader-utils "^1.4.0"
+    mkdirp "^0.5.3"
+    pify "^4.0.1"
+    schema-utils "^2.6.5"
+
+babel-messages@^6.23.0:
+  version "6.23.0"
+  resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e"
+  integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-css-modules-transform@^1.6.1:
+  version "1.6.2"
+  resolved "https://registry.yarnpkg.com/babel-plugin-css-modules-transform/-/babel-plugin-css-modules-transform-1.6.2.tgz#eecf4889637bf1c56cda25ee21df060775d1bd22"
+  integrity sha512-zBsI54N5n979vfYpqFzQ6oRwEiVcmLH5REyaincNW+Ecl52nvRsQPYIbDcJzHePrXI20YSRUw6G/qbPwZZDgfg==
+  dependencies:
+    css-modules-require-hook "^4.0.6"
+    mkdirp "^0.5.1"
+
+babel-polyfill@^6.26.0:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153"
+  integrity sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=
+  dependencies:
+    babel-runtime "^6.26.0"
+    core-js "^2.5.0"
+    regenerator-runtime "^0.10.5"
+
+babel-register@^6.26.0:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071"
+  integrity sha1-btAhFz4vy0htestFxgCahW9kcHE=
+  dependencies:
+    babel-core "^6.26.0"
+    babel-runtime "^6.26.0"
+    core-js "^2.5.0"
+    home-or-tmp "^2.0.0"
+    lodash "^4.17.4"
+    mkdirp "^0.5.1"
+    source-map-support "^0.4.15"
+
+babel-runtime@^6.22.0, babel-runtime@^6.26.0:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
+  integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4=
+  dependencies:
+    core-js "^2.4.0"
+    regenerator-runtime "^0.11.0"
+
+babel-template@^6.24.1, babel-template@^6.26.0:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02"
+  integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=
+  dependencies:
+    babel-runtime "^6.26.0"
+    babel-traverse "^6.26.0"
+    babel-types "^6.26.0"
+    babylon "^6.18.0"
+    lodash "^4.17.4"
+
+babel-traverse@^6.26.0:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee"
+  integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=
+  dependencies:
+    babel-code-frame "^6.26.0"
+    babel-messages "^6.23.0"
+    babel-runtime "^6.26.0"
+    babel-types "^6.26.0"
+    babylon "^6.18.0"
+    debug "^2.6.8"
+    globals "^9.18.0"
+    invariant "^2.2.2"
+    lodash "^4.17.4"
+
+babel-types@^6.26.0:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497"
+  integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=
+  dependencies:
+    babel-runtime "^6.26.0"
+    esutils "^2.0.2"
+    lodash "^4.17.4"
+    to-fast-properties "^1.0.3"
+
+babel@^6.23.0:
+  version "6.23.0"
+  resolved "https://registry.yarnpkg.com/babel/-/babel-6.23.0.tgz#d0d1e7d803e974765beea3232d4e153c0efb90f4"
+  integrity sha1-0NHn2APpdHZb7qMjLU4VPA77kPQ=
+
+babylon@^6.18.0:
+  version "6.18.0"
+  resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3"
+  integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==
+
+bail@^1.0.0:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776"
+  integrity sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==
+
+balanced-match@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
+  integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
+
+balanced-match@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-2.0.0.tgz#dc70f920d78db8b858535795867bf48f820633d9"
+  integrity sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==
+
+base64-js@^1.0.2:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1"
+  integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==
+
+base@^0.11.1:
+  version "0.11.2"
+  resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f"
+  integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==
+  dependencies:
+    cache-base "^1.0.1"
+    class-utils "^0.3.5"
+    component-emitter "^1.2.1"
+    define-property "^1.0.0"
+    isobject "^3.0.1"
+    mixin-deep "^1.2.0"
+    pascalcase "^0.1.1"
+
+better-ajv-errors@^0.6.1, better-ajv-errors@^0.6.7:
+  version "0.6.7"
+  resolved "https://registry.yarnpkg.com/better-ajv-errors/-/better-ajv-errors-0.6.7.tgz#b5344af1ce10f434fe02fc4390a5a9c811e470d1"
+  integrity sha512-PYgt/sCzR4aGpyNy5+ViSQ77ognMnWq7745zM+/flYO4/Yisdtp9wDQW2IKCyVYPUxQt3E/b5GBSwfhd1LPdlg==
+  dependencies:
+    "@babel/code-frame" "^7.0.0"
+    "@babel/runtime" "^7.0.0"
+    chalk "^2.4.1"
+    core-js "^3.2.1"
+    json-to-ast "^2.0.3"
+    jsonpointer "^4.0.1"
+    leven "^3.1.0"
+
+big.js@^3.1.3:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e"
+  integrity sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==
+
+big.js@^5.2.2:
+  version "5.2.2"
+  resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328"
+  integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==
+
+binary-extensions@^1.0.0:
+  version "1.13.1"
+  resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65"
+  integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==
+
+binary-extensions@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.1.0.tgz#30fa40c9e7fe07dbc895678cd287024dea241dd9"
+  integrity sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==
+
+bindings@^1.5.0:
+  version "1.5.0"
+  resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df"
+  integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==
+  dependencies:
+    file-uri-to-path "1.0.0"
+
+bluebird@^3.5.5:
+  version "3.7.2"
+  resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
+  integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==
+
+bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9:
+  version "4.12.0"
+  resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88"
+  integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==
+
+bn.js@^5.1.1:
+  version "5.1.2"
+  resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.2.tgz#c9686902d3c9a27729f43ab10f9d79c2004da7b0"
+  integrity sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA==
+
+boolbase@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
+  integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24=
+
+bootstrap-3-typeahead@^4.0.2:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/bootstrap-3-typeahead/-/bootstrap-3-typeahead-4.0.2.tgz#cb1c969044856862096fc8c71cc21b3acbb50412"
+  integrity sha1-yxyWkESFaGIJb8jHHMIbOsu1BBI=
+
+bootstrap@^3.3:
+  version "3.4.1"
+  resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-3.4.1.tgz#c3a347d419e289ad11f4033e3c4132b87c081d72"
+  integrity sha512-yN5oZVmRCwe5aKwzRj6736nSmKDX7pLYwsXiCj/EYmo16hODaBiT4En5btW/jhBF/seV+XMx3aYwukYC3A49DA==
+
+brace-expansion@^1.1.7:
+  version "1.1.11"
+  resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
+  integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
+  dependencies:
+    balanced-match "^1.0.0"
+    concat-map "0.0.1"
+
+braces@^2.3.1, braces@^2.3.2:
+  version "2.3.2"
+  resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729"
+  integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==
+  dependencies:
+    arr-flatten "^1.1.0"
+    array-unique "^0.3.2"
+    extend-shallow "^2.0.1"
+    fill-range "^4.0.0"
+    isobject "^3.0.1"
+    repeat-element "^1.1.2"
+    snapdragon "^0.8.1"
+    snapdragon-node "^2.0.1"
+    split-string "^3.0.2"
+    to-regex "^3.0.1"
+
+braces@^3.0.1, braces@~3.0.2:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
+  integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
+  dependencies:
+    fill-range "^7.0.1"
+
+brorand@^1.0.1, brorand@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
+  integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=
+
+browserify-aes@^1.0.0, browserify-aes@^1.0.4:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48"
+  integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==
+  dependencies:
+    buffer-xor "^1.0.3"
+    cipher-base "^1.0.0"
+    create-hash "^1.1.0"
+    evp_bytestokey "^1.0.3"
+    inherits "^2.0.1"
+    safe-buffer "^5.0.1"
+
+browserify-cipher@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0"
+  integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==
+  dependencies:
+    browserify-aes "^1.0.4"
+    browserify-des "^1.0.0"
+    evp_bytestokey "^1.0.0"
+
+browserify-des@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c"
+  integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==
+  dependencies:
+    cipher-base "^1.0.1"
+    des.js "^1.0.0"
+    inherits "^2.0.1"
+    safe-buffer "^5.1.2"
+
+browserify-rsa@^4.0.0, browserify-rsa@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524"
+  integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=
+  dependencies:
+    bn.js "^4.1.0"
+    randombytes "^2.0.1"
+
+browserify-sign@^4.0.0:
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.0.tgz#545d0b1b07e6b2c99211082bf1b12cce7a0b0e11"
+  integrity sha512-hEZC1KEeYuoHRqhGhTy6gWrpJA3ZDjFWv0DE61643ZnOXAKJb3u7yWcrU0mMc9SwAqK1n7myPGndkp0dFG7NFA==
+  dependencies:
+    bn.js "^5.1.1"
+    browserify-rsa "^4.0.1"
+    create-hash "^1.2.0"
+    create-hmac "^1.1.7"
+    elliptic "^6.5.2"
+    inherits "^2.0.4"
+    parse-asn1 "^5.1.5"
+    readable-stream "^3.6.0"
+    safe-buffer "^5.2.0"
+
+browserify-zlib@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f"
+  integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==
+  dependencies:
+    pako "~1.0.5"
+
+browserslist@^4.0.0:
+  version "4.14.5"
+  resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.14.5.tgz#1c751461a102ddc60e40993639b709be7f2c4015"
+  integrity sha512-Z+vsCZIvCBvqLoYkBFTwEYH3v5MCQbsAjp50ERycpOjnPmolg1Gjy4+KaWWpm8QOJt9GHkhdqAl14NpCX73CWA==
+  dependencies:
+    caniuse-lite "^1.0.30001135"
+    electron-to-chromium "^1.3.571"
+    escalade "^3.1.0"
+    node-releases "^1.1.61"
+
+browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.16.0, browserslist@^4.16.6:
+  version "4.16.6"
+  resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.6.tgz#d7901277a5a88e554ed305b183ec9b0c08f66fa2"
+  integrity sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==
+  dependencies:
+    caniuse-lite "^1.0.30001219"
+    colorette "^1.2.2"
+    electron-to-chromium "^1.3.723"
+    escalade "^3.1.1"
+    node-releases "^1.1.71"
+
+buffer-from@^1.0.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
+  integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==
+
+buffer-xor@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
+  integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=
+
+buffer@^4.3.0:
+  version "4.9.2"
+  resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8"
+  integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==
+  dependencies:
+    base64-js "^1.0.2"
+    ieee754 "^1.1.4"
+    isarray "^1.0.0"
+
+builtin-status-codes@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
+  integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=
+
+cacache@^12.0.2:
+  version "12.0.4"
+  resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c"
+  integrity sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==
+  dependencies:
+    bluebird "^3.5.5"
+    chownr "^1.1.1"
+    figgy-pudding "^3.5.1"
+    glob "^7.1.4"
+    graceful-fs "^4.1.15"
+    infer-owner "^1.0.3"
+    lru-cache "^5.1.1"
+    mississippi "^3.0.0"
+    mkdirp "^0.5.1"
+    move-concurrently "^1.0.1"
+    promise-inflight "^1.0.1"
+    rimraf "^2.6.3"
+    ssri "^6.0.1"
+    unique-filename "^1.1.1"
+    y18n "^4.0.0"
+
+cacache@^15.0.4:
+  version "15.0.5"
+  resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.0.5.tgz#69162833da29170d6732334643c60e005f5f17d0"
+  integrity sha512-lloiL22n7sOjEEXdL8NAjTgv9a1u43xICE9/203qonkZUCj5X1UEWIdf2/Y0d6QcCtMzbKQyhrcDbdvlZTs/+A==
+  dependencies:
+    "@npmcli/move-file" "^1.0.1"
+    chownr "^2.0.0"
+    fs-minipass "^2.0.0"
+    glob "^7.1.4"
+    infer-owner "^1.0.4"
+    lru-cache "^6.0.0"
+    minipass "^3.1.1"
+    minipass-collect "^1.0.2"
+    minipass-flush "^1.0.5"
+    minipass-pipeline "^1.2.2"
+    mkdirp "^1.0.3"
+    p-map "^4.0.0"
+    promise-inflight "^1.0.1"
+    rimraf "^3.0.2"
+    ssri "^8.0.0"
+    tar "^6.0.2"
+    unique-filename "^1.1.1"
+
+cache-base@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2"
+  integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==
+  dependencies:
+    collection-visit "^1.0.0"
+    component-emitter "^1.2.1"
+    get-value "^2.0.6"
+    has-value "^1.0.0"
+    isobject "^3.0.1"
+    set-value "^2.0.0"
+    to-object-path "^0.3.0"
+    union-value "^1.0.0"
+    unset-value "^1.0.0"
+
+call-me-maybe@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b"
+  integrity sha1-JtII6onje1y95gJQoV8DHBak1ms=
+
+callsites@^3.0.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
+  integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
+
+camelcase-keys@^6.2.2:
+  version "6.2.2"
+  resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0"
+  integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==
+  dependencies:
+    camelcase "^5.3.1"
+    map-obj "^4.0.0"
+    quick-lru "^4.0.1"
+
+camelcase@^5.0.0, camelcase@^5.3.1:
+  version "5.3.1"
+  resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
+  integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
+
+caniuse-api@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0"
+  integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==
+  dependencies:
+    browserslist "^4.0.0"
+    caniuse-lite "^1.0.0"
+    lodash.memoize "^4.1.2"
+    lodash.uniq "^4.5.0"
+
+caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001135, caniuse-lite@^1.0.30001219:
+  version "1.0.30001236"
+  resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001236.tgz#0a80de4cdf62e1770bb46a30d884fc8d633e3958"
+  integrity sha512-o0PRQSrSCGJKCPZcgMzl5fUaj5xHe8qA2m4QRvnyY4e1lITqoNkr7q/Oh1NcpGSy0Th97UZ35yoKcINPoq7YOQ==
+
+chalk@^1.1.3:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
+  integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=
+  dependencies:
+    ansi-styles "^2.2.1"
+    escape-string-regexp "^1.0.2"
+    has-ansi "^2.0.0"
+    strip-ansi "^3.0.0"
+    supports-color "^2.0.0"
+
+chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2:
+  version "2.4.2"
+  resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
+  integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
+  dependencies:
+    ansi-styles "^3.2.1"
+    escape-string-regexp "^1.0.5"
+    supports-color "^5.3.0"
+
+chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad"
+  integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==
+  dependencies:
+    ansi-styles "^4.1.0"
+    supports-color "^7.1.0"
+
+character-entities-legacy@^1.0.0:
+  version "1.1.4"
+  resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1"
+  integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==
+
+character-entities@^1.0.0:
+  version "1.2.4"
+  resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b"
+  integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==
+
+character-reference-invalid@^1.0.0:
+  version "1.1.4"
+  resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560"
+  integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==
+
+chokidar@^2.1.8:
+  version "2.1.8"
+  resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917"
+  integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==
+  dependencies:
+    anymatch "^2.0.0"
+    async-each "^1.0.1"
+    braces "^2.3.2"
+    glob-parent "^3.1.0"
+    inherits "^2.0.3"
+    is-binary-path "^1.0.0"
+    is-glob "^4.0.0"
+    normalize-path "^3.0.0"
+    path-is-absolute "^1.0.0"
+    readdirp "^2.2.1"
+    upath "^1.1.1"
+  optionalDependencies:
+    fsevents "^1.2.7"
+
+chokidar@^3.4.0:
+  version "3.4.1"
+  resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.1.tgz#e905bdecf10eaa0a0b1db0c664481cc4cbc22ba1"
+  integrity sha512-TQTJyr2stihpC4Sya9hs2Xh+O2wf+igjL36Y75xx2WdHuiICcn/XJza46Jwt0eT5hVpQOzo3FpY3cj3RVYLX0g==
+  dependencies:
+    anymatch "~3.1.1"
+    braces "~3.0.2"
+    glob-parent "~5.1.0"
+    is-binary-path "~2.1.0"
+    is-glob "~4.0.1"
+    normalize-path "~3.0.0"
+    readdirp "~3.4.0"
+  optionalDependencies:
+    fsevents "~2.1.2"
+
+chownr@^1.1.1:
+  version "1.1.4"
+  resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b"
+  integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==
+
+chownr@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece"
+  integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==
+
+chrome-trace-event@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4"
+  integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==
+  dependencies:
+    tslib "^1.9.0"
+
+cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de"
+  integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==
+  dependencies:
+    inherits "^2.0.1"
+    safe-buffer "^5.0.1"
+
+class-utils@^0.3.5:
+  version "0.3.6"
+  resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463"
+  integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==
+  dependencies:
+    arr-union "^3.1.0"
+    define-property "^0.2.5"
+    isobject "^3.0.0"
+    static-extend "^0.1.1"
+
+classnames@^2.2.6:
+  version "2.2.6"
+  resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce"
+  integrity sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==
+
+clean-stack@^2.0.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b"
+  integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==
+
+clean-webpack-plugin@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/clean-webpack-plugin/-/clean-webpack-plugin-3.0.0.tgz#a99d8ec34c1c628a4541567aa7b457446460c62b"
+  integrity sha512-MciirUH5r+cYLGCOL5JX/ZLzOZbVr1ot3Fw+KcvbhUb6PM+yycqd9ZhIlcigQ5gl+XhppNmw3bEFuaaMNyLj3A==
+  dependencies:
+    "@types/webpack" "^4.4.31"
+    del "^4.1.1"
+
+cli@~1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/cli/-/cli-1.0.1.tgz#22817534f24bfa4950c34d532d48ecbc621b8c14"
+  integrity sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=
+  dependencies:
+    exit "0.1.2"
+    glob "^7.1.1"
+
+clipboard@^2.0.0:
+  version "2.0.6"
+  resolved "https://registry.yarnpkg.com/clipboard/-/clipboard-2.0.6.tgz#52921296eec0fdf77ead1749421b21c968647376"
+  integrity sha512-g5zbiixBRk/wyKakSwCKd7vQXDjFnAMGHoEyBogG/bw9kTD9GvdAvaoRR1ALcEzt3pVKxZR0pViekPMIS0QyGg==
+  dependencies:
+    good-listener "^1.2.2"
+    select "^1.1.2"
+    tiny-emitter "^2.0.0"
+
+cliui@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5"
+  integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==
+  dependencies:
+    string-width "^3.1.0"
+    strip-ansi "^5.2.0"
+    wrap-ansi "^5.1.0"
+
+cliui@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1"
+  integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==
+  dependencies:
+    string-width "^4.2.0"
+    strip-ansi "^6.0.0"
+    wrap-ansi "^6.2.0"
+
+cliui@^7.0.2:
+  version "7.0.4"
+  resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f"
+  integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==
+  dependencies:
+    string-width "^4.2.0"
+    strip-ansi "^6.0.0"
+    wrap-ansi "^7.0.0"
+
+clone-regexp@^2.1.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/clone-regexp/-/clone-regexp-2.2.0.tgz#7d65e00885cd8796405c35a737e7a86b7429e36f"
+  integrity sha512-beMpP7BOtTipFuW8hrJvREQ2DrRu3BE7by0ZpibtfBA+qfHYvMGTc2Yb1JMYPKg/JUw0CHYvpg796aNTSW9z7Q==
+  dependencies:
+    is-regexp "^2.0.0"
+
+clsx@^1.1.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.1.1.tgz#98b3134f9abbdf23b2663491ace13c5c03a73188"
+  integrity sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==
+
+co@^4.6.0:
+  version "4.6.0"
+  resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
+  integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=
+
+code-error-fragment@0.0.230:
+  version "0.0.230"
+  resolved "https://registry.yarnpkg.com/code-error-fragment/-/code-error-fragment-0.0.230.tgz#d736d75c832445342eca1d1fedbf17d9618b14d7"
+  integrity sha512-cadkfKp6932H8UkhzE/gcUqhRMNf8jHzkAN7+5Myabswaghu4xABTgPHDCjW+dBAJxj/SpkTYokpzDqY4pCzQw==
+
+codemirror@^5.59.1:
+  version "5.59.1"
+  resolved "https://registry.yarnpkg.com/codemirror/-/codemirror-5.59.1.tgz#cd6465555a87f8a2243eb41ffb460c777e15212c"
+  integrity sha512-d0SSW/PCCD4LoSCBPdnP0BzmZB1v3emomCUtVlIWgZHJ06yVeBOvBtOH7vYz707pfAvEeWbO9aP6akh8vl1V3w==
+
+collection-visit@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0"
+  integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=
+  dependencies:
+    map-visit "^1.0.0"
+    object-visit "^1.0.0"
+
+color-convert@^1.9.0:
+  version "1.9.3"
+  resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
+  integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
+  dependencies:
+    color-name "1.1.3"
+
+color-convert@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
+  integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
+  dependencies:
+    color-name "~1.1.4"
+
+color-name@1.1.3:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
+  integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
+
+color-name@~1.1.4:
+  version "1.1.4"
+  resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
+  integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
+
+colord@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/colord/-/colord-2.0.1.tgz#1e7fb1f9fa1cf74f42c58cb9c20320bab8435aa0"
+  integrity sha512-vm5YpaWamD0Ov6TSG0GGmUIwstrWcfKQV/h2CmbR7PbNu41+qdB5PW9lpzhjedrpm08uuYvcXi0Oel1RLZIJuA==
+
+colorette@^1.2.1, colorette@^1.2.2:
+  version "1.2.2"
+  resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94"
+  integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==
+
+commander@2, commander@^2.20.0:
+  version "2.20.3"
+  resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
+  integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
+
+commander@^7.1.0:
+  version "7.2.0"
+  resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7"
+  integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==
+
+commondir@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
+  integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=
+
+component-emitter@^1.2.1:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0"
+  integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==
+
+concat-map@0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+  integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
+
+concat-stream@^1.5.0:
+  version "1.6.2"
+  resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34"
+  integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==
+  dependencies:
+    buffer-from "^1.0.0"
+    inherits "^2.0.3"
+    readable-stream "^2.2.2"
+    typedarray "^0.0.6"
+
+confusing-browser-globals@^1.0.9:
+  version "1.0.9"
+  resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz#72bc13b483c0276801681871d4898516f8f54fdd"
+  integrity sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw==
+
+console-browserify@1.1.x:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10"
+  integrity sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=
+  dependencies:
+    date-now "^0.1.4"
+
+console-browserify@^1.1.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336"
+  integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==
+
+constants-browserify@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75"
+  integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=
+
+contains-path@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a"
+  integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=
+
+convert-source-map@^1.5.1, convert-source-map@^1.7.0:
+  version "1.7.0"
+  resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442"
+  integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==
+  dependencies:
+    safe-buffer "~5.1.1"
+
+copy-concurrently@^1.0.0:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0"
+  integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==
+  dependencies:
+    aproba "^1.1.1"
+    fs-write-stream-atomic "^1.0.8"
+    iferr "^0.1.5"
+    mkdirp "^0.5.1"
+    rimraf "^2.5.4"
+    run-queue "^1.0.0"
+
+copy-descriptor@^0.1.0:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
+  integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=
+
+copy-webpack-plugin@^6.0.3:
+  version "6.0.3"
+  resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-6.0.3.tgz#2b3d2bfc6861b96432a65f0149720adbd902040b"
+  integrity sha512-q5m6Vz4elsuyVEIUXr7wJdIdePWTubsqVbEMvf1WQnHGv0Q+9yPRu7MtYFPt+GBOXRav9lvIINifTQ1vSCs+eA==
+  dependencies:
+    cacache "^15.0.4"
+    fast-glob "^3.2.4"
+    find-cache-dir "^3.3.1"
+    glob-parent "^5.1.1"
+    globby "^11.0.1"
+    loader-utils "^2.0.0"
+    normalize-path "^3.0.0"
+    p-limit "^3.0.1"
+    schema-utils "^2.7.0"
+    serialize-javascript "^4.0.0"
+    webpack-sources "^1.4.3"
+
+core-js@^2.4.0, core-js@^2.5.0:
+  version "2.6.11"
+  resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c"
+  integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==
+
+core-js@^3.2.1:
+  version "3.6.5"
+  resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.5.tgz#7395dc273af37fb2e50e9bd3d9fe841285231d1a"
+  integrity sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==
+
+core-util-is@~1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
+  integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
+
+cosmiconfig@^7.0.0:
+  version "7.0.0"
+  resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.0.tgz#ef9b44d773959cae63ddecd122de23853b60f8d3"
+  integrity sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==
+  dependencies:
+    "@types/parse-json" "^4.0.0"
+    import-fresh "^3.2.1"
+    parse-json "^5.0.0"
+    path-type "^4.0.0"
+    yaml "^1.10.0"
+
+create-ecdh@^4.0.0:
+  version "4.0.3"
+  resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff"
+  integrity sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==
+  dependencies:
+    bn.js "^4.1.0"
+    elliptic "^6.0.0"
+
+create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196"
+  integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==
+  dependencies:
+    cipher-base "^1.0.1"
+    inherits "^2.0.1"
+    md5.js "^1.3.4"
+    ripemd160 "^2.0.1"
+    sha.js "^2.4.0"
+
+create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7:
+  version "1.1.7"
+  resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff"
+  integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==
+  dependencies:
+    cipher-base "^1.0.3"
+    create-hash "^1.1.0"
+    inherits "^2.0.1"
+    ripemd160 "^2.0.0"
+    safe-buffer "^5.0.1"
+    sha.js "^2.4.8"
+
+cross-spawn@^6.0.5:
+  version "6.0.5"
+  resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
+  integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==
+  dependencies:
+    nice-try "^1.0.4"
+    path-key "^2.0.1"
+    semver "^5.5.0"
+    shebang-command "^1.2.0"
+    which "^1.2.9"
+
+cross-spawn@^7.0.2:
+  version "7.0.3"
+  resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
+  integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
+  dependencies:
+    path-key "^3.1.0"
+    shebang-command "^2.0.0"
+    which "^2.0.1"
+
+crypto-browserify@^3.11.0:
+  version "3.12.0"
+  resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec"
+  integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==
+  dependencies:
+    browserify-cipher "^1.0.0"
+    browserify-sign "^4.0.0"
+    create-ecdh "^4.0.0"
+    create-hash "^1.1.0"
+    create-hmac "^1.1.0"
+    diffie-hellman "^5.0.0"
+    inherits "^2.0.1"
+    pbkdf2 "^3.0.3"
+    public-encrypt "^4.0.0"
+    randombytes "^2.0.0"
+    randomfill "^1.0.3"
+
+css-color-names@^0.0.4:
+  version "0.0.4"
+  resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0"
+  integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=
+
+css-color-names@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-1.0.1.tgz#6ff7ee81a823ad46e020fa2fd6ab40a887e2ba67"
+  integrity sha512-/loXYOch1qU1biStIFsHH8SxTmOseh1IJqFvy8IujXOm1h+QjUdDhkzOrR5HG8K8mlxREj0yfi8ewCHx0eMxzA==
+
+css-declaration-sorter@^6.0.3:
+  version "6.0.3"
+  resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-6.0.3.tgz#9dfd8ea0df4cc7846827876fafb52314890c21a9"
+  integrity sha512-52P95mvW1SMzuRZegvpluT6yEv0FqQusydKQPZsNN5Q7hh8EwQvN8E2nwuJ16BBvNN6LcoIZXu/Bk58DAhrrxw==
+  dependencies:
+    timsort "^0.3.0"
+
+css-loader@^3.4.2:
+  version "3.6.0"
+  resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.6.0.tgz#2e4b2c7e6e2d27f8c8f28f61bffcd2e6c91ef645"
+  integrity sha512-M5lSukoWi1If8dhQAUCvj4H8vUt3vOnwbQBH9DdTm/s4Ym2B/3dPMtYZeJmq7Q3S3Pa+I94DcZ7pc9bP14cWIQ==
+  dependencies:
+    camelcase "^5.3.1"
+    cssesc "^3.0.0"
+    icss-utils "^4.1.1"
+    loader-utils "^1.2.3"
+    normalize-path "^3.0.0"
+    postcss "^7.0.32"
+    postcss-modules-extract-imports "^2.0.0"
+    postcss-modules-local-by-default "^3.0.2"
+    postcss-modules-scope "^2.2.0"
+    postcss-modules-values "^3.0.0"
+    postcss-value-parser "^4.1.0"
+    schema-utils "^2.7.0"
+    semver "^6.3.0"
+
+css-modules-require-hook@^4.0.6:
+  version "4.2.3"
+  resolved "https://registry.yarnpkg.com/css-modules-require-hook/-/css-modules-require-hook-4.2.3.tgz#6792ca412b15e23e6f9be6a07dcef7f577ff904d"
+  integrity sha1-Z5LKQSsV4j5vm+agfc739Xf/kE0=
+  dependencies:
+    debug "^2.2.0"
+    generic-names "^1.0.1"
+    glob-to-regexp "^0.3.0"
+    icss-replace-symbols "^1.0.2"
+    lodash "^4.3.0"
+    postcss "^6.0.1"
+    postcss-modules-extract-imports "^1.0.0"
+    postcss-modules-local-by-default "^1.0.1"
+    postcss-modules-resolve-imports "^1.3.0"
+    postcss-modules-scope "^1.0.0"
+    postcss-modules-values "^1.1.1"
+    seekout "^1.0.1"
+
+css-select@^3.1.2:
+  version "3.1.2"
+  resolved "https://registry.yarnpkg.com/css-select/-/css-select-3.1.2.tgz#d52cbdc6fee379fba97fb0d3925abbd18af2d9d8"
+  integrity sha512-qmss1EihSuBNWNNhHjxzxSfJoFBM/lERB/Q4EnsJQQC62R2evJDW481091oAdOr9uh46/0n4nrg0It5cAnj1RA==
+  dependencies:
+    boolbase "^1.0.0"
+    css-what "^4.0.0"
+    domhandler "^4.0.0"
+    domutils "^2.4.3"
+    nth-check "^2.0.0"
+
+css-selector-tokenizer@^0.7.0:
+  version "0.7.1"
+  resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz#a177271a8bca5019172f4f891fc6eed9cbf68d5d"
+  integrity sha512-xYL0AMZJ4gFzJQsHUKa5jiWWi2vH77WVNg7JYRyewwj6oPh4yb/y6Y9ZCw9dsj/9UauMhtuxR+ogQd//EdEVNA==
+  dependencies:
+    cssesc "^0.1.0"
+    fastparse "^1.1.1"
+    regexpu-core "^1.0.0"
+
+css-tree@^1.1.2:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d"
+  integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==
+  dependencies:
+    mdn-data "2.0.14"
+    source-map "^0.6.1"
+
+css-what@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/css-what/-/css-what-4.0.0.tgz#35e73761cab2eeb3d3661126b23d7aa0e8432233"
+  integrity sha512-teijzG7kwYfNVsUh2H/YN62xW3KK9YhXEgSlbxMlcyjPNvdKJqFx5lrwlJgoFP1ZHlB89iGDlo/JyshKeRhv5A==
+
+cssesc@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-0.1.0.tgz#c814903e45623371a0477b40109aaafbeeaddbb4"
+  integrity sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=
+
+cssesc@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee"
+  integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==
+
+cssnano-preset-default@^5.1.3:
+  version "5.1.3"
+  resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-5.1.3.tgz#caa54183a8c8df03124a9e23f374ab89df5a9a99"
+  integrity sha512-qo9tX+t4yAAZ/yagVV3b+QBKeLklQbmgR3wI7mccrDcR+bEk9iHgZN1E7doX68y9ThznLya3RDmR+nc7l6/2WQ==
+  dependencies:
+    css-declaration-sorter "^6.0.3"
+    cssnano-utils "^2.0.1"
+    postcss-calc "^8.0.0"
+    postcss-colormin "^5.2.0"
+    postcss-convert-values "^5.0.1"
+    postcss-discard-comments "^5.0.1"
+    postcss-discard-duplicates "^5.0.1"
+    postcss-discard-empty "^5.0.1"
+    postcss-discard-overridden "^5.0.1"
+    postcss-merge-longhand "^5.0.2"
+    postcss-merge-rules "^5.0.2"
+    postcss-minify-font-values "^5.0.1"
+    postcss-minify-gradients "^5.0.1"
+    postcss-minify-params "^5.0.1"
+    postcss-minify-selectors "^5.1.0"
+    postcss-normalize-charset "^5.0.1"
+    postcss-normalize-display-values "^5.0.1"
+    postcss-normalize-positions "^5.0.1"
+    postcss-normalize-repeat-style "^5.0.1"
+    postcss-normalize-string "^5.0.1"
+    postcss-normalize-timing-functions "^5.0.1"
+    postcss-normalize-unicode "^5.0.1"
+    postcss-normalize-url "^5.0.2"
+    postcss-normalize-whitespace "^5.0.1"
+    postcss-ordered-values "^5.0.2"
+    postcss-reduce-initial "^5.0.1"
+    postcss-reduce-transforms "^5.0.1"
+    postcss-svgo "^5.0.2"
+    postcss-unique-selectors "^5.0.1"
+
+cssnano-utils@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-2.0.1.tgz#8660aa2b37ed869d2e2f22918196a9a8b6498ce2"
+  integrity sha512-i8vLRZTnEH9ubIyfdZCAdIdgnHAUeQeByEeQ2I7oTilvP9oHO6RScpeq3GsFUVqeB8uZgOQ9pw8utofNn32hhQ==
+
+cssnano@^5.0.2:
+  version "5.0.6"
+  resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-5.0.6.tgz#2a91ad34c6521ae31eab3da9c90108ea3093535d"
+  integrity sha512-NiaLH/7yqGksFGsFNvSRe2IV/qmEBAeDE64dYeD8OBrgp6lE8YoMeQJMtsv5ijo6MPyhuoOvFhI94reahBRDkw==
+  dependencies:
+    cosmiconfig "^7.0.0"
+    cssnano-preset-default "^5.1.3"
+    is-resolvable "^1.1.0"
+
+csso@^4.2.0:
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529"
+  integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==
+  dependencies:
+    css-tree "^1.1.2"
+
+cyclist@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9"
+  integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=
+
+d3-array@1, d3-array@^1.1.1, d3-array@^1.2.0:
+  version "1.2.4"
+  resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-1.2.4.tgz#635ce4d5eea759f6f605863dbcfc30edc737f71f"
+  integrity sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==
+
+d3-axis@1:
+  version "1.0.12"
+  resolved "https://registry.yarnpkg.com/d3-axis/-/d3-axis-1.0.12.tgz#cdf20ba210cfbb43795af33756886fb3638daac9"
+  integrity sha512-ejINPfPSNdGFKEOAtnBtdkpr24c4d4jsei6Lg98mxf424ivoDP2956/5HDpIAtmHo85lqT4pruy+zEgvRUBqaQ==
+
+d3-brush@1:
+  version "1.1.5"
+  resolved "https://registry.yarnpkg.com/d3-brush/-/d3-brush-1.1.5.tgz#066b8e84d17b192986030446c97c0fba7e1bacdc"
+  integrity sha512-rEaJ5gHlgLxXugWjIkolTA0OyMvw8UWU1imYXy1v642XyyswmI1ybKOv05Ft+ewq+TFmdliD3VuK0pRp1VT/5A==
+  dependencies:
+    d3-dispatch "1"
+    d3-drag "1"
+    d3-interpolate "1"
+    d3-selection "1"
+    d3-transition "1"
+
+d3-chord@1:
+  version "1.0.6"
+  resolved "https://registry.yarnpkg.com/d3-chord/-/d3-chord-1.0.6.tgz#309157e3f2db2c752f0280fedd35f2067ccbb15f"
+  integrity sha512-JXA2Dro1Fxw9rJe33Uv+Ckr5IrAa74TlfDEhE/jfLOaXegMQFQTAgAw9WnZL8+HxVBRXaRGCkrNU7pJeylRIuA==
+  dependencies:
+    d3-array "1"
+    d3-path "1"
+
+d3-collection@1, d3-collection@^1.0.4:
+  version "1.0.7"
+  resolved "https://registry.yarnpkg.com/d3-collection/-/d3-collection-1.0.7.tgz#349bd2aa9977db071091c13144d5e4f16b5b310e"
+  integrity sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==
+
+d3-color@1:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-1.4.0.tgz#89c45a995ed773b13314f06460df26d60ba0ecaf"
+  integrity sha512-TzNPeJy2+iEepfiL92LAAB7fvnp/dV2YwANPVHdDWmYMm23qIJBYww3qT8I8C1wXrmrg4UWs7BKc2tKIgyjzHg==
+
+d3-contour@1:
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/d3-contour/-/d3-contour-1.3.2.tgz#652aacd500d2264cb3423cee10db69f6f59bead3"
+  integrity sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg==
+  dependencies:
+    d3-array "^1.1.1"
+
+d3-dispatch@1:
+  version "1.0.6"
+  resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-1.0.6.tgz#00d37bcee4dd8cd97729dd893a0ac29caaba5d58"
+  integrity sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==
+
+d3-drag@1:
+  version "1.2.5"
+  resolved "https://registry.yarnpkg.com/d3-drag/-/d3-drag-1.2.5.tgz#2537f451acd39d31406677b7dc77c82f7d988f70"
+  integrity sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w==
+  dependencies:
+    d3-dispatch "1"
+    d3-selection "1"
+
+d3-dsv@1:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/d3-dsv/-/d3-dsv-1.2.0.tgz#9d5f75c3a5f8abd611f74d3f5847b0d4338b885c"
+  integrity sha512-9yVlqvZcSOMhCYzniHE7EVUws7Fa1zgw+/EAV2BxJoG3ME19V6BQFBwI855XQDsxyOuG7NibqRMTtiF/Qup46g==
+  dependencies:
+    commander "2"
+    iconv-lite "0.4"
+    rw "1"
+
+d3-ease@1:
+  version "1.0.6"
+  resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-1.0.6.tgz#ebdb6da22dfac0a22222f2d4da06f66c416a0ec0"
+  integrity sha512-SZ/lVU7LRXafqp7XtIcBdxnWl8yyLpgOmzAk0mWBI9gXNzLDx5ybZgnRbH9dN/yY5tzVBqCQ9avltSnqVwessQ==
+
+d3-fetch@1:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/d3-fetch/-/d3-fetch-1.1.2.tgz#957c8fbc6d4480599ba191b1b2518bf86b3e1be2"
+  integrity sha512-S2loaQCV/ZeyTyIF2oP8D1K9Z4QizUzW7cWeAOAS4U88qOt3Ucf6GsmgthuYSdyB2HyEm4CeGvkQxWsmInsIVA==
+  dependencies:
+    d3-dsv "1"
+
+d3-force@1:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/d3-force/-/d3-force-1.2.1.tgz#fd29a5d1ff181c9e7f0669e4bd72bdb0e914ec0b"
+  integrity sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg==
+  dependencies:
+    d3-collection "1"
+    d3-dispatch "1"
+    d3-quadtree "1"
+    d3-timer "1"
+
+d3-format@1:
+  version "1.4.3"
+  resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-1.4.3.tgz#4e8eb4dff3fdcb891a8489ec6e698601c41b96f1"
+  integrity sha512-mm/nE2Y9HgGyjP+rKIekeITVgBtX97o1nrvHCWX8F/yBYyevUTvu9vb5pUnKwrcSw7o7GuwMOWjS9gFDs4O+uQ==
+
+d3-geo@1:
+  version "1.11.9"
+  resolved "https://registry.yarnpkg.com/d3-geo/-/d3-geo-1.11.9.tgz#77eaed14ba62fc2c0aef55cd2943849c866f7ae6"
+  integrity sha512-9edcH6J3s/Aa3KJITWqFJbyB/8q3mMlA9Fi7z6yy+FAYMnRaxmC7jBhUnsINxVWD14GmqX3DK8uk7nV6/Ekt4A==
+  dependencies:
+    d3-array "1"
+
+d3-hierarchy@1:
+  version "1.1.9"
+  resolved "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz#2f6bee24caaea43f8dc37545fa01628559647a83"
+  integrity sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==
+
+d3-interpolate@1:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-1.4.0.tgz#526e79e2d80daa383f9e0c1c1c7dcc0f0583e987"
+  integrity sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==
+  dependencies:
+    d3-color "1"
+
+d3-path@1:
+  version "1.0.9"
+  resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-1.0.9.tgz#48c050bb1fe8c262493a8caf5524e3e9591701cf"
+  integrity sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==
+
+"d3-path@1 - 2":
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-2.0.0.tgz#55d86ac131a0548adae241eebfb56b4582dd09d8"
+  integrity sha512-ZwZQxKhBnv9yHaiWd6ZU4x5BtCQ7pXszEV9CU6kRgwIQVQGLMv1oiL4M+MK/n79sYzsj+gcgpPQSctJUsLN7fA==
+
+d3-polygon@1:
+  version "1.0.6"
+  resolved "https://registry.yarnpkg.com/d3-polygon/-/d3-polygon-1.0.6.tgz#0bf8cb8180a6dc107f518ddf7975e12abbfbd38e"
+  integrity sha512-k+RF7WvI08PC8reEoXa/w2nSg5AUMTi+peBD9cmFc+0ixHfbs4QmxxkarVal1IkVkgxVuk9JSHhJURHiyHKAuQ==
+
+d3-quadtree@1:
+  version "1.0.7"
+  resolved "https://registry.yarnpkg.com/d3-quadtree/-/d3-quadtree-1.0.7.tgz#ca8b84df7bb53763fe3c2f24bd435137f4e53135"
+  integrity sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA==
+
+d3-random@1:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/d3-random/-/d3-random-1.1.2.tgz#2833be7c124360bf9e2d3fd4f33847cfe6cab291"
+  integrity sha512-6AK5BNpIFqP+cx/sreKzNjWbwZQCSUatxq+pPRmFIQaWuoD+NrbVWw7YWpHiXpCQ/NanKdtGDuB+VQcZDaEmYQ==
+
+d3-scale-chromatic@1:
+  version "1.5.0"
+  resolved "https://registry.yarnpkg.com/d3-scale-chromatic/-/d3-scale-chromatic-1.5.0.tgz#54e333fc78212f439b14641fb55801dd81135a98"
+  integrity sha512-ACcL46DYImpRFMBcpk9HhtIyC7bTBR4fNOPxwVSl0LfulDAwyiHyPOTqcDG1+t5d4P9W7t/2NAuWu59aKko/cg==
+  dependencies:
+    d3-color "1"
+    d3-interpolate "1"
+
+d3-scale@2:
+  version "2.2.2"
+  resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-2.2.2.tgz#4e880e0b2745acaaddd3ede26a9e908a9e17b81f"
+  integrity sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw==
+  dependencies:
+    d3-array "^1.2.0"
+    d3-collection "1"
+    d3-format "1"
+    d3-interpolate "1"
+    d3-time "1"
+    d3-time-format "2"
+
+d3-selection@1, d3-selection@^1.1.0, d3-selection@^1.3.0:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-1.4.1.tgz#98eedbbe085fbda5bafa2f9e3f3a2f4d7d622a98"
+  integrity sha512-BTIbRjv/m5rcVTfBs4AMBLKs4x8XaaLkwm28KWu9S2vKNqXkXt2AH2Qf0sdPZHjFxcWg/YL53zcqAz+3g4/7PA==
+
+d3-shape@1:
+  version "1.3.7"
+  resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-1.3.7.tgz#df63801be07bc986bc54f63789b4fe502992b5d7"
+  integrity sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==
+  dependencies:
+    d3-path "1"
+
+d3-shape@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-2.1.0.tgz#3b6a82ccafbc45de55b57fcf956c584ded3b666f"
+  integrity sha512-PnjUqfM2PpskbSLTJvAzp2Wv4CZsnAgTfcVRTwW03QR3MkXF8Uo7B1y/lWkAsmbKwuecto++4NlsYcvYpXpTHA==
+  dependencies:
+    d3-path "1 - 2"
+
+d3-time-format@2:
+  version "2.2.3"
+  resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-2.2.3.tgz#0c9a12ee28342b2037e5ea1cf0b9eb4dd75f29cb"
+  integrity sha512-RAHNnD8+XvC4Zc4d2A56Uw0yJoM7bsvOlJR33bclxq399Rak/b9bhvu/InjxdWhPtkgU53JJcleJTGkNRnN6IA==
+  dependencies:
+    d3-time "1"
+
+d3-time@1:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-1.1.0.tgz#b1e19d307dae9c900b7e5b25ffc5dcc249a8a0f1"
+  integrity sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==
+
+d3-timer@1:
+  version "1.0.10"
+  resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-1.0.10.tgz#dfe76b8a91748831b13b6d9c793ffbd508dd9de5"
+  integrity sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==
+
+d3-tip@^0.9.1:
+  version "0.9.1"
+  resolved "https://registry.yarnpkg.com/d3-tip/-/d3-tip-0.9.1.tgz#84e6d331c4e6650d80c5228a07e41820609ab64b"
+  integrity sha512-EVBfG9d+HnjIoyVXfhpytWxlF59JaobwizqMX9EBXtsFmJytjwHeYiUs74ldHQjE7S9vzfKTx2LCtvUrIbuFYg==
+  dependencies:
+    d3-collection "^1.0.4"
+    d3-selection "^1.3.0"
+
+d3-transition@1:
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/d3-transition/-/d3-transition-1.3.2.tgz#a98ef2151be8d8600543434c1ca80140ae23b398"
+  integrity sha512-sc0gRU4PFqZ47lPVHloMn9tlPcv8jxgOQg+0zjhfZXMQuvppjG6YuwdMBE0TuqCZjeJkLecku/l9R0JPcRhaDA==
+  dependencies:
+    d3-color "1"
+    d3-dispatch "1"
+    d3-ease "1"
+    d3-interpolate "1"
+    d3-selection "^1.1.0"
+    d3-timer "1"
+
+d3-voronoi@1:
+  version "1.1.4"
+  resolved "https://registry.yarnpkg.com/d3-voronoi/-/d3-voronoi-1.1.4.tgz#dd3c78d7653d2bb359284ae478645d95944c8297"
+  integrity sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg==
+
+d3-zoom@1:
+  version "1.8.3"
+  resolved "https://registry.yarnpkg.com/d3-zoom/-/d3-zoom-1.8.3.tgz#b6a3dbe738c7763121cd05b8a7795ffe17f4fc0a"
+  integrity sha512-VoLXTK4wvy1a0JpH2Il+F2CiOhVu7VRXWF5M/LroMIh3/zBAC3WAt7QoIvPibOavVo20hN6/37vwAsdBejLyKQ==
+  dependencies:
+    d3-dispatch "1"
+    d3-drag "1"
+    d3-interpolate "1"
+    d3-selection "1"
+    d3-transition "1"
+
+d3@^3.4.4:
+  version "3.5.17"
+  resolved "https://registry.yarnpkg.com/d3/-/d3-3.5.17.tgz#bc46748004378b21a360c9fc7cf5231790762fb8"
+  integrity sha1-vEZ0gAQ3iyGjYMn8fPUjF5B2L7g=
+
+d3@^5.14:
+  version "5.15.0"
+  resolved "https://registry.yarnpkg.com/d3/-/d3-5.15.0.tgz#ffd44958e6a3cb8a59a84429c45429b8bca5677a"
+  integrity sha512-C+E80SL2nLLtmykZ6klwYj5rPqB5nlfN5LdWEAVdWPppqTD8taoJi2PxLZjPeYT8FFRR2yucXq+kBlOnnvZeLg==
+  dependencies:
+    d3-array "1"
+    d3-axis "1"
+    d3-brush "1"
+    d3-chord "1"
+    d3-collection "1"
+    d3-color "1"
+    d3-contour "1"
+    d3-dispatch "1"
+    d3-drag "1"
+    d3-dsv "1"
+    d3-ease "1"
+    d3-fetch "1"
+    d3-force "1"
+    d3-format "1"
+    d3-geo "1"
+    d3-hierarchy "1"
+    d3-interpolate "1"
+    d3-path "1"
+    d3-polygon "1"
+    d3-quadtree "1"
+    d3-random "1"
+    d3-scale "2"
+    d3-scale-chromatic "1"
+    d3-selection "1"
+    d3-shape "1"
+    d3-time "1"
+    d3-time-format "2"
+    d3-timer "1"
+    d3-transition "1"
+    d3-voronoi "1"
+    d3-zoom "1"
+
+dagre-d3@^0.6.4:
+  version "0.6.4"
+  resolved "https://registry.yarnpkg.com/dagre-d3/-/dagre-d3-0.6.4.tgz#0728d5ce7f177ca2337df141ceb60fbe6eeb7b29"
+  integrity sha512-e/6jXeCP7/ptlAM48clmX4xTZc5Ek6T6kagS7Oz2HrYSdqcLZFLqpAfh7ldbZRFfxCZVyh61NEPR08UQRVxJzQ==
+  dependencies:
+    d3 "^5.14"
+    dagre "^0.8.5"
+    graphlib "^2.1.8"
+    lodash "^4.17.15"
+
+dagre@^0.8.5:
+  version "0.8.5"
+  resolved "https://registry.yarnpkg.com/dagre/-/dagre-0.8.5.tgz#ba30b0055dac12b6c1fcc247817442777d06afee"
+  integrity sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw==
+  dependencies:
+    graphlib "^2.1.8"
+    lodash "^4.17.15"
+
+datatables.net-bs@^1.10.23:
+  version "1.10.23"
+  resolved "https://registry.yarnpkg.com/datatables.net-bs/-/datatables.net-bs-1.10.23.tgz#985094ea63b28c630de4a0ecb75804ab53341fb0"
+  integrity sha512-O/kJxT93i9hIq8trdbHuIcHhrTodkVPfPqvxOqKK8lJ03XUUrT6V8ZoGyxROFjQGcgbye5CoRLVf7MY+5biOIQ==
+  dependencies:
+    datatables.net "1.10.23"
+    jquery ">=1.7"
+
+datatables.net@1.10.23, datatables.net@^1.10.23:
+  version "1.10.23"
+  resolved "https://registry.yarnpkg.com/datatables.net/-/datatables.net-1.10.23.tgz#59f7d7b12845183b1b379530d1385077e113ec01"
+  integrity sha512-we3tlNkzpxvgkKKlTxTMXPCt35untVXNg8zUYWpQyC1U5vJc+lT0+Zdc1ztK8d3lh5CfdnuFde2p8n3XwaGl3Q==
+  dependencies:
+    jquery ">=1.7"
+
+date-now@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b"
+  integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=
+
+debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9:
+  version "2.6.9"
+  resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
+  integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
+  dependencies:
+    ms "2.0.0"
+
+debug@^4.0.0, debug@^4.1.0, debug@^4.3.1:
+  version "4.3.1"
+  resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee"
+  integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==
+  dependencies:
+    ms "2.1.2"
+
+debug@^4.0.1:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791"
+  integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==
+  dependencies:
+    ms "^2.1.1"
+
+decamelize-keys@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9"
+  integrity sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=
+  dependencies:
+    decamelize "^1.1.0"
+    map-obj "^1.0.0"
+
+decamelize@^1.1.0, decamelize@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
+  integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=
+
+decko@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/decko/-/decko-1.2.0.tgz#fd43c735e967b8013306884a56fbe665996b6817"
+  integrity sha1-/UPHNelnuAEzBohKVvvmZZlraBc=
+
+decode-uri-component@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
+  integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=
+
+deep-is@^0.1.3:
+  version "0.1.3"
+  resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
+  integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=
+
+define-properties@^1.1.2, define-properties@^1.1.3:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1"
+  integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==
+  dependencies:
+    object-keys "^1.0.12"
+
+define-property@^0.2.5:
+  version "0.2.5"
+  resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116"
+  integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=
+  dependencies:
+    is-descriptor "^0.1.0"
+
+define-property@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6"
+  integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY=
+  dependencies:
+    is-descriptor "^1.0.0"
+
+define-property@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d"
+  integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==
+  dependencies:
+    is-descriptor "^1.0.2"
+    isobject "^3.0.1"
+
+del@^4.1.1:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4"
+  integrity sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==
+  dependencies:
+    "@types/glob" "^7.1.1"
+    globby "^6.1.0"
+    is-path-cwd "^2.0.0"
+    is-path-in-cwd "^2.0.0"
+    p-map "^2.0.0"
+    pify "^4.0.1"
+    rimraf "^2.6.3"
+
+delegate@^3.1.2:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/delegate/-/delegate-3.2.0.tgz#b66b71c3158522e8ab5744f720d8ca0c2af59166"
+  integrity sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==
+
+des.js@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843"
+  integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==
+  dependencies:
+    inherits "^2.0.1"
+    minimalistic-assert "^1.0.0"
+
+detect-file@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7"
+  integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=
+
+detect-indent@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208"
+  integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg=
+  dependencies:
+    repeating "^2.0.0"
+
+diffie-hellman@^5.0.0:
+  version "5.0.3"
+  resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875"
+  integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==
+  dependencies:
+    bn.js "^4.1.0"
+    miller-rabin "^4.0.0"
+    randombytes "^2.0.0"
+
+dir-glob@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f"
+  integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==
+  dependencies:
+    path-type "^4.0.0"
+
+doctrine@1.5.0:
+  version "1.5.0"
+  resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa"
+  integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=
+  dependencies:
+    esutils "^2.0.2"
+    isarray "^1.0.0"
+
+doctrine@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961"
+  integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==
+  dependencies:
+    esutils "^2.0.2"
+
+dom-serializer@0, dom-serializer@^0.2.1:
+  version "0.2.2"
+  resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51"
+  integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==
+  dependencies:
+    domelementtype "^2.0.1"
+    entities "^2.0.0"
+
+dom-serializer@^1.0.1:
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.3.2.tgz#6206437d32ceefaec7161803230c7a20bc1b4d91"
+  integrity sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==
+  dependencies:
+    domelementtype "^2.0.1"
+    domhandler "^4.2.0"
+    entities "^2.0.0"
+
+domain-browser@^1.1.1:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda"
+  integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==
+
+domelementtype@1, domelementtype@^1.3.1:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f"
+  integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==
+
+domelementtype@^2.0.1, domelementtype@^2.2.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57"
+  integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==
+
+domhandler@2.3:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.3.0.tgz#2de59a0822d5027fabff6f032c2b25a2a8abe738"
+  integrity sha1-LeWaCCLVAn+r/28DLCsloqir5zg=
+  dependencies:
+    domelementtype "1"
+
+domhandler@^2.3.0:
+  version "2.4.2"
+  resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803"
+  integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==
+  dependencies:
+    domelementtype "1"
+
+domhandler@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-3.0.0.tgz#51cd13efca31da95bbb0c5bee3a48300e333b3e9"
+  integrity sha512-eKLdI5v9m67kbXQbJSNn1zjh0SDzvzWVWtX+qEI3eMjZw8daH9k8rlj1FZY9memPwjiskQFbe7vHVVJIAqoEhw==
+  dependencies:
+    domelementtype "^2.0.1"
+
+domhandler@^4.0.0, domhandler@^4.2.0:
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.2.0.tgz#f9768a5f034be60a89a27c2e4d0f74eba0d8b059"
+  integrity sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA==
+  dependencies:
+    domelementtype "^2.2.0"
+
+dompurify@^2.0.12:
+  version "2.2.6"
+  resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.2.6.tgz#54945dc5c0b45ce5ae228705777e8e59d7b2edc4"
+  integrity sha512-7b7ZArhhH0SP6W2R9cqK6RjaU82FZ2UPM7RO8qN1b1wyvC/NY1FNWcX1Pu00fFOAnzEORtwXe4bPaClg6pUybQ==
+
+domutils@1.5:
+  version "1.5.1"
+  resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf"
+  integrity sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=
+  dependencies:
+    dom-serializer "0"
+    domelementtype "1"
+
+domutils@^1.5.1:
+  version "1.7.0"
+  resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a"
+  integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==
+  dependencies:
+    dom-serializer "0"
+    domelementtype "1"
+
+domutils@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.1.0.tgz#7ade3201af43703fde154952e3a868eb4b635f16"
+  integrity sha512-CD9M0Dm1iaHfQ1R/TI+z3/JWp/pgub0j4jIQKH89ARR4ATAV2nbaOQS5XxU9maJP5jHaPdDDQSEHuE2UmpUTKg==
+  dependencies:
+    dom-serializer "^0.2.1"
+    domelementtype "^2.0.1"
+    domhandler "^3.0.0"
+
+domutils@^2.4.3:
+  version "2.7.0"
+  resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.7.0.tgz#8ebaf0c41ebafcf55b0b72ec31c56323712c5442"
+  integrity sha512-8eaHa17IwJUPAiB+SoTYBo5mCdeMgdcAoXJ59m6DT1vw+5iLS3gNoqYaRowaBKtGVrOF1Jz4yDTgYKLK2kvfJg==
+  dependencies:
+    dom-serializer "^1.0.1"
+    domelementtype "^2.2.0"
+    domhandler "^4.2.0"
+
+duplexify@^3.4.2, duplexify@^3.6.0:
+  version "3.7.1"
+  resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309"
+  integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==
+  dependencies:
+    end-of-stream "^1.0.0"
+    inherits "^2.0.1"
+    readable-stream "^2.0.0"
+    stream-shift "^1.0.0"
+
+electron-to-chromium@^1.3.571:
+  version "1.3.580"
+  resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.580.tgz#eb27873cfa012c43c53c9e9129038b8fd7cb964f"
+  integrity sha512-5flHTbRpptO6h3lQUG4zdSAxryAS3PrZOkLpLS0DL5/y2LBf+l9HJ8X6UBorNs1QRBrMR7u/QvkdK+GlekW1kQ==
+
+electron-to-chromium@^1.3.723:
+  version "1.3.727"
+  resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.727.tgz#857e310ca00f0b75da4e1db6ff0e073cc4a91ddf"
+  integrity sha512-Mfz4FIB4FSvEwBpDfdipRIrwd6uo8gUDoRDF4QEYb4h4tSuI3ov594OrjU6on042UlFHouIJpClDODGkPcBSbg==
+
+elliptic@^6.0.0, elliptic@^6.5.2:
+  version "6.5.4"
+  resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb"
+  integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==
+  dependencies:
+    bn.js "^4.11.9"
+    brorand "^1.1.0"
+    hash.js "^1.0.0"
+    hmac-drbg "^1.0.1"
+    inherits "^2.0.4"
+    minimalistic-assert "^1.0.1"
+    minimalistic-crypto-utils "^1.0.1"
+
+emoji-regex@^7.0.1:
+  version "7.0.3"
+  resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156"
+  integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==
+
+emoji-regex@^8.0.0:
+  version "8.0.0"
+  resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
+  integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
+
+emojis-list@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389"
+  integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k=
+
+emojis-list@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78"
+  integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==
+
+end-of-stream@^1.0.0, end-of-stream@^1.1.0:
+  version "1.4.4"
+  resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
+  integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
+  dependencies:
+    once "^1.4.0"
+
+enhanced-resolve@^4.1.0, enhanced-resolve@^4.1.1:
+  version "4.3.0"
+  resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz#3b806f3bfafc1ec7de69551ef93cca46c1704126"
+  integrity sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==
+  dependencies:
+    graceful-fs "^4.1.2"
+    memory-fs "^0.5.0"
+    tapable "^1.0.0"
+
+enquirer@^2.3.5:
+  version "2.3.6"
+  resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d"
+  integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==
+  dependencies:
+    ansi-colors "^4.1.1"
+
+entities@1.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/entities/-/entities-1.0.0.tgz#b2987aa3821347fcde642b24fdfc9e4fb712bf26"
+  integrity sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=
+
+entities@^1.1.1:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56"
+  integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==
+
+entities@^2.0.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55"
+  integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==
+
+eonasdan-bootstrap-datetimepicker@^4.17.47:
+  version "4.17.47"
+  resolved "https://registry.yarnpkg.com/eonasdan-bootstrap-datetimepicker/-/eonasdan-bootstrap-datetimepicker-4.17.47.tgz#7a49970044065276e7965efd16f822735219e735"
+  integrity sha1-ekmXAEQGUnbnll79Fvgic1IZ5zU=
+  dependencies:
+    bootstrap "^3.3"
+    jquery "^1.8.3 || ^2.0 || ^3.0"
+    moment "^2.10"
+    moment-timezone "^0.4.0"
+
+errno@^0.1.3, errno@~0.1.7:
+  version "0.1.7"
+  resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618"
+  integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==
+  dependencies:
+    prr "~1.0.1"
+
+error-ex@^1.2.0, error-ex@^1.3.1:
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
+  integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
+  dependencies:
+    is-arrayish "^0.2.1"
+
+es-abstract@^1.17.0, es-abstract@^1.17.5:
+  version "1.17.6"
+  resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.6.tgz#9142071707857b2cacc7b89ecb670316c3e2d52a"
+  integrity sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==
+  dependencies:
+    es-to-primitive "^1.2.1"
+    function-bind "^1.1.1"
+    has "^1.0.3"
+    has-symbols "^1.0.1"
+    is-callable "^1.2.0"
+    is-regex "^1.1.0"
+    object-inspect "^1.7.0"
+    object-keys "^1.1.1"
+    object.assign "^4.1.0"
+    string.prototype.trimend "^1.0.1"
+    string.prototype.trimstart "^1.0.1"
+
+es-abstract@^1.17.0-next.1:
+  version "1.17.0-next.1"
+  resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.0-next.1.tgz#94acc93e20b05a6e96dacb5ab2f1cb3a81fc2172"
+  integrity sha512-7MmGr03N7Rnuid6+wyhD9sHNE2n4tFSwExnU2lQl3lIo2ShXWGePY80zYaoMOmILWv57H0amMjZGHNzzGG70Rw==
+  dependencies:
+    es-to-primitive "^1.2.1"
+    function-bind "^1.1.1"
+    has "^1.0.3"
+    has-symbols "^1.0.1"
+    is-callable "^1.1.4"
+    is-regex "^1.0.4"
+    object-inspect "^1.7.0"
+    object-keys "^1.1.1"
+    object.assign "^4.1.0"
+    string.prototype.trimleft "^2.1.0"
+    string.prototype.trimright "^2.1.0"
+
+es-to-primitive@^1.2.1:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a"
+  integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==
+  dependencies:
+    is-callable "^1.1.4"
+    is-date-object "^1.0.1"
+    is-symbol "^1.0.2"
+
+es6-promise@^3.2.1:
+  version "3.3.1"
+  resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613"
+  integrity sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=
+
+escalade@^3.1.0, escalade@^3.1.1:
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"
+  integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==
+
+escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+  integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
+
+eslint-config-airbnb-base@^14.2.0:
+  version "14.2.0"
+  resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.0.tgz#fe89c24b3f9dc8008c9c0d0d88c28f95ed65e9c4"
+  integrity sha512-Snswd5oC6nJaevs3nZoLSTvGJBvzTfnBqOIArkf3cbyTyq9UD79wOk8s+RiL6bhca0p/eRO6veczhf6A/7Jy8Q==
+  dependencies:
+    confusing-browser-globals "^1.0.9"
+    object.assign "^4.1.0"
+    object.entries "^1.1.2"
+
+eslint-import-resolver-node@^0.3.3:
+  version "0.3.4"
+  resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz#85ffa81942c25012d8231096ddf679c03042c717"
+  integrity sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==
+  dependencies:
+    debug "^2.6.9"
+    resolve "^1.13.1"
+
+eslint-module-utils@^2.6.0:
+  version "2.6.0"
+  resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz#579ebd094f56af7797d19c9866c9c9486629bfa6"
+  integrity sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==
+  dependencies:
+    debug "^2.6.9"
+    pkg-dir "^2.0.0"
+
+eslint-plugin-es@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz#75a7cdfdccddc0589934aeeb384175f221c57893"
+  integrity sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==
+  dependencies:
+    eslint-utils "^2.0.0"
+    regexpp "^3.0.0"
+
+eslint-plugin-html@^6.0.2:
+  version "6.0.2"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-html/-/eslint-plugin-html-6.0.2.tgz#fcbd293e218d03dd72c147fc999d185c6f5989fe"
+  integrity sha512-Ik/z32UteKLo8GEfwNqVKcJ/WOz/be4h8N5mbMmxxnZ+9aL9XczOXQFz/bGu+nAGVoRg8CflldxJhONFpqlrxw==
+  dependencies:
+    htmlparser2 "^4.1.0"
+
+eslint-plugin-import@^2.22.0:
+  version "2.22.0"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.22.0.tgz#92f7736fe1fde3e2de77623c838dd992ff5ffb7e"
+  integrity sha512-66Fpf1Ln6aIS5Gr/55ts19eUuoDhAbZgnr6UxK5hbDx6l/QgQgx61AePq+BV4PP2uXQFClgMVzep5zZ94qqsxg==
+  dependencies:
+    array-includes "^3.1.1"
+    array.prototype.flat "^1.2.3"
+    contains-path "^0.1.0"
+    debug "^2.6.9"
+    doctrine "1.5.0"
+    eslint-import-resolver-node "^0.3.3"
+    eslint-module-utils "^2.6.0"
+    has "^1.0.3"
+    minimatch "^3.0.4"
+    object.values "^1.1.1"
+    read-pkg-up "^2.0.0"
+    resolve "^1.17.0"
+    tsconfig-paths "^3.9.0"
+
+eslint-plugin-node@^11.1.0:
+  version "11.1.0"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz#c95544416ee4ada26740a30474eefc5402dc671d"
+  integrity sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==
+  dependencies:
+    eslint-plugin-es "^3.0.0"
+    eslint-utils "^2.0.0"
+    ignore "^5.1.1"
+    minimatch "^3.0.4"
+    resolve "^1.10.1"
+    semver "^6.1.0"
+
+eslint-plugin-promise@^4.2.1:
+  version "4.2.1"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-4.2.1.tgz#845fd8b2260ad8f82564c1222fce44ad71d9418a"
+  integrity sha512-VoM09vT7bfA7D+upt+FjeBO5eHIJQBUWki1aPvB+vbNiHS3+oGIJGIeyBtKQTME6UPXXy3vV07OL1tHd3ANuDw==
+
+eslint-plugin-standard@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-4.0.1.tgz#ff0519f7ffaff114f76d1bd7c3996eef0f6e20b4"
+  integrity sha512-v/KBnfyaOMPmZc/dmc6ozOdWqekGp7bBGq4jLAecEfPGmfKiWS4sA8sC0LqiV9w5qmXAtXVn4M3p1jSyhY85SQ==
+
+eslint-scope@^4.0.3:
+  version "4.0.3"
+  resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848"
+  integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==
+  dependencies:
+    esrecurse "^4.1.0"
+    estraverse "^4.1.1"
+
+eslint-scope@^5.1.0:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.0.tgz#d0f971dfe59c69e0cada684b23d49dbf82600ce5"
+  integrity sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==
+  dependencies:
+    esrecurse "^4.1.0"
+    estraverse "^4.1.1"
+
+eslint-utils@^2.0.0, eslint-utils@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27"
+  integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==
+  dependencies:
+    eslint-visitor-keys "^1.1.0"
+
+eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2"
+  integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==
+
+eslint-visitor-keys@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e"
+  integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==
+
+eslint@^7.5.0:
+  version "7.5.0"
+  resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.5.0.tgz#9ecbfad62216d223b82ac9ffea7ef3444671d135"
+  integrity sha512-vlUP10xse9sWt9SGRtcr1LAC67BENcQMFeV+w5EvLEoFe3xJ8cF1Skd0msziRx/VMC+72B4DxreCE+OR12OA6Q==
+  dependencies:
+    "@babel/code-frame" "^7.0.0"
+    ajv "^6.10.0"
+    chalk "^4.0.0"
+    cross-spawn "^7.0.2"
+    debug "^4.0.1"
+    doctrine "^3.0.0"
+    enquirer "^2.3.5"
+    eslint-scope "^5.1.0"
+    eslint-utils "^2.1.0"
+    eslint-visitor-keys "^1.3.0"
+    espree "^7.2.0"
+    esquery "^1.2.0"
+    esutils "^2.0.2"
+    file-entry-cache "^5.0.1"
+    functional-red-black-tree "^1.0.1"
+    glob-parent "^5.0.0"
+    globals "^12.1.0"
+    ignore "^4.0.6"
+    import-fresh "^3.0.0"
+    imurmurhash "^0.1.4"
+    is-glob "^4.0.0"
+    js-yaml "^3.13.1"
+    json-stable-stringify-without-jsonify "^1.0.1"
+    levn "^0.4.1"
+    lodash "^4.17.19"
+    minimatch "^3.0.4"
+    natural-compare "^1.4.0"
+    optionator "^0.9.1"
+    progress "^2.0.0"
+    regexpp "^3.1.0"
+    semver "^7.2.1"
+    strip-ansi "^6.0.0"
+    strip-json-comments "^3.1.0"
+    table "^5.2.3"
+    text-table "^0.2.0"
+    v8-compile-cache "^2.0.3"
+
+espree@^7.2.0:
+  version "7.2.0"
+  resolved "https://registry.yarnpkg.com/espree/-/espree-7.2.0.tgz#1c263d5b513dbad0ac30c4991b93ac354e948d69"
+  integrity sha512-H+cQ3+3JYRMEIOl87e7QdHX70ocly5iW4+dttuR8iYSPr/hXKFb+7dBsZ7+u1adC4VrnPlTkv0+OwuPnDop19g==
+  dependencies:
+    acorn "^7.3.1"
+    acorn-jsx "^5.2.0"
+    eslint-visitor-keys "^1.3.0"
+
+esprima@^4.0.0:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
+  integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
+
+esquery@^1.2.0:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57"
+  integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==
+  dependencies:
+    estraverse "^5.1.0"
+
+esrecurse@^4.1.0:
+  version "4.2.1"
+  resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf"
+  integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==
+  dependencies:
+    estraverse "^4.1.0"
+
+estraverse@^4.1.0, estraverse@^4.1.1:
+  version "4.3.0"
+  resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d"
+  integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==
+
+estraverse@^5.1.0:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.1.0.tgz#374309d39fd935ae500e7b92e8a6b4c720e59642"
+  integrity sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==
+
+esutils@^2.0.2:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
+  integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
+
+eventemitter3@^4.0.4:
+  version "4.0.7"
+  resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f"
+  integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==
+
+events@^3.0.0:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/events/-/events-3.2.0.tgz#93b87c18f8efcd4202a461aec4dfc0556b639379"
+  integrity sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==
+
+evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02"
+  integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==
+  dependencies:
+    md5.js "^1.3.4"
+    safe-buffer "^5.1.1"
+
+execall@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/execall/-/execall-2.0.0.tgz#16a06b5fe5099df7d00be5d9c06eecded1663b45"
+  integrity sha512-0FU2hZ5Hh6iQnarpRtQurM/aAvp3RIbfvgLHrcqJYzhXyV2KFruhuChf9NC6waAhiUR7FFtlugkI4p7f2Fqlow==
+  dependencies:
+    clone-regexp "^2.1.0"
+
+exit@0.1.2, exit@0.1.x:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c"
+  integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=
+
+expand-brackets@^2.1.4:
+  version "2.1.4"
+  resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622"
+  integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI=
+  dependencies:
+    debug "^2.3.3"
+    define-property "^0.2.5"
+    extend-shallow "^2.0.1"
+    posix-character-classes "^0.1.0"
+    regex-not "^1.0.0"
+    snapdragon "^0.8.1"
+    to-regex "^3.0.1"
+
+expand-tilde@^2.0.0, expand-tilde@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502"
+  integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=
+  dependencies:
+    homedir-polyfill "^1.0.1"
+
+extend-shallow@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f"
+  integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=
+  dependencies:
+    is-extendable "^0.1.0"
+
+extend-shallow@^3.0.0, extend-shallow@^3.0.2:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8"
+  integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=
+  dependencies:
+    assign-symbols "^1.0.0"
+    is-extendable "^1.0.1"
+
+extend@^3.0.0:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
+  integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
+
+extglob@^2.0.4:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543"
+  integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==
+  dependencies:
+    array-unique "^0.3.2"
+    define-property "^1.0.0"
+    expand-brackets "^2.1.4"
+    extend-shallow "^2.0.1"
+    fragment-cache "^0.2.1"
+    regex-not "^1.0.0"
+    snapdragon "^0.8.1"
+    to-regex "^3.0.1"
+
+fast-deep-equal@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614"
+  integrity sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=
+
+fast-deep-equal@^3.1.1:
+  version "3.1.3"
+  resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
+  integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
+
+fast-glob@^3.1.1, fast-glob@^3.2.5:
+  version "3.2.5"
+  resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.5.tgz#7939af2a656de79a4f1901903ee8adcaa7cb9661"
+  integrity sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==
+  dependencies:
+    "@nodelib/fs.stat" "^2.0.2"
+    "@nodelib/fs.walk" "^1.2.3"
+    glob-parent "^5.1.0"
+    merge2 "^1.3.0"
+    micromatch "^4.0.2"
+    picomatch "^2.2.1"
+
+fast-glob@^3.2.4:
+  version "3.2.4"
+  resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.4.tgz#d20aefbf99579383e7f3cc66529158c9b98554d3"
+  integrity sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==
+  dependencies:
+    "@nodelib/fs.stat" "^2.0.2"
+    "@nodelib/fs.walk" "^1.2.3"
+    glob-parent "^5.1.0"
+    merge2 "^1.3.0"
+    micromatch "^4.0.2"
+    picomatch "^2.2.1"
+
+fast-json-stable-stringify@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
+  integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
+
+fast-levenshtein@^2.0.6:
+  version "2.0.6"
+  resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
+  integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=
+
+fast-safe-stringify@^2.0.7:
+  version "2.0.7"
+  resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz#124aa885899261f68aedb42a7c080de9da608743"
+  integrity sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==
+
+fastest-levenshtein@^1.0.12:
+  version "1.0.12"
+  resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz#9990f7d3a88cc5a9ffd1f1745745251700d497e2"
+  integrity sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==
+
+fastparse@^1.1.1:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.2.tgz#91728c5a5942eced8531283c79441ee4122c35a9"
+  integrity sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==
+
+fastq@^1.6.0:
+  version "1.11.0"
+  resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.11.0.tgz#bb9fb955a07130a918eb63c1f5161cc32a5d0858"
+  integrity sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==
+  dependencies:
+    reusify "^1.0.4"
+
+figgy-pudding@^3.5.1:
+  version "3.5.2"
+  resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e"
+  integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==
+
+file-entry-cache@^5.0.1:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c"
+  integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==
+  dependencies:
+    flat-cache "^2.0.1"
+
+file-entry-cache@^6.0.1:
+  version "6.0.1"
+  resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027"
+  integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==
+  dependencies:
+    flat-cache "^3.0.4"
+
+file-loader@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.0.0.tgz#97bbfaab7a2460c07bcbd72d3a6922407f67649f"
+  integrity sha512-/aMOAYEFXDdjG0wytpTL5YQLfZnnTmLNjn+AIrJ/6HVnTfDqLsVKUUwkDf4I4kgex36BvjuXEn/TX9B/1ESyqQ==
+  dependencies:
+    loader-utils "^2.0.0"
+    schema-utils "^2.6.5"
+
+file-uri-to-path@1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd"
+  integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==
+
+fill-range@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7"
+  integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=
+  dependencies:
+    extend-shallow "^2.0.1"
+    is-number "^3.0.0"
+    repeat-string "^1.6.1"
+    to-regex-range "^2.1.0"
+
+fill-range@^7.0.1:
+  version "7.0.1"
+  resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
+  integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
+  dependencies:
+    to-regex-range "^5.0.1"
+
+find-cache-dir@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7"
+  integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==
+  dependencies:
+    commondir "^1.0.1"
+    make-dir "^2.0.0"
+    pkg-dir "^3.0.0"
+
+find-cache-dir@^3.3.1:
+  version "3.3.1"
+  resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880"
+  integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==
+  dependencies:
+    commondir "^1.0.1"
+    make-dir "^3.0.2"
+    pkg-dir "^4.1.0"
+
+find-up@^2.0.0, find-up@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
+  integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c=
+  dependencies:
+    locate-path "^2.0.0"
+
+find-up@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73"
+  integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==
+  dependencies:
+    locate-path "^3.0.0"
+
+find-up@^4.0.0, find-up@^4.1.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19"
+  integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==
+  dependencies:
+    locate-path "^5.0.0"
+    path-exists "^4.0.0"
+
+findup-sync@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-3.0.0.tgz#17b108f9ee512dfb7a5c7f3c8b27ea9e1a9c08d1"
+  integrity sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==
+  dependencies:
+    detect-file "^1.0.0"
+    is-glob "^4.0.0"
+    micromatch "^3.0.4"
+    resolve-dir "^1.0.1"
+
+flat-cache@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0"
+  integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==
+  dependencies:
+    flatted "^2.0.0"
+    rimraf "2.6.3"
+    write "1.0.3"
+
+flat-cache@^3.0.4:
+  version "3.0.4"
+  resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11"
+  integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==
+  dependencies:
+    flatted "^3.1.0"
+    rimraf "^3.0.2"
+
+flatted@^2.0.0:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138"
+  integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==
+
+flatted@^3.1.0:
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.1.1.tgz#c4b489e80096d9df1dfc97c79871aea7c617c469"
+  integrity sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==
+
+flush-write-stream@^1.0.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8"
+  integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==
+  dependencies:
+    inherits "^2.0.3"
+    readable-stream "^2.3.6"
+
+for-in@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
+  integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=
+
+foreach@^2.0.4:
+  version "2.0.5"
+  resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99"
+  integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k=
+
+format-util@^1.0.3:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/format-util/-/format-util-1.0.5.tgz#1ffb450c8a03e7bccffe40643180918cc297d271"
+  integrity sha512-varLbTj0e0yVyRpqQhuWV+8hlePAgaoFRhNFj50BNjEIrw1/DphHSObtqwskVCPWNgzwPoQrZAbfa/SBiicNeg==
+
+fragment-cache@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19"
+  integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=
+  dependencies:
+    map-cache "^0.2.2"
+
+from2@^2.1.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af"
+  integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=
+  dependencies:
+    inherits "^2.0.1"
+    readable-stream "^2.0.0"
+
+fs-extra@^7.0.0:
+  version "7.0.1"
+  resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9"
+  integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==
+  dependencies:
+    graceful-fs "^4.1.2"
+    jsonfile "^4.0.0"
+    universalify "^0.1.0"
+
+fs-minipass@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb"
+  integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==
+  dependencies:
+    minipass "^3.0.0"
+
+fs-write-stream-atomic@^1.0.8:
+  version "1.0.10"
+  resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9"
+  integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=
+  dependencies:
+    graceful-fs "^4.1.2"
+    iferr "^0.1.5"
+    imurmurhash "^0.1.4"
+    readable-stream "1 || 2"
+
+fs.realpath@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+  integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
+
+fsevents@^1.2.7:
+  version "1.2.13"
+  resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38"
+  integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==
+  dependencies:
+    bindings "^1.5.0"
+    nan "^2.12.1"
+
+fsevents@~2.1.2:
+  version "2.1.3"
+  resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e"
+  integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==
+
+function-bind@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
+  integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
+
+functional-red-black-tree@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
+  integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=
+
+generic-names@^1.0.1:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/generic-names/-/generic-names-1.0.3.tgz#2d786a121aee508876796939e8e3bff836c20917"
+  integrity sha1-LXhqEhruUIh2eWk56OO/+DbCCRc=
+  dependencies:
+    loader-utils "^0.2.16"
+
+gensync@^1.0.0-beta.2:
+  version "1.0.0-beta.2"
+  resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0"
+  integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==
+
+get-caller-file@^2.0.1, get-caller-file@^2.0.5:
+  version "2.0.5"
+  resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
+  integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
+
+get-stdin@^8.0.0:
+  version "8.0.0"
+  resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-8.0.0.tgz#cbad6a73feb75f6eeb22ba9e01f89aa28aa97a53"
+  integrity sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==
+
+get-value@^2.0.3, get-value@^2.0.6:
+  version "2.0.6"
+  resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
+  integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=
+
+glob-parent@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae"
+  integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=
+  dependencies:
+    is-glob "^3.1.0"
+    path-dirname "^1.0.0"
+
+glob-parent@^5.0.0, glob-parent@^5.1.1, glob-parent@~5.1.0:
+  version "5.1.1"
+  resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229"
+  integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==
+  dependencies:
+    is-glob "^4.0.1"
+
+glob-parent@^5.1.0:
+  version "5.1.2"
+  resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
+  integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
+  dependencies:
+    is-glob "^4.0.1"
+
+glob-to-regexp@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab"
+  integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=
+
+glob@^7.0.3, glob@^7.1.1, glob@^7.1.4:
+  version "7.1.6"
+  resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6"
+  integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
+  dependencies:
+    fs.realpath "^1.0.0"
+    inflight "^1.0.4"
+    inherits "2"
+    minimatch "^3.0.4"
+    once "^1.3.0"
+    path-is-absolute "^1.0.0"
+
+glob@^7.1.3:
+  version "7.1.7"
+  resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90"
+  integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==
+  dependencies:
+    fs.realpath "^1.0.0"
+    inflight "^1.0.4"
+    inherits "2"
+    minimatch "^3.0.4"
+    once "^1.3.0"
+    path-is-absolute "^1.0.0"
+
+global-modules@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea"
+  integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==
+  dependencies:
+    global-prefix "^1.0.1"
+    is-windows "^1.0.1"
+    resolve-dir "^1.0.0"
+
+global-modules@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780"
+  integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==
+  dependencies:
+    global-prefix "^3.0.0"
+
+global-prefix@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe"
+  integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=
+  dependencies:
+    expand-tilde "^2.0.2"
+    homedir-polyfill "^1.0.1"
+    ini "^1.3.4"
+    is-windows "^1.0.1"
+    which "^1.2.14"
+
+global-prefix@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97"
+  integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==
+  dependencies:
+    ini "^1.3.5"
+    kind-of "^6.0.2"
+    which "^1.3.1"
+
+globals@^11.1.0:
+  version "11.12.0"
+  resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
+  integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
+
+globals@^12.1.0:
+  version "12.4.0"
+  resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8"
+  integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==
+  dependencies:
+    type-fest "^0.8.1"
+
+globals@^9.18.0:
+  version "9.18.0"
+  resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a"
+  integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==
+
+globby@^11.0.1, globby@^11.0.3:
+  version "11.0.3"
+  resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.3.tgz#9b1f0cb523e171dd1ad8c7b2a9fb4b644b9593cb"
+  integrity sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg==
+  dependencies:
+    array-union "^2.1.0"
+    dir-glob "^3.0.1"
+    fast-glob "^3.1.1"
+    ignore "^5.1.4"
+    merge2 "^1.3.0"
+    slash "^3.0.0"
+
+globby@^6.1.0:
+  version "6.1.0"
+  resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c"
+  integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=
+  dependencies:
+    array-union "^1.0.1"
+    glob "^7.0.3"
+    object-assign "^4.0.1"
+    pify "^2.0.0"
+    pinkie-promise "^2.0.0"
+
+globjoin@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/globjoin/-/globjoin-0.1.4.tgz#2f4494ac8919e3767c5cbb691e9f463324285d43"
+  integrity sha1-L0SUrIkZ43Z8XLtpHp9GMyQoXUM=
+
+gonzales-pe@^4.3.0:
+  version "4.3.0"
+  resolved "https://registry.yarnpkg.com/gonzales-pe/-/gonzales-pe-4.3.0.tgz#fe9dec5f3c557eead09ff868c65826be54d067b3"
+  integrity sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ==
+  dependencies:
+    minimist "^1.2.5"
+
+good-listener@^1.2.2:
+  version "1.2.2"
+  resolved "https://registry.yarnpkg.com/good-listener/-/good-listener-1.2.2.tgz#d53b30cdf9313dffb7dc9a0d477096aa6d145c50"
+  integrity sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=
+  dependencies:
+    delegate "^3.1.2"
+
+graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2:
+  version "4.2.4"
+  resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb"
+  integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==
+
+graceful-fs@^4.1.6:
+  version "4.2.3"
+  resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423"
+  integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==
+
+grapheme-splitter@^1.0.4:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e"
+  integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==
+
+graphlib@^2.1.8:
+  version "2.1.8"
+  resolved "https://registry.yarnpkg.com/graphlib/-/graphlib-2.1.8.tgz#5761d414737870084c92ec7b5dbcb0592c9d35da"
+  integrity sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==
+  dependencies:
+    lodash "^4.17.15"
+
+hard-rejection@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883"
+  integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==
+
+has-ansi@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
+  integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=
+  dependencies:
+    ansi-regex "^2.0.0"
+
+has-flag@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
+  integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
+
+has-flag@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
+  integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
+
+has-symbols@^1.0.0, has-symbols@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8"
+  integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==
+
+has-value@^0.3.1:
+  version "0.3.1"
+  resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f"
+  integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=
+  dependencies:
+    get-value "^2.0.3"
+    has-values "^0.1.4"
+    isobject "^2.0.0"
+
+has-value@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177"
+  integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=
+  dependencies:
+    get-value "^2.0.6"
+    has-values "^1.0.0"
+    isobject "^3.0.0"
+
+has-values@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771"
+  integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E=
+
+has-values@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f"
+  integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=
+  dependencies:
+    is-number "^3.0.0"
+    kind-of "^4.0.0"
+
+has@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
+  integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
+  dependencies:
+    function-bind "^1.1.1"
+
+hash-base@^3.0.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33"
+  integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==
+  dependencies:
+    inherits "^2.0.4"
+    readable-stream "^3.6.0"
+    safe-buffer "^5.2.0"
+
+hash.js@^1.0.0, hash.js@^1.0.3:
+  version "1.1.7"
+  resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42"
+  integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==
+  dependencies:
+    inherits "^2.0.3"
+    minimalistic-assert "^1.0.1"
+
+hex-color-regex@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e"
+  integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==
+
+hmac-drbg@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
+  integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=
+  dependencies:
+    hash.js "^1.0.3"
+    minimalistic-assert "^1.0.0"
+    minimalistic-crypto-utils "^1.0.1"
+
+home-or-tmp@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8"
+  integrity sha1-42w/LSyufXRqhX440Y1fMqeILbg=
+  dependencies:
+    os-homedir "^1.0.0"
+    os-tmpdir "^1.0.1"
+
+homedir-polyfill@^1.0.1:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8"
+  integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==
+  dependencies:
+    parse-passwd "^1.0.0"
+
+hosted-git-info@^2.1.4:
+  version "2.8.9"
+  resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9"
+  integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==
+
+hosted-git-info@^4.0.1:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.0.2.tgz#5e425507eede4fea846b7262f0838456c4209961"
+  integrity sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==
+  dependencies:
+    lru-cache "^6.0.0"
+
+hsl-regex@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e"
+  integrity sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=
+
+hsla-regex@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38"
+  integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg=
+
+html-tags@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.1.0.tgz#7b5e6f7e665e9fb41f30007ed9e0d41e97fb2140"
+  integrity sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==
+
+htmlparser2@3.8.x:
+  version "3.8.3"
+  resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.8.3.tgz#996c28b191516a8be86501a7d79757e5c70c1068"
+  integrity sha1-mWwosZFRaovoZQGn15dX5ccMEGg=
+  dependencies:
+    domelementtype "1"
+    domhandler "2.3"
+    domutils "1.5"
+    entities "1.0"
+    readable-stream "1.1"
+
+htmlparser2@^3.10.0:
+  version "3.10.1"
+  resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f"
+  integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==
+  dependencies:
+    domelementtype "^1.3.1"
+    domhandler "^2.3.0"
+    domutils "^1.5.1"
+    entities "^1.1.1"
+    inherits "^2.0.1"
+    readable-stream "^3.1.1"
+
+htmlparser2@^4.1.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-4.1.0.tgz#9a4ef161f2e4625ebf7dfbe6c0a2f52d18a59e78"
+  integrity sha512-4zDq1a1zhE4gQso/c5LP1OtrhYTncXNSpvJYtWJBtXAETPlMfi3IFNjGuQbYLuVY4ZR0QMqRVvo4Pdy9KLyP8Q==
+  dependencies:
+    domelementtype "^2.0.1"
+    domhandler "^3.0.0"
+    domutils "^2.0.0"
+    entities "^2.0.0"
+
+http2-client@^1.2.5:
+  version "1.3.3"
+  resolved "https://registry.yarnpkg.com/http2-client/-/http2-client-1.3.3.tgz#90fc15d646cca86956b156d07c83947d57d659a9"
+  integrity sha512-nUxLymWQ9pzkzTmir24p2RtsgruLmhje7lH3hLX1IpwvyTg77fW+1brenPPP3USAR+rQ36p5sTA/x7sjCJVkAA==
+
+https-browserify@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73"
+  integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=
+
+iconv-lite@0.4:
+  version "0.4.24"
+  resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
+  integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
+  dependencies:
+    safer-buffer ">= 2.1.2 < 3"
+
+icss-replace-symbols@^1.0.2, icss-replace-symbols@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded"
+  integrity sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=
+
+icss-utils@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-3.0.1.tgz#ee70d3ae8cac38c6be5ed91e851b27eed343ad0f"
+  integrity sha1-7nDTroysOMa+XtkehRsn7tNDrQ8=
+  dependencies:
+    postcss "^6.0.2"
+
+icss-utils@^4.0.0, icss-utils@^4.1.1:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467"
+  integrity sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==
+  dependencies:
+    postcss "^7.0.14"
+
+ieee754@^1.1.4:
+  version "1.1.13"
+  resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84"
+  integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==
+
+iferr@^0.1.5:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501"
+  integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE=
+
+ignore@^4.0.6:
+  version "4.0.6"
+  resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc"
+  integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==
+
+ignore@^5.1.1, ignore@^5.1.4, ignore@^5.1.8:
+  version "5.1.8"
+  resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57"
+  integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==
+
+import-fresh@^3.0.0:
+  version "3.2.1"
+  resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66"
+  integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==
+  dependencies:
+    parent-module "^1.0.0"
+    resolve-from "^4.0.0"
+
+import-fresh@^3.2.1:
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b"
+  integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==
+  dependencies:
+    parent-module "^1.0.0"
+    resolve-from "^4.0.0"
+
+import-lazy@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-4.0.0.tgz#e8eb627483a0a43da3c03f3e35548be5cb0cc153"
+  integrity sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==
+
+import-local@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d"
+  integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==
+  dependencies:
+    pkg-dir "^3.0.0"
+    resolve-cwd "^2.0.0"
+
+imports-loader@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/imports-loader/-/imports-loader-1.1.0.tgz#1c3a388d0c5cd7f9eb08f3646d4aae3b70e57933"
+  integrity sha512-HcPM6rULdQ6EBLVq+5O+CF9xb7qiUjsRm6V28bTG/c3IU5sQkVZzUDwYY0r4jHvSAmVFdO9WA/vLAURR5WQSeQ==
+  dependencies:
+    loader-utils "^2.0.0"
+    schema-utils "^2.7.0"
+    source-map "^0.6.1"
+    strip-comments "^2.0.1"
+
+imurmurhash@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
+  integrity sha1-khi5srkoojixPcT7a21XbyMUU+o=
+
+indent-string@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251"
+  integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==
+
+indexes-of@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607"
+  integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc=
+
+infer-owner@^1.0.3, infer-owner@^1.0.4:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467"
+  integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==
+
+inflight@^1.0.4:
+  version "1.0.6"
+  resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+  integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=
+  dependencies:
+    once "^1.3.0"
+    wrappy "1"
+
+inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
+  integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
+
+inherits@2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1"
+  integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=
+
+inherits@2.0.3:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
+  integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
+
+ini@^1.3.4, ini@^1.3.5:
+  version "1.3.8"
+  resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c"
+  integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==
+
+interpret@^1.4.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e"
+  integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==
+
+invariant@^2.2.2:
+  version "2.2.4"
+  resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
+  integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==
+  dependencies:
+    loose-envify "^1.0.0"
+
+is-absolute-url@^3.0.3:
+  version "3.0.3"
+  resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698"
+  integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==
+
+is-accessor-descriptor@^0.1.6:
+  version "0.1.6"
+  resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6"
+  integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=
+  dependencies:
+    kind-of "^3.0.2"
+
+is-accessor-descriptor@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656"
+  integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==
+  dependencies:
+    kind-of "^6.0.0"
+
+is-alphabetical@^1.0.0:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d"
+  integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==
+
+is-alphanumerical@^1.0.0:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf"
+  integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==
+  dependencies:
+    is-alphabetical "^1.0.0"
+    is-decimal "^1.0.0"
+
+is-arrayish@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
+  integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=
+
+is-binary-path@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898"
+  integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=
+  dependencies:
+    binary-extensions "^1.0.0"
+
+is-binary-path@~2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
+  integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
+  dependencies:
+    binary-extensions "^2.0.0"
+
+is-buffer@^1.1.5:
+  version "1.1.6"
+  resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
+  integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
+
+is-buffer@^2.0.0:
+  version "2.0.5"
+  resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191"
+  integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==
+
+is-callable@^1.1.4:
+  version "1.1.4"
+  resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75"
+  integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==
+
+is-callable@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.0.tgz#83336560b54a38e35e3a2df7afd0454d691468bb"
+  integrity sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==
+
+is-color-stop@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345"
+  integrity sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=
+  dependencies:
+    css-color-names "^0.0.4"
+    hex-color-regex "^1.1.0"
+    hsl-regex "^1.0.0"
+    hsla-regex "^1.0.0"
+    rgb-regex "^1.0.1"
+    rgba-regex "^1.0.0"
+
+is-core-module@^2.2.0:
+  version "2.4.0"
+  resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.4.0.tgz#8e9fc8e15027b011418026e98f0e6f4d86305cc1"
+  integrity sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==
+  dependencies:
+    has "^1.0.3"
+
+is-data-descriptor@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56"
+  integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=
+  dependencies:
+    kind-of "^3.0.2"
+
+is-data-descriptor@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7"
+  integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==
+  dependencies:
+    kind-of "^6.0.0"
+
+is-date-object@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16"
+  integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=
+
+is-decimal@^1.0.0:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5"
+  integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==
+
+is-descriptor@^0.1.0:
+  version "0.1.6"
+  resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca"
+  integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==
+  dependencies:
+    is-accessor-descriptor "^0.1.6"
+    is-data-descriptor "^0.1.4"
+    kind-of "^5.0.0"
+
+is-descriptor@^1.0.0, is-descriptor@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec"
+  integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==
+  dependencies:
+    is-accessor-descriptor "^1.0.0"
+    is-data-descriptor "^1.0.0"
+    kind-of "^6.0.2"
+
+is-extendable@^0.1.0, is-extendable@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
+  integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=
+
+is-extendable@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4"
+  integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==
+  dependencies:
+    is-plain-object "^2.0.4"
+
+is-extglob@^2.1.0, is-extglob@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+  integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
+
+is-finite@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa"
+  integrity sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=
+  dependencies:
+    number-is-nan "^1.0.0"
+
+is-fullwidth-code-point@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
+  integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=
+
+is-fullwidth-code-point@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
+  integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
+
+is-glob@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a"
+  integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=
+  dependencies:
+    is-extglob "^2.1.0"
+
+is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc"
+  integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==
+  dependencies:
+    is-extglob "^2.1.1"
+
+is-hexadecimal@^1.0.0:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7"
+  integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==
+
+is-number@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
+  integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=
+  dependencies:
+    kind-of "^3.0.2"
+
+is-number@^7.0.0:
+  version "7.0.0"
+  resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
+  integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
+
+is-path-cwd@^2.0.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb"
+  integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==
+
+is-path-in-cwd@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz#bfe2dca26c69f397265a4009963602935a053acb"
+  integrity sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==
+  dependencies:
+    is-path-inside "^2.1.0"
+
+is-path-inside@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-2.1.0.tgz#7c9810587d659a40d27bcdb4d5616eab059494b2"
+  integrity sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==
+  dependencies:
+    path-is-inside "^1.0.2"
+
+is-plain-obj@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e"
+  integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4=
+
+is-plain-obj@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287"
+  integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==
+
+is-plain-object@^2.0.3, is-plain-object@^2.0.4:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
+  integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==
+  dependencies:
+    isobject "^3.0.1"
+
+is-regex@^1.0.4:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae"
+  integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==
+  dependencies:
+    has "^1.0.3"
+
+is-regex@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.0.tgz#ece38e389e490df0dc21caea2bd596f987f767ff"
+  integrity sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==
+  dependencies:
+    has-symbols "^1.0.1"
+
+is-regexp@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-2.1.0.tgz#cd734a56864e23b956bf4e7c66c396a4c0b22c2d"
+  integrity sha512-OZ4IlER3zmRIoB9AqNhEggVxqIH4ofDns5nRrPS6yQxXE1TPCUpFznBfRQmQa8uC+pXqjMnukiJBxCisIxiLGA==
+
+is-resolvable@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88"
+  integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==
+
+is-string@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6"
+  integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==
+
+is-symbol@^1.0.2:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937"
+  integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==
+  dependencies:
+    has-symbols "^1.0.1"
+
+is-typedarray@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
+  integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=
+
+is-unicode-supported@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7"
+  integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==
+
+is-windows@^1.0.1, is-windows@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
+  integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==
+
+is-wsl@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d"
+  integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=
+
+isarray@0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
+  integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=
+
+isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+  integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
+
+isexe@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+  integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
+
+isobject@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
+  integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=
+  dependencies:
+    isarray "1.0.0"
+
+isobject@^3.0.0, isobject@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
+  integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8=
+
+jquery@>=1.7, jquery@>=3.4.0, "jquery@^1.8.3 || ^2.0 || ^3.0":
+  version "3.4.1"
+  resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.4.1.tgz#714f1f8d9dde4bdfa55764ba37ef214630d80ef2"
+  integrity sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw==
+
+"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
+  integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
+
+js-tokens@^3.0.2:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
+  integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls=
+
+js-yaml@^3.12.1, js-yaml@^3.13.1:
+  version "3.14.0"
+  resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482"
+  integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==
+  dependencies:
+    argparse "^1.0.7"
+    esprima "^4.0.0"
+
+jsesc@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b"
+  integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s=
+
+jsesc@^2.5.1:
+  version "2.5.2"
+  resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
+  integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==
+
+jsesc@~0.5.0:
+  version "0.5.0"
+  resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
+  integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=
+
+jshint@^2.12.0:
+  version "2.12.0"
+  resolved "https://registry.yarnpkg.com/jshint/-/jshint-2.12.0.tgz#52e75bd058d587ef81a0e2f95e5cf18eb5dc5c37"
+  integrity sha512-TwuuaUDmra0JMkuqvqy+WGo2xGHSNjv1BA1nTIgtH2K5z1jHuAEeAgp7laaR+hLRmajRjcrM71+vByBDanCyYA==
+  dependencies:
+    cli "~1.0.0"
+    console-browserify "1.1.x"
+    exit "0.1.x"
+    htmlparser2 "3.8.x"
+    lodash "~4.17.19"
+    minimatch "~3.0.2"
+    shelljs "0.3.x"
+    strip-json-comments "1.0.x"
+
+json-parse-better-errors@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9"
+  integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==
+
+json-parse-even-better-errors@^2.3.0:
+  version "2.3.1"
+  resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d"
+  integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==
+
+json-pointer@^0.6.0:
+  version "0.6.0"
+  resolved "https://registry.yarnpkg.com/json-pointer/-/json-pointer-0.6.0.tgz#8e500550a6aac5464a473377da57aa6cc22828d7"
+  integrity sha1-jlAFUKaqxUZKRzN32leqbMIoKNc=
+  dependencies:
+    foreach "^2.0.4"
+
+json-schema-ref-parser@^6.1.0:
+  version "6.1.0"
+  resolved "https://registry.yarnpkg.com/json-schema-ref-parser/-/json-schema-ref-parser-6.1.0.tgz#30af34aeab5bee0431da805dac0eb21b574bf63d"
+  integrity sha512-pXe9H1m6IgIpXmE5JSb8epilNTGsmTb2iPohAXpOdhqGFbQjNeHHsZxU+C8w6T81GZxSPFLeUoqDJmzxx5IGuw==
+  dependencies:
+    call-me-maybe "^1.0.1"
+    js-yaml "^3.12.1"
+    ono "^4.0.11"
+
+json-schema-traverse@^0.3.0:
+  version "0.3.1"
+  resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340"
+  integrity sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=
+
+json-schema-traverse@^0.4.1:
+  version "0.4.1"
+  resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
+  integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
+
+json-schema-traverse@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2"
+  integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==
+
+json-stable-stringify-without-jsonify@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
+  integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=
+
+json-to-ast@^2.0.3:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/json-to-ast/-/json-to-ast-2.1.0.tgz#041a9fcd03c0845036acb670d29f425cea4faaf9"
+  integrity sha512-W9Lq347r8tA1DfMvAGn9QNcgYm4Wm7Yc+k8e6vezpMnRT+NHbtlxgNBXRVjXe9YM6eTn6+p/MKOlV/aABJcSnQ==
+  dependencies:
+    code-error-fragment "0.0.230"
+    grapheme-splitter "^1.0.4"
+
+json5@^0.5.0, json5@^0.5.1:
+  version "0.5.1"
+  resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
+  integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=
+
+json5@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe"
+  integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==
+  dependencies:
+    minimist "^1.2.0"
+
+json5@^2.1.2:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3"
+  integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==
+  dependencies:
+    minimist "^1.2.5"
+
+jsonfile@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
+  integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=
+  optionalDependencies:
+    graceful-fs "^4.1.6"
+
+jsonpointer@^4.0.1:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.1.0.tgz#501fb89986a2389765ba09e6053299ceb4f2c2cc"
+  integrity sha512-CXcRvMyTlnR53xMcKnuMzfCA5i/nfblTnnr74CZb6C4vG39eu6w51t7nKmU5MfLfbTgGItliNyjO/ciNPDqClg==
+
+kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
+  version "3.2.2"
+  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
+  integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=
+  dependencies:
+    is-buffer "^1.1.5"
+
+kind-of@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57"
+  integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc=
+  dependencies:
+    is-buffer "^1.1.5"
+
+kind-of@^5.0.0:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d"
+  integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==
+
+kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3:
+  version "6.0.3"
+  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd"
+  integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==
+
+known-css-properties@^0.21.0:
+  version "0.21.0"
+  resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.21.0.tgz#15fbd0bbb83447f3ce09d8af247ed47c68ede80d"
+  integrity sha512-sZLUnTqimCkvkgRS+kbPlYW5o8q5w1cu+uIisKpEWkj31I8mx8kNG162DwRav8Zirkva6N5uoFsm9kzK4mUXjw==
+
+last-call-webpack-plugin@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz#9742df0e10e3cf46e5c0381c2de90d3a7a2d7555"
+  integrity sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==
+  dependencies:
+    lodash "^4.17.5"
+    webpack-sources "^1.1.0"
+
+leven@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2"
+  integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==
+
+levn@^0.4.1:
+  version "0.4.1"
+  resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade"
+  integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==
+  dependencies:
+    prelude-ls "^1.2.1"
+    type-check "~0.4.0"
+
+lines-and-columns@^1.1.6:
+  version "1.1.6"
+  resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00"
+  integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=
+
+load-json-file@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8"
+  integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=
+  dependencies:
+    graceful-fs "^4.1.2"
+    parse-json "^2.2.0"
+    pify "^2.0.0"
+    strip-bom "^3.0.0"
+
+loader-runner@^2.4.0:
+  version "2.4.0"
+  resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357"
+  integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==
+
+loader-utils@^0.2.16:
+  version "0.2.17"
+  resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348"
+  integrity sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=
+  dependencies:
+    big.js "^3.1.3"
+    emojis-list "^2.0.0"
+    json5 "^0.5.0"
+    object-assign "^4.0.1"
+
+loader-utils@^1.2.3, loader-utils@^1.4.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613"
+  integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==
+  dependencies:
+    big.js "^5.2.2"
+    emojis-list "^3.0.0"
+    json5 "^1.0.1"
+
+loader-utils@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0"
+  integrity sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==
+  dependencies:
+    big.js "^5.2.2"
+    emojis-list "^3.0.0"
+    json5 "^2.1.2"
+
+locate-path@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
+  integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=
+  dependencies:
+    p-locate "^2.0.0"
+    path-exists "^3.0.0"
+
+locate-path@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e"
+  integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==
+  dependencies:
+    p-locate "^3.0.0"
+    path-exists "^3.0.0"
+
+locate-path@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0"
+  integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==
+  dependencies:
+    p-locate "^4.1.0"
+
+lodash.clonedeep@^4.5.0:
+  version "4.5.0"
+  resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef"
+  integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=
+
+lodash.difference@^4.5.0:
+  version "4.5.0"
+  resolved "https://registry.yarnpkg.com/lodash.difference/-/lodash.difference-4.5.0.tgz#9ccb4e505d486b91651345772885a2df27fd017c"
+  integrity sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=
+
+lodash.memoize@^4.1.2:
+  version "4.1.2"
+  resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe"
+  integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=
+
+lodash.truncate@^4.4.2:
+  version "4.4.2"
+  resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193"
+  integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=
+
+lodash.uniq@^4.5.0:
+  version "4.5.0"
+  resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
+  integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=
+
+"lodash@>=3.5 <5", lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0, lodash@~4.17.19:
+  version "4.17.21"
+  resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
+  integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
+
+log-symbols@^4.1.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503"
+  integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==
+  dependencies:
+    chalk "^4.1.0"
+    is-unicode-supported "^0.1.0"
+
+longest-streak@^2.0.0:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-2.0.4.tgz#b8599957da5b5dab64dee3fe316fa774597d90e4"
+  integrity sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==
+
+loose-envify@^1.0.0, loose-envify@^1.4.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
+  integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
+  dependencies:
+    js-tokens "^3.0.0 || ^4.0.0"
+
+lru-cache@^5.1.1:
+  version "5.1.1"
+  resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920"
+  integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==
+  dependencies:
+    yallist "^3.0.2"
+
+lru-cache@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
+  integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
+  dependencies:
+    yallist "^4.0.0"
+
+lunr@2.3.8:
+  version "2.3.8"
+  resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.8.tgz#a8b89c31f30b5a044b97d2d28e2da191b6ba2072"
+  integrity sha512-oxMeX/Y35PNFuZoHp+jUj5OSEmLCaIH4KTFJh7a93cHBoFmpw2IoPs22VIz7vyO2YUnx2Tn9dzIwO2P/4quIRg==
+
+make-dir@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5"
+  integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==
+  dependencies:
+    pify "^4.0.1"
+    semver "^5.6.0"
+
+make-dir@^3.0.2:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f"
+  integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==
+  dependencies:
+    semver "^6.0.0"
+
+map-cache@^0.2.2:
+  version "0.2.2"
+  resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
+  integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=
+
+map-obj@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d"
+  integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=
+
+map-obj@^4.0.0:
+  version "4.2.1"
+  resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.2.1.tgz#e4ea399dbc979ae735c83c863dd31bdf364277b7"
+  integrity sha512-+WA2/1sPmDj1dlvvJmB5G6JKfY9dpn7EVBUL06+y6PoljPkh+6V1QihwxNkbcGxCRjt2b0F9K0taiCuo7MbdFQ==
+
+map-visit@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f"
+  integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=
+  dependencies:
+    object-visit "^1.0.0"
+
+mark.js@^8.11.1:
+  version "8.11.1"
+  resolved "https://registry.yarnpkg.com/mark.js/-/mark.js-8.11.1.tgz#180f1f9ebef8b0e638e4166ad52db879beb2ffc5"
+  integrity sha1-GA8fnr74sOY45BZq1S24eb6y/8U=
+
+marked@^0.7.0:
+  version "0.7.0"
+  resolved "https://registry.yarnpkg.com/marked/-/marked-0.7.0.tgz#b64201f051d271b1edc10a04d1ae9b74bb8e5c0e"
+  integrity sha512-c+yYdCZJQrsRjTPhUx7VKkApw9bwDkNbHUKo1ovgcfDjb2kc8rLuRbIFyXL5WOEUwzSSKo3IXpph2K6DqB/KZg==
+
+mathml-tag-names@^2.1.3:
+  version "2.1.3"
+  resolved "https://registry.yarnpkg.com/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz#4ddadd67308e780cf16a47685878ee27b736a0a3"
+  integrity sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==
+
+md5.js@^1.3.4:
+  version "1.3.5"
+  resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f"
+  integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==
+  dependencies:
+    hash-base "^3.0.0"
+    inherits "^2.0.1"
+    safe-buffer "^5.1.2"
+
+mdast-util-from-markdown@^0.8.0:
+  version "0.8.5"
+  resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz#d1ef2ca42bc377ecb0463a987910dae89bd9a28c"
+  integrity sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==
+  dependencies:
+    "@types/mdast" "^3.0.0"
+    mdast-util-to-string "^2.0.0"
+    micromark "~2.11.0"
+    parse-entities "^2.0.0"
+    unist-util-stringify-position "^2.0.0"
+
+mdast-util-to-markdown@^0.6.0:
+  version "0.6.5"
+  resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz#b33f67ca820d69e6cc527a93d4039249b504bebe"
+  integrity sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==
+  dependencies:
+    "@types/unist" "^2.0.0"
+    longest-streak "^2.0.0"
+    mdast-util-to-string "^2.0.0"
+    parse-entities "^2.0.0"
+    repeat-string "^1.0.0"
+    zwitch "^1.0.0"
+
+mdast-util-to-string@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz#b8cfe6a713e1091cb5b728fc48885a4767f8b97b"
+  integrity sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==
+
+mdn-data@2.0.14:
+  version "2.0.14"
+  resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50"
+  integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==
+
+memoize-one@~5.1.1:
+  version "5.1.1"
+  resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.1.1.tgz#047b6e3199b508eaec03504de71229b8eb1d75c0"
+  integrity sha512-HKeeBpWvqiVJD57ZUAsJNm71eHTykffzcLZVYWiVfQeI1rJtuEaS7hQiEpWfVVk18donPwJEcFKIkCmPJNOhHA==
+
+memory-fs@^0.4.1:
+  version "0.4.1"
+  resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552"
+  integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=
+  dependencies:
+    errno "^0.1.3"
+    readable-stream "^2.0.1"
+
+memory-fs@^0.5.0:
+  version "0.5.0"
+  resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c"
+  integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==
+  dependencies:
+    errno "^0.1.3"
+    readable-stream "^2.0.1"
+
+meow@^9.0.0:
+  version "9.0.0"
+  resolved "https://registry.yarnpkg.com/meow/-/meow-9.0.0.tgz#cd9510bc5cac9dee7d03c73ee1f9ad959f4ea364"
+  integrity sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==
+  dependencies:
+    "@types/minimist" "^1.2.0"
+    camelcase-keys "^6.2.2"
+    decamelize "^1.2.0"
+    decamelize-keys "^1.1.0"
+    hard-rejection "^2.1.0"
+    minimist-options "4.1.0"
+    normalize-package-data "^3.0.0"
+    read-pkg-up "^7.0.1"
+    redent "^3.0.0"
+    trim-newlines "^3.0.0"
+    type-fest "^0.18.0"
+    yargs-parser "^20.2.3"
+
+merge2@^1.3.0:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
+  integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
+
+micromark@~2.11.0:
+  version "2.11.4"
+  resolved "https://registry.yarnpkg.com/micromark/-/micromark-2.11.4.tgz#d13436138eea826383e822449c9a5c50ee44665a"
+  integrity sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==
+  dependencies:
+    debug "^4.0.0"
+    parse-entities "^2.0.0"
+
+micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4:
+  version "3.1.10"
+  resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
+  integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==
+  dependencies:
+    arr-diff "^4.0.0"
+    array-unique "^0.3.2"
+    braces "^2.3.1"
+    define-property "^2.0.2"
+    extend-shallow "^3.0.2"
+    extglob "^2.0.4"
+    fragment-cache "^0.2.1"
+    kind-of "^6.0.2"
+    nanomatch "^1.2.9"
+    object.pick "^1.3.0"
+    regex-not "^1.0.0"
+    snapdragon "^0.8.1"
+    to-regex "^3.0.2"
+
+micromatch@^4.0.2, micromatch@^4.0.4:
+  version "4.0.4"
+  resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9"
+  integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==
+  dependencies:
+    braces "^3.0.1"
+    picomatch "^2.2.3"
+
+miller-rabin@^4.0.0:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d"
+  integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==
+  dependencies:
+    bn.js "^4.0.0"
+    brorand "^1.0.1"
+
+mime-db@1.44.0:
+  version "1.44.0"
+  resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92"
+  integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==
+
+mime-types@^2.1.26:
+  version "2.1.27"
+  resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f"
+  integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==
+  dependencies:
+    mime-db "1.44.0"
+
+min-indent@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869"
+  integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==
+
+mini-css-extract-plugin@1.6.0:
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-1.6.0.tgz#b4db2525af2624899ed64a23b0016e0036411893"
+  integrity sha512-nPFKI7NSy6uONUo9yn2hIfb9vyYvkFu95qki0e21DQ9uaqNKDP15DGpK0KnV6wDroWxPHtExrdEwx/yDQ8nVRw==
+  dependencies:
+    loader-utils "^2.0.0"
+    schema-utils "^3.0.0"
+    webpack-sources "^1.1.0"
+
+minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
+  integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==
+
+minimalistic-crypto-utils@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
+  integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=
+
+minimatch@^3.0.4, minimatch@~3.0.2:
+  version "3.0.4"
+  resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
+  integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
+  dependencies:
+    brace-expansion "^1.1.7"
+
+minimist-options@4.1.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619"
+  integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==
+  dependencies:
+    arrify "^1.0.1"
+    is-plain-obj "^1.1.0"
+    kind-of "^6.0.3"
+
+minimist@^1.2.0, minimist@^1.2.5:
+  version "1.2.5"
+  resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
+  integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
+
+minipass-collect@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617"
+  integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==
+  dependencies:
+    minipass "^3.0.0"
+
+minipass-flush@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373"
+  integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==
+  dependencies:
+    minipass "^3.0.0"
+
+minipass-pipeline@^1.2.2:
+  version "1.2.3"
+  resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.3.tgz#55f7839307d74859d6e8ada9c3ebe72cec216a34"
+  integrity sha512-cFOknTvng5vqnwOpDsZTWhNll6Jf8o2x+/diplafmxpuIymAjzoOolZG0VvQf3V2HgqzJNhnuKHYp2BqDgz8IQ==
+  dependencies:
+    minipass "^3.0.0"
+
+minipass@^3.0.0, minipass@^3.1.1:
+  version "3.1.3"
+  resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.3.tgz#7d42ff1f39635482e15f9cdb53184deebd5815fd"
+  integrity sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==
+  dependencies:
+    yallist "^4.0.0"
+
+minizlib@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.0.tgz#fd52c645301ef09a63a2c209697c294c6ce02cf3"
+  integrity sha512-EzTZN/fjSvifSX0SlqUERCN39o6T40AMarPbv0MrarSFtIITCBh7bi+dU8nxGFHuqs9jdIAeoYoKuQAAASsPPA==
+  dependencies:
+    minipass "^3.0.0"
+    yallist "^4.0.0"
+
+mississippi@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022"
+  integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==
+  dependencies:
+    concat-stream "^1.5.0"
+    duplexify "^3.4.2"
+    end-of-stream "^1.1.0"
+    flush-write-stream "^1.0.0"
+    from2 "^2.1.0"
+    parallel-transform "^1.1.0"
+    pump "^3.0.0"
+    pumpify "^1.3.3"
+    stream-each "^1.1.0"
+    through2 "^2.0.0"
+
+mixin-deep@^1.2.0:
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566"
+  integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==
+  dependencies:
+    for-in "^1.0.2"
+    is-extendable "^1.0.1"
+
+mkdirp@^0.5.1, mkdirp@^0.5.3:
+  version "0.5.5"
+  resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def"
+  integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==
+  dependencies:
+    minimist "^1.2.5"
+
+mkdirp@^1.0.3, mkdirp@^1.0.4:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
+  integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
+
+mobx-react-lite@^3.2.0:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/mobx-react-lite/-/mobx-react-lite-3.2.0.tgz#331d7365a6b053378dfe9c087315b4e41c5df69f"
+  integrity sha512-q5+UHIqYCOpBoFm/PElDuOhbcatvTllgRp3M1s+Hp5j0Z6XNgDbgqxawJ0ZAUEyKM8X1zs70PCuhAIzX1f4Q/g==
+
+mobx-react@^7.0.5:
+  version "7.1.0"
+  resolved "https://registry.yarnpkg.com/mobx-react/-/mobx-react-7.1.0.tgz#d947cada3cfad294b4b6f692e969c242b9c16eaf"
+  integrity sha512-DxvA6VXmnZ+N9f/UTtolWtdRnAAQY2iHWTSPLktfpj8NKlXUe4dabBAjuXrBcZUM8GjLWnxD1ZEjssXq1M0RAw==
+  dependencies:
+    mobx-react-lite "^3.2.0"
+
+moment-locales-webpack-plugin@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/moment-locales-webpack-plugin/-/moment-locales-webpack-plugin-1.2.0.tgz#9af83876a44053706b868ceece5119584d10d7aa"
+  integrity sha512-QAi5v0OlPUP7GXviKMtxnpBAo8WmTHrUNN7iciAhNOEAd9evCOvuN0g1N7ThIg3q11GLCkjY1zQ2saRcf/43nQ==
+  dependencies:
+    lodash.difference "^4.5.0"
+
+moment-timezone@^0.4.0:
+  version "0.4.1"
+  resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.4.1.tgz#81f598c3ad5e22cdad796b67ecd8d88d0f5baa06"
+  integrity sha1-gfWYw61eIs2teWtn7NjYjQ9bqgY=
+  dependencies:
+    moment ">= 2.6.0"
+
+moment-timezone@^0.5.28:
+  version "0.5.28"
+  resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.28.tgz#f093d789d091ed7b055d82aa81a82467f72e4338"
+  integrity sha512-TDJkZvAyKIVWg5EtVqRzU97w0Rb0YVbfpqyjgu6GwXCAohVRqwZjf4fOzDE6p1Ch98Sro/8hQQi65WDXW5STPw==
+  dependencies:
+    moment ">= 2.9.0"
+
+"moment@>= 2.6.0", "moment@>= 2.9.0", moment@^2.10:
+  version "2.24.0"
+  resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b"
+  integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==
+
+move-concurrently@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92"
+  integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=
+  dependencies:
+    aproba "^1.1.1"
+    copy-concurrently "^1.0.0"
+    fs-write-stream-atomic "^1.0.8"
+    mkdirp "^0.5.1"
+    rimraf "^2.5.4"
+    run-queue "^1.0.3"
+
+ms@2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+  integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
+
+ms@2.1.2:
+  version "2.1.2"
+  resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
+  integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
+
+ms@^2.1.1:
+  version "2.1.3"
+  resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
+  integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
+
+nan@^2.12.1:
+  version "2.14.1"
+  resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.1.tgz#d7be34dfa3105b91494c3147089315eff8874b01"
+  integrity sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==
+
+nanoid@^3.1.23:
+  version "3.1.23"
+  resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.23.tgz#f744086ce7c2bc47ee0a8472574d5c78e4183a81"
+  integrity sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==
+
+nanomatch@^1.2.9:
+  version "1.2.13"
+  resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"
+  integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==
+  dependencies:
+    arr-diff "^4.0.0"
+    array-unique "^0.3.2"
+    define-property "^2.0.2"
+    extend-shallow "^3.0.2"
+    fragment-cache "^0.2.1"
+    is-windows "^1.0.2"
+    kind-of "^6.0.2"
+    object.pick "^1.3.0"
+    regex-not "^1.0.0"
+    snapdragon "^0.8.1"
+    to-regex "^3.0.1"
+
+natural-compare@^1.4.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
+  integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
+
+neo-async@^2.5.0, neo-async@^2.6.1:
+  version "2.6.2"
+  resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f"
+  integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==
+
+nice-try@^1.0.4:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
+  integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==
+
+node-fetch-h2@^2.3.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/node-fetch-h2/-/node-fetch-h2-2.3.0.tgz#c6188325f9bd3d834020bf0f2d6dc17ced2241ac"
+  integrity sha512-ofRW94Ab0T4AOh5Fk8t0h8OBWrmjb0SSB20xh1H8YnPV9EJ+f5AMoYSUQ2zgJ4Iq2HAK0I2l5/Nequ8YzFS3Hg==
+  dependencies:
+    http2-client "^1.2.5"
+
+node-libs-browser@^2.2.1:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425"
+  integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==
+  dependencies:
+    assert "^1.1.1"
+    browserify-zlib "^0.2.0"
+    buffer "^4.3.0"
+    console-browserify "^1.1.0"
+    constants-browserify "^1.0.0"
+    crypto-browserify "^3.11.0"
+    domain-browser "^1.1.1"
+    events "^3.0.0"
+    https-browserify "^1.0.0"
+    os-browserify "^0.3.0"
+    path-browserify "0.0.1"
+    process "^0.11.10"
+    punycode "^1.2.4"
+    querystring-es3 "^0.2.0"
+    readable-stream "^2.3.3"
+    stream-browserify "^2.0.1"
+    stream-http "^2.7.2"
+    string_decoder "^1.0.0"
+    timers-browserify "^2.0.4"
+    tty-browserify "0.0.0"
+    url "^0.11.0"
+    util "^0.11.0"
+    vm-browserify "^1.0.1"
+
+node-readfiles@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/node-readfiles/-/node-readfiles-0.2.0.tgz#dbbd4af12134e2e635c245ef93ffcf6f60673a5d"
+  integrity sha1-271K8SE04uY1wkXvk//Pb2BnOl0=
+  dependencies:
+    es6-promise "^3.2.1"
+
+node-releases@^1.1.61:
+  version "1.1.63"
+  resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.63.tgz#db6dbb388544c31e888216304e8fd170efee3ff5"
+  integrity sha512-ukW3iCfQaoxJkSPN+iK7KznTeqDGVJatAEuXsJERYHa9tn/KaT5lBdIyxQjLEVTzSkyjJEuQ17/vaEjrOauDkg==
+
+node-releases@^1.1.71:
+  version "1.1.71"
+  resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.71.tgz#cb1334b179896b1c89ecfdd4b725fb7bbdfc7dbb"
+  integrity sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==
+
+normalize-package-data@^2.3.2, normalize-package-data@^2.5.0:
+  version "2.5.0"
+  resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8"
+  integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==
+  dependencies:
+    hosted-git-info "^2.1.4"
+    resolve "^1.10.0"
+    semver "2 || 3 || 4 || 5"
+    validate-npm-package-license "^3.0.1"
+
+normalize-package-data@^3.0.0:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-3.0.2.tgz#cae5c410ae2434f9a6c1baa65d5bc3b9366c8699"
+  integrity sha512-6CdZocmfGaKnIHPVFhJJZ3GuR8SsLKvDANFp47Jmy51aKIr8akjAWTSxtpI+MBgBFdSMRyo4hMpDlT6dTffgZg==
+  dependencies:
+    hosted-git-info "^4.0.1"
+    resolve "^1.20.0"
+    semver "^7.3.4"
+    validate-npm-package-license "^3.0.1"
+
+normalize-path@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
+  integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=
+  dependencies:
+    remove-trailing-separator "^1.0.1"
+
+normalize-path@^3.0.0, normalize-path@~3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
+  integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
+
+normalize-range@^0.1.2:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942"
+  integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=
+
+normalize-selector@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/normalize-selector/-/normalize-selector-0.2.0.tgz#d0b145eb691189c63a78d201dc4fdb1293ef0c03"
+  integrity sha1-0LFF62kRicY6eNIB3E/bEpPvDAM=
+
+normalize-url@^6.0.1:
+  version "6.0.1"
+  resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.0.1.tgz#a4f27f58cf8c7b287b440b8a8201f42d0b00d256"
+  integrity sha512-VU4pzAuh7Kip71XEmO9aNREYAdMHFGTVj/i+CaTImS8x0i1d3jUZkXhqluy/PRgjPLMgsLQulYY3PJ/aSbSjpQ==
+
+nth-check@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.0.0.tgz#1bb4f6dac70072fc313e8c9cd1417b5074c0a125"
+  integrity sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q==
+  dependencies:
+    boolbase "^1.0.0"
+
+num2fraction@^1.2.2:
+  version "1.2.2"
+  resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede"
+  integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=
+
+number-is-nan@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
+  integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=
+
+nvd3@^1.8.6:
+  version "1.8.6"
+  resolved "https://registry.yarnpkg.com/nvd3/-/nvd3-1.8.6.tgz#2d3eba74bf33363b5101ebf1d093c59a53ae73c4"
+  integrity sha1-LT66dL8zNjtRAevx0JPFmlOuc8Q=
+
+oas-kit-common@^1.0.8:
+  version "1.0.8"
+  resolved "https://registry.yarnpkg.com/oas-kit-common/-/oas-kit-common-1.0.8.tgz#6d8cacf6e9097967a4c7ea8bcbcbd77018e1f535"
+  integrity sha512-pJTS2+T0oGIwgjGpw7sIRU8RQMcUoKCDWFLdBqKB2BNmGpbBMH2sdqAaOXUg8OzonZHU0L7vfJu1mJFEiYDWOQ==
+  dependencies:
+    fast-safe-stringify "^2.0.7"
+
+oas-linter@^3.1.3:
+  version "3.2.1"
+  resolved "https://registry.yarnpkg.com/oas-linter/-/oas-linter-3.2.1.tgz#1a6d9117d146805b58e56df479861de0293b6e5b"
+  integrity sha512-e5G6bbq3Nrfxm+SDPR5AiZ6n2smVUmhLA1OgI2/Bl8e2ywfWsKw/yuqrwiXXiNHb1wdM/GyPMX6QjCGJODlaaA==
+  dependencies:
+    "@exodus/schemasafe" "^1.0.0-rc.2"
+    should "^13.2.1"
+    yaml "^1.10.0"
+
+oas-resolver@^2.4.3:
+  version "2.5.4"
+  resolved "https://registry.yarnpkg.com/oas-resolver/-/oas-resolver-2.5.4.tgz#81fa1aaa7e2387ab2dba1045827e9d7b79822326"
+  integrity sha512-1vIj5Wkjmi+kZj5sFamt95LkuXoalmoKUohtaUQoCQZjLfPFaY8uZ7nw6IZaWuE6eLON2b6xrXhxD4hiTdYl0g==
+  dependencies:
+    node-fetch-h2 "^2.3.0"
+    oas-kit-common "^1.0.8"
+    reftools "^1.1.8"
+    yaml "^1.10.0"
+    yargs "^16.1.1"
+
+oas-schema-walker@^1.1.5:
+  version "1.1.5"
+  resolved "https://registry.yarnpkg.com/oas-schema-walker/-/oas-schema-walker-1.1.5.tgz#74c3cd47b70ff8e0b19adada14455b5d3ac38a22"
+  integrity sha512-2yucenq1a9YPmeNExoUa9Qwrt9RFkjqaMAA1X+U7sbb0AqBeTIdMHky9SQQ6iN94bO5NW0W4TRYXerG+BdAvAQ==
+
+oas-validator@^4.0.8:
+  version "4.0.8"
+  resolved "https://registry.yarnpkg.com/oas-validator/-/oas-validator-4.0.8.tgz#4f1a4d6bd9e030ad07db03fd7a7bc3a91aabcc7d"
+  integrity sha512-bIt8erTyclF7bkaySTtQ9sppqyVc+mAlPi7vPzCLVHJsL9nrivQjc/jHLX/o+eGbxHd6a6YBwuY/Vxa6wGsiuw==
+  dependencies:
+    ajv "^5.5.2"
+    better-ajv-errors "^0.6.7"
+    call-me-maybe "^1.0.1"
+    oas-kit-common "^1.0.8"
+    oas-linter "^3.1.3"
+    oas-resolver "^2.4.3"
+    oas-schema-walker "^1.1.5"
+    reftools "^1.1.5"
+    should "^13.2.1"
+    yaml "^1.8.3"
+
+object-assign@^4.0.1, object-assign@^4.1.1:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+  integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
+
+object-copy@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c"
+  integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw=
+  dependencies:
+    copy-descriptor "^0.1.0"
+    define-property "^0.2.5"
+    kind-of "^3.0.3"
+
+object-inspect@^1.7.0:
+  version "1.7.0"
+  resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67"
+  integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==
+
+object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
+  integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
+
+object-visit@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb"
+  integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=
+  dependencies:
+    isobject "^3.0.0"
+
+object.assign@^4.1.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da"
+  integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==
+  dependencies:
+    define-properties "^1.1.2"
+    function-bind "^1.1.1"
+    has-symbols "^1.0.0"
+    object-keys "^1.0.11"
+
+object.entries@^1.1.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.1.tgz#ee1cf04153de02bb093fec33683900f57ce5399b"
+  integrity sha512-ilqR7BgdyZetJutmDPfXCDffGa0/Yzl2ivVNpbx/g4UeWrCdRnFDUBrKJGLhGieRHDATnyZXWBeCb29k9CJysQ==
+  dependencies:
+    define-properties "^1.1.3"
+    es-abstract "^1.17.0-next.1"
+    function-bind "^1.1.1"
+    has "^1.0.3"
+
+object.entries@^1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.2.tgz#bc73f00acb6b6bb16c203434b10f9a7e797d3add"
+  integrity sha512-BQdB9qKmb/HyNdMNWVr7O3+z5MUIx3aiegEIJqjMBbBf0YT9RRxTJSim4mzFqtyr7PDAHigq0N9dO0m0tRakQA==
+  dependencies:
+    define-properties "^1.1.3"
+    es-abstract "^1.17.5"
+    has "^1.0.3"
+
+object.pick@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747"
+  integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=
+  dependencies:
+    isobject "^3.0.1"
+
+object.values@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e"
+  integrity sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==
+  dependencies:
+    define-properties "^1.1.3"
+    es-abstract "^1.17.0-next.1"
+    function-bind "^1.1.1"
+    has "^1.0.3"
+
+once@^1.3.0, once@^1.3.1, once@^1.4.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+  integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
+  dependencies:
+    wrappy "1"
+
+ono@^4.0.11:
+  version "4.0.11"
+  resolved "https://registry.yarnpkg.com/ono/-/ono-4.0.11.tgz#c7f4209b3e396e8a44ef43b9cedc7f5d791d221d"
+  integrity sha512-jQ31cORBFE6td25deYeD80wxKBMj+zBmHTrVxnc6CKhx8gho6ipmWM5zj/oeoqioZ99yqBls9Z/9Nss7J26G2g==
+  dependencies:
+    format-util "^1.0.3"
+
+openapi-sampler@^1.0.0-beta.18:
+  version "1.0.0-beta.18"
+  resolved "https://registry.yarnpkg.com/openapi-sampler/-/openapi-sampler-1.0.0-beta.18.tgz#9e0845616a669e048860625ea5c10d0f554f1b53"
+  integrity sha512-nG/0kvvSY5FbrU5A+Dbp1xTQN++7pKIh87/atryZlxrzDuok5Y6TCbpxO1jYqpUKLycE4ReKGHCywezngG6xtQ==
+  dependencies:
+    json-pointer "^0.6.0"
+
+optimize-css-assets-webpack-plugin@6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-6.0.0.tgz#00acd99d420715ad96ed3d8ad65a8a4df1be233b"
+  integrity sha512-XKVxJuCBSslP1Eyuf1uVtZT3Pkp6jEIkmg7BMcNU/pq6XAnDXTINkYFWmiQWt8+j//FO4dIDd4v+gn0m5VWJIw==
+  dependencies:
+    cssnano "^5.0.2"
+    last-call-webpack-plugin "^3.0.0"
+    postcss "^8.2.1"
+
+optionator@^0.9.1:
+  version "0.9.1"
+  resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499"
+  integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==
+  dependencies:
+    deep-is "^0.1.3"
+    fast-levenshtein "^2.0.6"
+    levn "^0.4.1"
+    prelude-ls "^1.2.1"
+    type-check "^0.4.0"
+    word-wrap "^1.2.3"
+
+os-browserify@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27"
+  integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=
+
+os-homedir@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
+  integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M=
+
+os-tmpdir@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
+  integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=
+
+p-limit@^1.1.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8"
+  integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==
+  dependencies:
+    p-try "^1.0.0"
+
+p-limit@^2.0.0, p-limit@^2.2.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1"
+  integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==
+  dependencies:
+    p-try "^2.0.0"
+
+p-limit@^3.0.1:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.0.2.tgz#1664e010af3cadc681baafd3e2a437be7b0fb5fe"
+  integrity sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==
+  dependencies:
+    p-try "^2.0.0"
+
+p-locate@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
+  integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=
+  dependencies:
+    p-limit "^1.1.0"
+
+p-locate@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4"
+  integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==
+  dependencies:
+    p-limit "^2.0.0"
+
+p-locate@^4.1.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07"
+  integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==
+  dependencies:
+    p-limit "^2.2.0"
+
+p-map@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175"
+  integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==
+
+p-map@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b"
+  integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==
+  dependencies:
+    aggregate-error "^3.0.0"
+
+p-try@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
+  integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=
+
+p-try@^2.0.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
+  integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
+
+pako@~1.0.5:
+  version "1.0.11"
+  resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf"
+  integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==
+
+parallel-transform@^1.1.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc"
+  integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==
+  dependencies:
+    cyclist "^1.0.1"
+    inherits "^2.0.3"
+    readable-stream "^2.1.5"
+
+parent-module@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"
+  integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==
+  dependencies:
+    callsites "^3.0.0"
+
+parse-asn1@^5.0.0, parse-asn1@^5.1.5:
+  version "5.1.5"
+  resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.5.tgz#003271343da58dc94cace494faef3d2147ecea0e"
+  integrity sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==
+  dependencies:
+    asn1.js "^4.0.0"
+    browserify-aes "^1.0.0"
+    create-hash "^1.1.0"
+    evp_bytestokey "^1.0.0"
+    pbkdf2 "^3.0.3"
+    safe-buffer "^5.1.1"
+
+parse-entities@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8"
+  integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==
+  dependencies:
+    character-entities "^1.0.0"
+    character-entities-legacy "^1.0.0"
+    character-reference-invalid "^1.0.0"
+    is-alphanumerical "^1.0.0"
+    is-decimal "^1.0.0"
+    is-hexadecimal "^1.0.0"
+
+parse-json@^2.2.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
+  integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=
+  dependencies:
+    error-ex "^1.2.0"
+
+parse-json@^5.0.0:
+  version "5.2.0"
+  resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd"
+  integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==
+  dependencies:
+    "@babel/code-frame" "^7.0.0"
+    error-ex "^1.3.1"
+    json-parse-even-better-errors "^2.3.0"
+    lines-and-columns "^1.1.6"
+
+parse-passwd@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6"
+  integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=
+
+pascalcase@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
+  integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=
+
+path-browserify@0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a"
+  integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==
+
+path-dirname@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0"
+  integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=
+
+path-exists@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
+  integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=
+
+path-exists@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
+  integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
+
+path-is-absolute@^1.0.0, path-is-absolute@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+  integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
+
+path-is-inside@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53"
+  integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=
+
+path-key@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
+  integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=
+
+path-key@^3.1.0:
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
+  integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
+
+path-parse@^1.0.6:
+  version "1.0.6"
+  resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c"
+  integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==
+
+path-type@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73"
+  integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=
+  dependencies:
+    pify "^2.0.0"
+
+path-type@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
+  integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
+
+pbkdf2@^3.0.3:
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.1.tgz#cb8724b0fada984596856d1a6ebafd3584654b94"
+  integrity sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==
+  dependencies:
+    create-hash "^1.1.2"
+    create-hmac "^1.1.4"
+    ripemd160 "^2.0.1"
+    safe-buffer "^5.0.1"
+    sha.js "^2.4.8"
+
+perfect-scrollbar@^1.4.0:
+  version "1.5.0"
+  resolved "https://registry.yarnpkg.com/perfect-scrollbar/-/perfect-scrollbar-1.5.0.tgz#821d224ed8ff61990c23f26db63048cdc75b6b83"
+  integrity sha512-NrNHJn5mUGupSiheBTy6x+6SXCFbLlm8fVZh9moIzw/LgqElN5q4ncR4pbCBCYuCJ8Kcl9mYM0NgDxvW+b4LxA==
+
+picomatch@^2.0.4:
+  version "2.2.2"
+  resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad"
+  integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==
+
+picomatch@^2.2.1, picomatch@^2.2.3:
+  version "2.2.3"
+  resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.3.tgz#465547f359ccc206d3c48e46a1bcb89bf7ee619d"
+  integrity sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==
+
+pify@^2.0.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
+  integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw=
+
+pify@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231"
+  integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==
+
+pinkie-promise@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa"
+  integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o=
+  dependencies:
+    pinkie "^2.0.0"
+
+pinkie@^2.0.0:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
+  integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA=
+
+pkg-dir@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b"
+  integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=
+  dependencies:
+    find-up "^2.1.0"
+
+pkg-dir@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3"
+  integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==
+  dependencies:
+    find-up "^3.0.0"
+
+pkg-dir@^4.1.0:
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3"
+  integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==
+  dependencies:
+    find-up "^4.0.0"
+
+polished@^3.6.5:
+  version "3.7.1"
+  resolved "https://registry.yarnpkg.com/polished/-/polished-3.7.1.tgz#d1addc87ee16eb5b413c6165eda37600cccb9c11"
+  integrity sha512-/QgHrNGYwIA4mwxJ/7FSvalUJsm7KNfnXiScVSEG2Xa5qxDeBn4nmdjN2pW00mkM2Tts64ktc47U8F7Ed1BRAA==
+  dependencies:
+    "@babel/runtime" "^7.12.5"
+
+posix-character-classes@^0.1.0:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
+  integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=
+
+postcss-calc@^8.0.0:
+  version "8.0.0"
+  resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-8.0.0.tgz#a05b87aacd132740a5db09462a3612453e5df90a"
+  integrity sha512-5NglwDrcbiy8XXfPM11F3HeC6hoT9W7GUH/Zi5U/p7u3Irv4rHhdDcIZwG0llHXV4ftsBjpfWMXAnXNl4lnt8g==
+  dependencies:
+    postcss-selector-parser "^6.0.2"
+    postcss-value-parser "^4.0.2"
+
+postcss-colormin@^5.2.0:
+  version "5.2.0"
+  resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-5.2.0.tgz#2b620b88c0ff19683f3349f4cf9e24ebdafb2c88"
+  integrity sha512-+HC6GfWU3upe5/mqmxuqYZ9B2Wl4lcoUUNkoaX59nEWV4EtADCMiBqui111Bu8R8IvaZTmqmxrqOAqjbHIwXPw==
+  dependencies:
+    browserslist "^4.16.6"
+    caniuse-api "^3.0.0"
+    colord "^2.0.1"
+    postcss-value-parser "^4.1.0"
+
+postcss-convert-values@^5.0.1:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-5.0.1.tgz#4ec19d6016534e30e3102fdf414e753398645232"
+  integrity sha512-C3zR1Do2BkKkCgC0g3sF8TS0koF2G+mN8xxayZx3f10cIRmTaAnpgpRQZjNekTZxM2ciSPoh2IWJm0VZx8NoQg==
+  dependencies:
+    postcss-value-parser "^4.1.0"
+
+postcss-discard-comments@^5.0.1:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-5.0.1.tgz#9eae4b747cf760d31f2447c27f0619d5718901fe"
+  integrity sha512-lgZBPTDvWrbAYY1v5GYEv8fEO/WhKOu/hmZqmCYfrpD6eyDWWzAOsl2rF29lpvziKO02Gc5GJQtlpkTmakwOWg==
+
+postcss-discard-duplicates@^5.0.1:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-5.0.1.tgz#68f7cc6458fe6bab2e46c9f55ae52869f680e66d"
+  integrity sha512-svx747PWHKOGpAXXQkCc4k/DsWo+6bc5LsVrAsw+OU+Ibi7klFZCyX54gjYzX4TH+f2uzXjRviLARxkMurA2bA==
+
+postcss-discard-empty@^5.0.1:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-5.0.1.tgz#ee136c39e27d5d2ed4da0ee5ed02bc8a9f8bf6d8"
+  integrity sha512-vfU8CxAQ6YpMxV2SvMcMIyF2LX1ZzWpy0lqHDsOdaKKLQVQGVP1pzhrI9JlsO65s66uQTfkQBKBD/A5gp9STFw==
+
+postcss-discard-overridden@^5.0.1:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-5.0.1.tgz#454b41f707300b98109a75005ca4ab0ff2743ac6"
+  integrity sha512-Y28H7y93L2BpJhrdUR2SR2fnSsT+3TVx1NmVQLbcnZWwIUpJ7mfcTC6Za9M2PG6w8j7UQRfzxqn8jU2VwFxo3Q==
+
+postcss-html@^0.36.0:
+  version "0.36.0"
+  resolved "https://registry.yarnpkg.com/postcss-html/-/postcss-html-0.36.0.tgz#b40913f94eaacc2453fd30a1327ad6ee1f88b204"
+  integrity sha512-HeiOxGcuwID0AFsNAL0ox3mW6MHH5cstWN1Z3Y+n6H+g12ih7LHdYxWwEA/QmrebctLjo79xz9ouK3MroHwOJw==
+  dependencies:
+    htmlparser2 "^3.10.0"
+
+postcss-less@^3.1.4:
+  version "3.1.4"
+  resolved "https://registry.yarnpkg.com/postcss-less/-/postcss-less-3.1.4.tgz#369f58642b5928ef898ffbc1a6e93c958304c5ad"
+  integrity sha512-7TvleQWNM2QLcHqvudt3VYjULVB49uiW6XzEUFmvwHzvsOEF5MwBrIXZDJQvJNFGjJQTzSzZnDoCJ8h/ljyGXA==
+  dependencies:
+    postcss "^7.0.14"
+
+postcss-media-query-parser@^0.2.3:
+  version "0.2.3"
+  resolved "https://registry.yarnpkg.com/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz#27b39c6f4d94f81b1a73b8f76351c609e5cef244"
+  integrity sha1-J7Ocb02U+Bsac7j3Y1HGCeXO8kQ=
+
+postcss-merge-longhand@^5.0.2:
+  version "5.0.2"
+  resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-5.0.2.tgz#277ada51d9a7958e8ef8cf263103c9384b322a41"
+  integrity sha512-BMlg9AXSI5G9TBT0Lo/H3PfUy63P84rVz3BjCFE9e9Y9RXQZD3+h3YO1kgTNsNJy7bBc1YQp8DmSnwLIW5VPcw==
+  dependencies:
+    css-color-names "^1.0.1"
+    postcss-value-parser "^4.1.0"
+    stylehacks "^5.0.1"
+
+postcss-merge-rules@^5.0.2:
+  version "5.0.2"
+  resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-5.0.2.tgz#d6e4d65018badbdb7dcc789c4f39b941305d410a"
+  integrity sha512-5K+Md7S3GwBewfB4rjDeol6V/RZ8S+v4B66Zk2gChRqLTCC8yjnHQ601omj9TKftS19OPGqZ/XzoqpzNQQLwbg==
+  dependencies:
+    browserslist "^4.16.6"
+    caniuse-api "^3.0.0"
+    cssnano-utils "^2.0.1"
+    postcss-selector-parser "^6.0.5"
+    vendors "^1.0.3"
+
+postcss-minify-font-values@^5.0.1:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-5.0.1.tgz#a90cefbfdaa075bd3dbaa1b33588bb4dc268addf"
+  integrity sha512-7JS4qIsnqaxk+FXY1E8dHBDmraYFWmuL6cgt0T1SWGRO5bzJf8sUoelwa4P88LEWJZweHevAiDKxHlofuvtIoA==
+  dependencies:
+    postcss-value-parser "^4.1.0"
+
+postcss-minify-gradients@^5.0.1:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-5.0.1.tgz#2dc79fd1a1afcb72a9e727bc549ce860f93565d2"
+  integrity sha512-odOwBFAIn2wIv+XYRpoN2hUV3pPQlgbJ10XeXPq8UY2N+9ZG42xu45lTn/g9zZ+d70NKSQD6EOi6UiCMu3FN7g==
+  dependencies:
+    cssnano-utils "^2.0.1"
+    is-color-stop "^1.1.0"
+    postcss-value-parser "^4.1.0"
+
+postcss-minify-params@^5.0.1:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-5.0.1.tgz#371153ba164b9d8562842fdcd929c98abd9e5b6c"
+  integrity sha512-4RUC4k2A/Q9mGco1Z8ODc7h+A0z7L7X2ypO1B6V8057eVK6mZ6xwz6QN64nHuHLbqbclkX1wyzRnIrdZehTEHw==
+  dependencies:
+    alphanum-sort "^1.0.2"
+    browserslist "^4.16.0"
+    cssnano-utils "^2.0.1"
+    postcss-value-parser "^4.1.0"
+    uniqs "^2.0.0"
+
+postcss-minify-selectors@^5.1.0:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-5.1.0.tgz#4385c845d3979ff160291774523ffa54eafd5a54"
+  integrity sha512-NzGBXDa7aPsAcijXZeagnJBKBPMYLaJJzB8CQh6ncvyl2sIndLVWfbcDi0SBjRWk5VqEjXvf8tYwzoKf4Z07og==
+  dependencies:
+    alphanum-sort "^1.0.2"
+    postcss-selector-parser "^6.0.5"
+
+postcss-modules-extract-imports@^1.0.0:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.1.tgz#dc87e34148ec7eab5f791f7cd5849833375b741a"
+  integrity sha512-6jt9XZwUhwmRUhb/CkyJY020PYaPJsCyt3UjbaWo6XEbH/94Hmv6MP7fG2C5NDU/BcHzyGYxNtHvM+LTf9HrYw==
+  dependencies:
+    postcss "^6.0.1"
+
+postcss-modules-extract-imports@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e"
+  integrity sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==
+  dependencies:
+    postcss "^7.0.5"
+
+postcss-modules-local-by-default@^1.0.1:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz#f7d80c398c5a393fa7964466bd19500a7d61c069"
+  integrity sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=
+  dependencies:
+    css-selector-tokenizer "^0.7.0"
+    postcss "^6.0.1"
+
+postcss-modules-local-by-default@^3.0.2:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.2.tgz#e8a6561be914aaf3c052876377524ca90dbb7915"
+  integrity sha512-jM/V8eqM4oJ/22j0gx4jrp63GSvDH6v86OqyTHHUvk4/k1vceipZsaymiZ5PvocqZOl5SFHiFJqjs3la0wnfIQ==
+  dependencies:
+    icss-utils "^4.1.1"
+    postcss "^7.0.16"
+    postcss-selector-parser "^6.0.2"
+    postcss-value-parser "^4.0.0"
+
+postcss-modules-resolve-imports@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/postcss-modules-resolve-imports/-/postcss-modules-resolve-imports-1.3.0.tgz#398d3000b95ae969420cdf4cd83fa8067f1c5eae"
+  integrity sha1-OY0wALla6WlCDN9M2D+oBn8cXq4=
+  dependencies:
+    css-selector-tokenizer "^0.7.0"
+    icss-utils "^3.0.1"
+    minimist "^1.2.0"
+
+postcss-modules-scope@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz#d6ea64994c79f97b62a72b426fbe6056a194bb90"
+  integrity sha1-1upkmUx5+XtipytCb75gVqGUu5A=
+  dependencies:
+    css-selector-tokenizer "^0.7.0"
+    postcss "^6.0.1"
+
+postcss-modules-scope@^2.2.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz#385cae013cc7743f5a7d7602d1073a89eaae62ee"
+  integrity sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==
+  dependencies:
+    postcss "^7.0.6"
+    postcss-selector-parser "^6.0.0"
+
+postcss-modules-values@^1.1.1:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz#ecffa9d7e192518389f42ad0e83f72aec456ea20"
+  integrity sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=
+  dependencies:
+    icss-replace-symbols "^1.1.0"
+    postcss "^6.0.1"
+
+postcss-modules-values@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz#5b5000d6ebae29b4255301b4a3a54574423e7f10"
+  integrity sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==
+  dependencies:
+    icss-utils "^4.0.0"
+    postcss "^7.0.6"
+
+postcss-normalize-charset@^5.0.1:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-5.0.1.tgz#121559d1bebc55ac8d24af37f67bd4da9efd91d0"
+  integrity sha512-6J40l6LNYnBdPSk+BHZ8SF+HAkS4q2twe5jnocgd+xWpz/mx/5Sa32m3W1AA8uE8XaXN+eg8trIlfu8V9x61eg==
+
+postcss-normalize-display-values@^5.0.1:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-5.0.1.tgz#62650b965981a955dffee83363453db82f6ad1fd"
+  integrity sha512-uupdvWk88kLDXi5HEyI9IaAJTE3/Djbcrqq8YgjvAVuzgVuqIk3SuJWUisT2gaJbZm1H9g5k2w1xXilM3x8DjQ==
+  dependencies:
+    cssnano-utils "^2.0.1"
+    postcss-value-parser "^4.1.0"
+
+postcss-normalize-positions@^5.0.1:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-5.0.1.tgz#868f6af1795fdfa86fbbe960dceb47e5f9492fe5"
+  integrity sha512-rvzWAJai5xej9yWqlCb1OWLd9JjW2Ex2BCPzUJrbaXmtKtgfL8dBMOOMTX6TnvQMtjk3ei1Lswcs78qKO1Skrg==
+  dependencies:
+    postcss-value-parser "^4.1.0"
+
+postcss-normalize-repeat-style@^5.0.1:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.0.1.tgz#cbc0de1383b57f5bb61ddd6a84653b5e8665b2b5"
+  integrity sha512-syZ2itq0HTQjj4QtXZOeefomckiV5TaUO6ReIEabCh3wgDs4Mr01pkif0MeVwKyU/LHEkPJnpwFKRxqWA/7O3w==
+  dependencies:
+    cssnano-utils "^2.0.1"
+    postcss-value-parser "^4.1.0"
+
+postcss-normalize-string@^5.0.1:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-5.0.1.tgz#d9eafaa4df78c7a3b973ae346ef0e47c554985b0"
+  integrity sha512-Ic8GaQ3jPMVl1OEn2U//2pm93AXUcF3wz+OriskdZ1AOuYV25OdgS7w9Xu2LO5cGyhHCgn8dMXh9bO7vi3i9pA==
+  dependencies:
+    postcss-value-parser "^4.1.0"
+
+postcss-normalize-timing-functions@^5.0.1:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.0.1.tgz#8ee41103b9130429c6cbba736932b75c5e2cb08c"
+  integrity sha512-cPcBdVN5OsWCNEo5hiXfLUnXfTGtSFiBU9SK8k7ii8UD7OLuznzgNRYkLZow11BkQiiqMcgPyh4ZqXEEUrtQ1Q==
+  dependencies:
+    cssnano-utils "^2.0.1"
+    postcss-value-parser "^4.1.0"
+
+postcss-normalize-unicode@^5.0.1:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-5.0.1.tgz#82d672d648a411814aa5bf3ae565379ccd9f5e37"
+  integrity sha512-kAtYD6V3pK0beqrU90gpCQB7g6AOfP/2KIPCVBKJM2EheVsBQmx/Iof+9zR9NFKLAx4Pr9mDhogB27pmn354nA==
+  dependencies:
+    browserslist "^4.16.0"
+    postcss-value-parser "^4.1.0"
+
+postcss-normalize-url@^5.0.2:
+  version "5.0.2"
+  resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-5.0.2.tgz#ddcdfb7cede1270740cf3e4dfc6008bd96abc763"
+  integrity sha512-k4jLTPUxREQ5bpajFQZpx8bCF2UrlqOTzP9kEqcEnOfwsRshWs2+oAFIHfDQB8GO2PaUaSE0NlTAYtbluZTlHQ==
+  dependencies:
+    is-absolute-url "^3.0.3"
+    normalize-url "^6.0.1"
+    postcss-value-parser "^4.1.0"
+
+postcss-normalize-whitespace@^5.0.1:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.0.1.tgz#b0b40b5bcac83585ff07ead2daf2dcfbeeef8e9a"
+  integrity sha512-iPklmI5SBnRvwceb/XH568yyzK0qRVuAG+a1HFUsFRf11lEJTiQQa03a4RSCQvLKdcpX7XsI1Gen9LuLoqwiqA==
+  dependencies:
+    postcss-value-parser "^4.1.0"
+
+postcss-ordered-values@^5.0.2:
+  version "5.0.2"
+  resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-5.0.2.tgz#1f351426977be00e0f765b3164ad753dac8ed044"
+  integrity sha512-8AFYDSOYWebJYLyJi3fyjl6CqMEG/UVworjiyK1r573I56kb3e879sCJLGvR3merj+fAdPpVplXKQZv+ey6CgQ==
+  dependencies:
+    cssnano-utils "^2.0.1"
+    postcss-value-parser "^4.1.0"
+
+postcss-reduce-initial@^5.0.1:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-5.0.1.tgz#9d6369865b0f6f6f6b165a0ef5dc1a4856c7e946"
+  integrity sha512-zlCZPKLLTMAqA3ZWH57HlbCjkD55LX9dsRyxlls+wfuRfqCi5mSlZVan0heX5cHr154Dq9AfbH70LyhrSAezJw==
+  dependencies:
+    browserslist "^4.16.0"
+    caniuse-api "^3.0.0"
+
+postcss-reduce-transforms@^5.0.1:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-5.0.1.tgz#93c12f6a159474aa711d5269923e2383cedcf640"
+  integrity sha512-a//FjoPeFkRuAguPscTVmRQUODP+f3ke2HqFNgGPwdYnpeC29RZdCBvGRGTsKpMURb/I3p6jdKoBQ2zI+9Q7kA==
+  dependencies:
+    cssnano-utils "^2.0.1"
+    postcss-value-parser "^4.1.0"
+
+postcss-resolve-nested-selector@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz#29ccbc7c37dedfac304e9fff0bf1596b3f6a0e4e"
+  integrity sha1-Kcy8fDfe36wwTp//C/FZaz9qDk4=
+
+postcss-safe-parser@^4.0.2:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/postcss-safe-parser/-/postcss-safe-parser-4.0.2.tgz#a6d4e48f0f37d9f7c11b2a581bf00f8ba4870b96"
+  integrity sha512-Uw6ekxSWNLCPesSv/cmqf2bY/77z11O7jZGPax3ycZMFU/oi2DMH9i89AdHc1tRwFg/arFoEwX0IS3LCUxJh1g==
+  dependencies:
+    postcss "^7.0.26"
+
+postcss-sass@^0.4.4:
+  version "0.4.4"
+  resolved "https://registry.yarnpkg.com/postcss-sass/-/postcss-sass-0.4.4.tgz#91f0f3447b45ce373227a98b61f8d8f0785285a3"
+  integrity sha512-BYxnVYx4mQooOhr+zer0qWbSPYnarAy8ZT7hAQtbxtgVf8gy+LSLT/hHGe35h14/pZDTw1DsxdbrwxBN++H+fg==
+  dependencies:
+    gonzales-pe "^4.3.0"
+    postcss "^7.0.21"
+
+postcss-scss@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/postcss-scss/-/postcss-scss-2.1.1.tgz#ec3a75fa29a55e016b90bf3269026c53c1d2b383"
+  integrity sha512-jQmGnj0hSGLd9RscFw9LyuSVAa5Bl1/KBPqG1NQw9w8ND55nY4ZEsdlVuYJvLPpV+y0nwTV5v/4rHPzZRihQbA==
+  dependencies:
+    postcss "^7.0.6"
+
+postcss-selector-parser@^6.0.0:
+  version "6.0.2"
+  resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz#934cf799d016c83411859e09dcecade01286ec5c"
+  integrity sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==
+  dependencies:
+    cssesc "^3.0.0"
+    indexes-of "^1.0.1"
+    uniq "^1.0.1"
+
+postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5:
+  version "6.0.6"
+  resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz#2c5bba8174ac2f6981ab631a42ab0ee54af332ea"
+  integrity sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==
+  dependencies:
+    cssesc "^3.0.0"
+    util-deprecate "^1.0.2"
+
+postcss-svgo@^5.0.2:
+  version "5.0.2"
+  resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-5.0.2.tgz#bc73c4ea4c5a80fbd4b45e29042c34ceffb9257f"
+  integrity sha512-YzQuFLZu3U3aheizD+B1joQ94vzPfE6BNUcSYuceNxlVnKKsOtdo6hL9/zyC168Q8EwfLSgaDSalsUGa9f2C0A==
+  dependencies:
+    postcss-value-parser "^4.1.0"
+    svgo "^2.3.0"
+
+postcss-syntax@^0.36.2:
+  version "0.36.2"
+  resolved "https://registry.yarnpkg.com/postcss-syntax/-/postcss-syntax-0.36.2.tgz#f08578c7d95834574e5593a82dfbfa8afae3b51c"
+  integrity sha512-nBRg/i7E3SOHWxF3PpF5WnJM/jQ1YpY9000OaVXlAQj6Zp/kIqJxEDWIZ67tAd7NLuk7zqN4yqe9nc0oNAOs1w==
+
+postcss-unique-selectors@^5.0.1:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-5.0.1.tgz#3be5c1d7363352eff838bd62b0b07a0abad43bfc"
+  integrity sha512-gwi1NhHV4FMmPn+qwBNuot1sG1t2OmacLQ/AX29lzyggnjd+MnVD5uqQmpXO3J17KGL2WAxQruj1qTd3H0gG/w==
+  dependencies:
+    alphanum-sort "^1.0.2"
+    postcss-selector-parser "^6.0.5"
+    uniqs "^2.0.0"
+
+postcss-value-parser@^4.0.0, postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb"
+  integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==
+
+postcss@^6.0.1, postcss@^6.0.2:
+  version "6.0.23"
+  resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324"
+  integrity sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==
+  dependencies:
+    chalk "^2.4.1"
+    source-map "^0.6.1"
+    supports-color "^5.4.0"
+
+postcss@^7.0.14, postcss@^7.0.2, postcss@^7.0.21, postcss@^7.0.26, postcss@^7.0.32, postcss@^7.0.35, postcss@^7.0.6:
+  version "7.0.35"
+  resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.35.tgz#d2be00b998f7f211d8a276974079f2e92b970e24"
+  integrity sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==
+  dependencies:
+    chalk "^2.4.2"
+    source-map "^0.6.1"
+    supports-color "^6.1.0"
+
+postcss@^7.0.16, postcss@^7.0.5:
+  version "7.0.32"
+  resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.32.tgz#4310d6ee347053da3433db2be492883d62cec59d"
+  integrity sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==
+  dependencies:
+    chalk "^2.4.2"
+    source-map "^0.6.1"
+    supports-color "^6.1.0"
+
+postcss@^8.2.1:
+  version "8.3.1"
+  resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.3.1.tgz#71f380151c227f83b898294a46481f689f86b70a"
+  integrity sha512-9qH0MGjsSm+fjxOi3GnwViL1otfi7qkj+l/WX5gcRGmZNGsIcqc+A5fBkE6PUobEQK4APqYVaES+B3Uti98TCw==
+  dependencies:
+    colorette "^1.2.2"
+    nanoid "^3.1.23"
+    source-map-js "^0.6.2"
+
+prelude-ls@^1.2.1:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
+  integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
+
+prismjs@^1.22.0:
+  version "1.23.0"
+  resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.23.0.tgz#d3b3967f7d72440690497652a9d40ff046067f33"
+  integrity sha512-c29LVsqOaLbBHuIbsTxaKENh1N2EQBOHaWv7gkHN4dgRbxSREqDnDbtFJYdpPauS4YCplMSNCABQ6Eeor69bAA==
+  optionalDependencies:
+    clipboard "^2.0.0"
+
+private@^0.1.8:
+  version "0.1.8"
+  resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff"
+  integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==
+
+process-nextick-args@~2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
+  integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
+
+process@^0.11.10:
+  version "0.11.10"
+  resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
+  integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI=
+
+progress@^2.0.0:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
+  integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
+
+promise-inflight@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3"
+  integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM=
+
+prop-types@^15.5.0, prop-types@^15.7.2:
+  version "15.7.2"
+  resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5"
+  integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==
+  dependencies:
+    loose-envify "^1.4.0"
+    object-assign "^4.1.1"
+    react-is "^16.8.1"
+
+prr@~1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
+  integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY=
+
+public-encrypt@^4.0.0:
+  version "4.0.3"
+  resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0"
+  integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==
+  dependencies:
+    bn.js "^4.1.0"
+    browserify-rsa "^4.0.0"
+    create-hash "^1.1.0"
+    parse-asn1 "^5.0.0"
+    randombytes "^2.0.1"
+    safe-buffer "^5.1.2"
+
+pump@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909"
+  integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==
+  dependencies:
+    end-of-stream "^1.1.0"
+    once "^1.3.1"
+
+pump@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
+  integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==
+  dependencies:
+    end-of-stream "^1.1.0"
+    once "^1.3.1"
+
+pumpify@^1.3.3:
+  version "1.5.1"
+  resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce"
+  integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==
+  dependencies:
+    duplexify "^3.6.0"
+    inherits "^2.0.3"
+    pump "^2.0.0"
+
+punycode@1.3.2:
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
+  integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=
+
+punycode@^1.2.4:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
+  integrity sha1-wNWmOycYgArY4esPpSachN1BhF4=
+
+punycode@^2.1.0:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
+  integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
+
+querystring-es3@^0.2.0:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73"
+  integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=
+
+querystring@0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
+  integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=
+
+queue-microtask@^1.2.2:
+  version "1.2.3"
+  resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
+  integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
+
+quick-lru@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f"
+  integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==
+
+randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
+  integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==
+  dependencies:
+    safe-buffer "^5.1.0"
+
+randomfill@^1.0.3:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458"
+  integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==
+  dependencies:
+    randombytes "^2.0.5"
+    safe-buffer "^5.1.0"
+
+react-is@^16.8.1:
+  version "16.13.1"
+  resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
+  integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
+
+react-tabs@^3.1.1:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/react-tabs/-/react-tabs-3.2.0.tgz#0fd8d595ef26d3684da876c27a3cc90392dffb40"
+  integrity sha512-q7oNapNRoYTQq8gDhApXwdBheuuN5qQ4YvUaQUAkb6OSSttJulBAvxJ0FS6W5uojvMxbbIZKu1f2I+GXISoLjw==
+  dependencies:
+    clsx "^1.1.0"
+    prop-types "^15.5.0"
+
+read-pkg-up@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be"
+  integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=
+  dependencies:
+    find-up "^2.0.0"
+    read-pkg "^2.0.0"
+
+read-pkg-up@^7.0.1:
+  version "7.0.1"
+  resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507"
+  integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==
+  dependencies:
+    find-up "^4.1.0"
+    read-pkg "^5.2.0"
+    type-fest "^0.8.1"
+
+read-pkg@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8"
+  integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=
+  dependencies:
+    load-json-file "^2.0.0"
+    normalize-package-data "^2.3.2"
+    path-type "^2.0.0"
+
+read-pkg@^5.2.0:
+  version "5.2.0"
+  resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc"
+  integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==
+  dependencies:
+    "@types/normalize-package-data" "^2.4.0"
+    normalize-package-data "^2.5.0"
+    parse-json "^5.0.0"
+    type-fest "^0.6.0"
+
+"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6:
+  version "2.3.7"
+  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57"
+  integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==
+  dependencies:
+    core-util-is "~1.0.0"
+    inherits "~2.0.3"
+    isarray "~1.0.0"
+    process-nextick-args "~2.0.0"
+    safe-buffer "~5.1.1"
+    string_decoder "~1.1.1"
+    util-deprecate "~1.0.1"
+
+readable-stream@1.1:
+  version "1.1.13"
+  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.13.tgz#f6eef764f514c89e2b9e23146a75ba106756d23e"
+  integrity sha1-9u73ZPUUyJ4rniMUanW6EGdW0j4=
+  dependencies:
+    core-util-is "~1.0.0"
+    inherits "~2.0.1"
+    isarray "0.0.1"
+    string_decoder "~0.10.x"
+
+readable-stream@^3.1.1, readable-stream@^3.6.0:
+  version "3.6.0"
+  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
+  integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
+  dependencies:
+    inherits "^2.0.3"
+    string_decoder "^1.1.1"
+    util-deprecate "^1.0.1"
+
+readdirp@^2.2.1:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525"
+  integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==
+  dependencies:
+    graceful-fs "^4.1.11"
+    micromatch "^3.1.10"
+    readable-stream "^2.0.2"
+
+readdirp@~3.4.0:
+  version "3.4.0"
+  resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.4.0.tgz#9fdccdf9e9155805449221ac645e8303ab5b9ada"
+  integrity sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==
+  dependencies:
+    picomatch "^2.2.1"
+
+redent@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f"
+  integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==
+  dependencies:
+    indent-string "^4.0.0"
+    strip-indent "^3.0.0"
+
+redoc@^2.0.0-rc.48:
+  version "2.0.0-rc.48"
+  resolved "https://registry.yarnpkg.com/redoc/-/redoc-2.0.0-rc.48.tgz#5303cff67af5cba8a2b48dc1347a9854d45be835"
+  integrity sha512-shArJWhNG2gQ0XKxW8WcfG8peNOtxbZ86CqxgrR9P7MnE5ESAo559CH/PSlezePeVLpcC0C9tcimOfSN5MaAvA==
+  dependencies:
+    "@redocly/react-dropdown-aria" "^2.0.11"
+    "@types/node" "^13.11.1"
+    classnames "^2.2.6"
+    decko "^1.2.0"
+    dompurify "^2.0.12"
+    eventemitter3 "^4.0.4"
+    json-pointer "^0.6.0"
+    json-schema-ref-parser "^6.1.0"
+    lunr "2.3.8"
+    mark.js "^8.11.1"
+    marked "^0.7.0"
+    memoize-one "~5.1.1"
+    mobx-react "^7.0.5"
+    openapi-sampler "^1.0.0-beta.18"
+    perfect-scrollbar "^1.4.0"
+    polished "^3.6.5"
+    prismjs "^1.22.0"
+    prop-types "^15.7.2"
+    react-tabs "^3.1.1"
+    slugify "^1.4.4"
+    stickyfill "^1.1.1"
+    swagger2openapi "^6.2.1"
+    tslib "^2.0.0"
+    url-template "^2.0.8"
+
+reftools@^1.1.5, reftools@^1.1.8:
+  version "1.1.8"
+  resolved "https://registry.yarnpkg.com/reftools/-/reftools-1.1.8.tgz#cc08fd67eb913d779fd330657d010cc080c7d643"
+  integrity sha512-Yvz9NH8uFHzD/AXX82Li1GdAP6FzDBxEZw+njerNBBQv/XHihqsWAjNfXtaq4QD2l4TEZVnp4UbktdYSegAM3g==
+
+regenerate@^1.2.1:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11"
+  integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==
+
+regenerator-runtime@^0.10.5:
+  version "0.10.5"
+  resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658"
+  integrity sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=
+
+regenerator-runtime@^0.11.0:
+  version "0.11.1"
+  resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
+  integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==
+
+regenerator-runtime@^0.13.4:
+  version "0.13.7"
+  resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55"
+  integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==
+
+regex-not@^1.0.0, regex-not@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c"
+  integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==
+  dependencies:
+    extend-shallow "^3.0.2"
+    safe-regex "^1.1.0"
+
+regexpp@^3.0.0, regexpp@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2"
+  integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==
+
+regexpu-core@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-1.0.0.tgz#86a763f58ee4d7c2f6b102e4764050de7ed90c6b"
+  integrity sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=
+  dependencies:
+    regenerate "^1.2.1"
+    regjsgen "^0.2.0"
+    regjsparser "^0.1.4"
+
+regjsgen@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7"
+  integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=
+
+regjsparser@^0.1.4:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c"
+  integrity sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=
+  dependencies:
+    jsesc "~0.5.0"
+
+remark-parse@^9.0.0:
+  version "9.0.0"
+  resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-9.0.0.tgz#4d20a299665880e4f4af5d90b7c7b8a935853640"
+  integrity sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==
+  dependencies:
+    mdast-util-from-markdown "^0.8.0"
+
+remark-stringify@^9.0.0:
+  version "9.0.1"
+  resolved "https://registry.yarnpkg.com/remark-stringify/-/remark-stringify-9.0.1.tgz#576d06e910548b0a7191a71f27b33f1218862894"
+  integrity sha512-mWmNg3ZtESvZS8fv5PTvaPckdL4iNlCHTt8/e/8oN08nArHRHjNZMKzA/YW3+p7/lYqIw4nx1XsjCBo/AxNChg==
+  dependencies:
+    mdast-util-to-markdown "^0.6.0"
+
+remark@^13.0.0:
+  version "13.0.0"
+  resolved "https://registry.yarnpkg.com/remark/-/remark-13.0.0.tgz#d15d9bf71a402f40287ebe36067b66d54868e425"
+  integrity sha512-HDz1+IKGtOyWN+QgBiAT0kn+2s6ovOxHyPAFGKVE81VSzJ+mq7RwHFledEvB5F1p4iJvOah/LOKdFuzvRnNLCA==
+  dependencies:
+    remark-parse "^9.0.0"
+    remark-stringify "^9.0.0"
+    unified "^9.1.0"
+
+remove-trailing-separator@^1.0.1:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
+  integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8=
+
+repeat-element@^1.1.2:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce"
+  integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==
+
+repeat-string@^1.0.0, repeat-string@^1.6.1:
+  version "1.6.1"
+  resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
+  integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc=
+
+repeating@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda"
+  integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=
+  dependencies:
+    is-finite "^1.0.0"
+
+require-directory@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
+  integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I=
+
+require-from-string@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909"
+  integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==
+
+require-main-filename@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b"
+  integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==
+
+resolve-cwd@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a"
+  integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=
+  dependencies:
+    resolve-from "^3.0.0"
+
+resolve-dir@^1.0.0, resolve-dir@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43"
+  integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=
+  dependencies:
+    expand-tilde "^2.0.0"
+    global-modules "^1.0.0"
+
+resolve-from@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748"
+  integrity sha1-six699nWiBvItuZTM17rywoYh0g=
+
+resolve-from@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
+  integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
+
+resolve-from@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69"
+  integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==
+
+resolve-url@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
+  integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=
+
+resolve@^1.10.0, resolve@^1.20.0:
+  version "1.20.0"
+  resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975"
+  integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==
+  dependencies:
+    is-core-module "^2.2.0"
+    path-parse "^1.0.6"
+
+resolve@^1.10.1, resolve@^1.13.1, resolve@^1.17.0:
+  version "1.17.0"
+  resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444"
+  integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==
+  dependencies:
+    path-parse "^1.0.6"
+
+resolve@^1.12.0:
+  version "1.14.0"
+  resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.14.0.tgz#6d14c6f9db9f8002071332b600039abf82053f64"
+  integrity sha512-uviWSi5N67j3t3UKFxej1loCH0VZn5XuqdNxoLShPcYPw6cUZn74K1VRj+9myynRX03bxIBEkwlkob/ujLsJVw==
+  dependencies:
+    path-parse "^1.0.6"
+
+ret@~0.1.10:
+  version "0.1.15"
+  resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
+  integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==
+
+reusify@^1.0.4:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
+  integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
+
+rgb-regex@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1"
+  integrity sha1-wODWiC3w4jviVKR16O3UGRX+rrE=
+
+rgba-regex@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3"
+  integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=
+
+rimraf@2.6.3:
+  version "2.6.3"
+  resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab"
+  integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==
+  dependencies:
+    glob "^7.1.3"
+
+rimraf@^2.5.4, rimraf@^2.6.3:
+  version "2.7.1"
+  resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec"
+  integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==
+  dependencies:
+    glob "^7.1.3"
+
+rimraf@^3.0.2:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
+  integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
+  dependencies:
+    glob "^7.1.3"
+
+ripemd160@^2.0.0, ripemd160@^2.0.1:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c"
+  integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==
+  dependencies:
+    hash-base "^3.0.0"
+    inherits "^2.0.1"
+
+run-parallel@^1.1.9:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee"
+  integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==
+  dependencies:
+    queue-microtask "^1.2.2"
+
+run-queue@^1.0.0, run-queue@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47"
+  integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=
+  dependencies:
+    aproba "^1.1.1"
+
+rw@1:
+  version "1.3.3"
+  resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4"
+  integrity sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q=
+
+safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0:
+  version "5.2.1"
+  resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
+  integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
+
+safe-buffer@~5.1.0, safe-buffer@~5.1.1:
+  version "5.1.2"
+  resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
+  integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
+
+safe-regex@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
+  integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4=
+  dependencies:
+    ret "~0.1.10"
+
+"safer-buffer@>= 2.1.2 < 3":
+  version "2.1.2"
+  resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
+  integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
+
+schema-utils@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770"
+  integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==
+  dependencies:
+    ajv "^6.1.0"
+    ajv-errors "^1.0.0"
+    ajv-keywords "^3.1.0"
+
+schema-utils@^2.6.5, schema-utils@^2.6.6, schema-utils@^2.7.0:
+  version "2.7.0"
+  resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.0.tgz#17151f76d8eae67fbbf77960c33c676ad9f4efc7"
+  integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==
+  dependencies:
+    "@types/json-schema" "^7.0.4"
+    ajv "^6.12.2"
+    ajv-keywords "^3.4.1"
+
+schema-utils@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.0.0.tgz#67502f6aa2b66a2d4032b4279a2944978a0913ef"
+  integrity sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==
+  dependencies:
+    "@types/json-schema" "^7.0.6"
+    ajv "^6.12.5"
+    ajv-keywords "^3.5.2"
+
+seekout@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/seekout/-/seekout-1.0.2.tgz#09ba9f1bd5b46fbb134718eb19a68382cbb1b9c9"
+  integrity sha1-CbqfG9W0b7sTRxjrGaaDgsuxuck=
+
+select@^1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/select/-/select-1.1.2.tgz#0e7350acdec80b1108528786ec1d4418d11b396d"
+  integrity sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=
+
+"semver@2 || 3 || 4 || 5", semver@^5.5.0, semver@^5.6.0:
+  version "5.7.1"
+  resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
+  integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
+
+semver@^6.0.0, semver@^6.1.0, semver@^6.3.0:
+  version "6.3.0"
+  resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
+  integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
+
+semver@^7.2.1:
+  version "7.3.2"
+  resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938"
+  integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==
+
+semver@^7.3.4:
+  version "7.3.5"
+  resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7"
+  integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==
+  dependencies:
+    lru-cache "^6.0.0"
+
+serialize-javascript@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-3.1.0.tgz#8bf3a9170712664ef2561b44b691eafe399214ea"
+  integrity sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==
+  dependencies:
+    randombytes "^2.1.0"
+
+serialize-javascript@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa"
+  integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==
+  dependencies:
+    randombytes "^2.1.0"
+
+set-blocking@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
+  integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc=
+
+set-value@^2.0.0, set-value@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b"
+  integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==
+  dependencies:
+    extend-shallow "^2.0.1"
+    is-extendable "^0.1.1"
+    is-plain-object "^2.0.3"
+    split-string "^3.0.1"
+
+setimmediate@^1.0.4:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
+  integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=
+
+sha.js@^2.4.0, sha.js@^2.4.8:
+  version "2.4.11"
+  resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7"
+  integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==
+  dependencies:
+    inherits "^2.0.1"
+    safe-buffer "^5.0.1"
+
+shebang-command@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
+  integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=
+  dependencies:
+    shebang-regex "^1.0.0"
+
+shebang-command@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
+  integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
+  dependencies:
+    shebang-regex "^3.0.0"
+
+shebang-regex@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
+  integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=
+
+shebang-regex@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
+  integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
+
+shelljs@0.3.x:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.3.0.tgz#3596e6307a781544f591f37da618360f31db57b1"
+  integrity sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E=
+
+should-equal@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/should-equal/-/should-equal-2.0.0.tgz#6072cf83047360867e68e98b09d71143d04ee0c3"
+  integrity sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==
+  dependencies:
+    should-type "^1.4.0"
+
+should-format@^3.0.3:
+  version "3.0.3"
+  resolved "https://registry.yarnpkg.com/should-format/-/should-format-3.0.3.tgz#9bfc8f74fa39205c53d38c34d717303e277124f1"
+  integrity sha1-m/yPdPo5IFxT04w01xcwPidxJPE=
+  dependencies:
+    should-type "^1.3.0"
+    should-type-adaptors "^1.0.1"
+
+should-type-adaptors@^1.0.1:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz#401e7f33b5533033944d5cd8bf2b65027792e27a"
+  integrity sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==
+  dependencies:
+    should-type "^1.3.0"
+    should-util "^1.0.0"
+
+should-type@^1.3.0, should-type@^1.4.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/should-type/-/should-type-1.4.0.tgz#0756d8ce846dfd09843a6947719dfa0d4cff5cf3"
+  integrity sha1-B1bYzoRt/QmEOmlHcZ36DUz/XPM=
+
+should-util@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/should-util/-/should-util-1.0.1.tgz#fb0d71338f532a3a149213639e2d32cbea8bcb28"
+  integrity sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g==
+
+should@^13.2.1:
+  version "13.2.3"
+  resolved "https://registry.yarnpkg.com/should/-/should-13.2.3.tgz#96d8e5acf3e97b49d89b51feaa5ae8d07ef58f10"
+  integrity sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ==
+  dependencies:
+    should-equal "^2.0.0"
+    should-format "^3.0.3"
+    should-type "^1.4.0"
+    should-type-adaptors "^1.0.1"
+    should-util "^1.0.0"
+
+signal-exit@^3.0.2:
+  version "3.0.3"
+  resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c"
+  integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==
+
+slash@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"
+  integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=
+
+slash@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
+  integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
+
+slice-ansi@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636"
+  integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==
+  dependencies:
+    ansi-styles "^3.2.0"
+    astral-regex "^1.0.0"
+    is-fullwidth-code-point "^2.0.0"
+
+slice-ansi@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b"
+  integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==
+  dependencies:
+    ansi-styles "^4.0.0"
+    astral-regex "^2.0.0"
+    is-fullwidth-code-point "^3.0.0"
+
+slugify@^1.4.4:
+  version "1.4.7"
+  resolved "https://registry.yarnpkg.com/slugify/-/slugify-1.4.7.tgz#e42359d505afd84a44513280868e31202a79a628"
+  integrity sha512-tf+h5W1IrjNm/9rKKj0JU2MDMruiopx0jjVA5zCdBtcGjfp0+c5rHw/zADLC3IeKlGHtVbHtpfzvYA0OYT+HKg==
+
+snapdragon-node@^2.0.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
+  integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==
+  dependencies:
+    define-property "^1.0.0"
+    isobject "^3.0.0"
+    snapdragon-util "^3.0.1"
+
+snapdragon-util@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2"
+  integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==
+  dependencies:
+    kind-of "^3.2.0"
+
+snapdragon@^0.8.1:
+  version "0.8.2"
+  resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d"
+  integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==
+  dependencies:
+    base "^0.11.1"
+    debug "^2.2.0"
+    define-property "^0.2.5"
+    extend-shallow "^2.0.1"
+    map-cache "^0.2.2"
+    source-map "^0.5.6"
+    source-map-resolve "^0.5.0"
+    use "^3.1.0"
+
+source-list-map@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34"
+  integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==
+
+source-map-js@^0.6.2:
+  version "0.6.2"
+  resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-0.6.2.tgz#0bb5de631b41cfbda6cfba8bd05a80efdfd2385e"
+  integrity sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==
+
+source-map-resolve@^0.5.0:
+  version "0.5.3"
+  resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a"
+  integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==
+  dependencies:
+    atob "^2.1.2"
+    decode-uri-component "^0.2.0"
+    resolve-url "^0.2.1"
+    source-map-url "^0.4.0"
+    urix "^0.1.0"
+
+source-map-support@^0.4.15:
+  version "0.4.18"
+  resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f"
+  integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==
+  dependencies:
+    source-map "^0.5.6"
+
+source-map-support@~0.5.12:
+  version "0.5.19"
+  resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61"
+  integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==
+  dependencies:
+    buffer-from "^1.0.0"
+    source-map "^0.6.0"
+
+source-map-url@^0.4.0:
+  version "0.4.0"
+  resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3"
+  integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=
+
+source-map@^0.5.0, source-map@^0.5.6, source-map@^0.5.7:
+  version "0.5.7"
+  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
+  integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
+
+source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1:
+  version "0.6.1"
+  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+  integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
+
+source-map@^0.7.3:
+  version "0.7.3"
+  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383"
+  integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==
+
+spdx-correct@^3.0.0:
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9"
+  integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==
+  dependencies:
+    spdx-expression-parse "^3.0.0"
+    spdx-license-ids "^3.0.0"
+
+spdx-exceptions@^2.1.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d"
+  integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==
+
+spdx-expression-parse@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679"
+  integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==
+  dependencies:
+    spdx-exceptions "^2.1.0"
+    spdx-license-ids "^3.0.0"
+
+spdx-license-ids@^3.0.0:
+  version "3.0.7"
+  resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz#e9c18a410e5ed7e12442a549fbd8afa767038d65"
+  integrity sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==
+
+specificity@^0.4.1:
+  version "0.4.1"
+  resolved "https://registry.yarnpkg.com/specificity/-/specificity-0.4.1.tgz#aab5e645012db08ba182e151165738d00887b019"
+  integrity sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==
+
+split-string@^3.0.1, split-string@^3.0.2:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2"
+  integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==
+  dependencies:
+    extend-shallow "^3.0.0"
+
+sprintf-js@~1.0.2:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
+  integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
+
+ssri@^6.0.1:
+  version "6.0.2"
+  resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.2.tgz#157939134f20464e7301ddba3e90ffa8f7728ac5"
+  integrity sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==
+  dependencies:
+    figgy-pudding "^3.5.1"
+
+ssri@^8.0.0:
+  version "8.0.0"
+  resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.0.tgz#79ca74e21f8ceaeddfcb4b90143c458b8d988808"
+  integrity sha512-aq/pz989nxVYwn16Tsbj1TqFpD5LLrQxHf5zaHuieFV+R0Bbr4y8qUsOA45hXT/N4/9UNXTarBjnjVmjSOVaAA==
+  dependencies:
+    minipass "^3.1.1"
+
+stable@^0.1.8:
+  version "0.1.8"
+  resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf"
+  integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==
+
+static-extend@^0.1.1:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
+  integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=
+  dependencies:
+    define-property "^0.2.5"
+    object-copy "^0.1.0"
+
+stickyfill@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/stickyfill/-/stickyfill-1.1.1.tgz#39413fee9d025c74a7e59ceecb23784cc0f17f02"
+  integrity sha1-OUE/7p0CXHSn5ZzuyyN4TMDxfwI=
+
+stream-browserify@^2.0.1:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b"
+  integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==
+  dependencies:
+    inherits "~2.0.1"
+    readable-stream "^2.0.2"
+
+stream-each@^1.1.0:
+  version "1.2.3"
+  resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae"
+  integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==
+  dependencies:
+    end-of-stream "^1.1.0"
+    stream-shift "^1.0.0"
+
+stream-http@^2.7.2:
+  version "2.8.3"
+  resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc"
+  integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==
+  dependencies:
+    builtin-status-codes "^3.0.0"
+    inherits "^2.0.1"
+    readable-stream "^2.3.6"
+    to-arraybuffer "^1.0.0"
+    xtend "^4.0.0"
+
+stream-shift@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d"
+  integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==
+
+string-width@^3.0.0, string-width@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961"
+  integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==
+  dependencies:
+    emoji-regex "^7.0.1"
+    is-fullwidth-code-point "^2.0.0"
+    strip-ansi "^5.1.0"
+
+string-width@^4.1.0:
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5"
+  integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==
+  dependencies:
+    emoji-regex "^8.0.0"
+    is-fullwidth-code-point "^3.0.0"
+    strip-ansi "^6.0.0"
+
+string-width@^4.2.0, string-width@^4.2.2:
+  version "4.2.2"
+  resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5"
+  integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==
+  dependencies:
+    emoji-regex "^8.0.0"
+    is-fullwidth-code-point "^3.0.0"
+    strip-ansi "^6.0.0"
+
+string.prototype.trimend@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913"
+  integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==
+  dependencies:
+    define-properties "^1.1.3"
+    es-abstract "^1.17.5"
+
+string.prototype.trimleft@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz#6cc47f0d7eb8d62b0f3701611715a3954591d634"
+  integrity sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==
+  dependencies:
+    define-properties "^1.1.3"
+    function-bind "^1.1.1"
+
+string.prototype.trimright@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz#669d164be9df9b6f7559fa8e89945b168a5a6c58"
+  integrity sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==
+  dependencies:
+    define-properties "^1.1.3"
+    function-bind "^1.1.1"
+
+string.prototype.trimstart@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54"
+  integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==
+  dependencies:
+    define-properties "^1.1.3"
+    es-abstract "^1.17.5"
+
+string_decoder@^1.0.0, string_decoder@^1.1.1:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
+  integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
+  dependencies:
+    safe-buffer "~5.2.0"
+
+string_decoder@~0.10.x:
+  version "0.10.31"
+  resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
+  integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=
+
+string_decoder@~1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
+  integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
+  dependencies:
+    safe-buffer "~5.1.0"
+
+strip-ansi@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
+  integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=
+  dependencies:
+    ansi-regex "^2.0.0"
+
+strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0:
+  version "5.2.0"
+  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae"
+  integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==
+  dependencies:
+    ansi-regex "^4.1.0"
+
+strip-ansi@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532"
+  integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==
+  dependencies:
+    ansi-regex "^5.0.0"
+
+strip-bom@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
+  integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=
+
+strip-comments@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/strip-comments/-/strip-comments-2.0.1.tgz#4ad11c3fbcac177a67a40ac224ca339ca1c1ba9b"
+  integrity sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==
+
+strip-indent@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001"
+  integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==
+  dependencies:
+    min-indent "^1.0.0"
+
+strip-json-comments@1.0.x:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91"
+  integrity sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=
+
+strip-json-comments@^3.1.0:
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
+  integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
+
+style-loader@^1.2.1:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-1.2.1.tgz#c5cbbfbf1170d076cfdd86e0109c5bba114baa1a"
+  integrity sha512-ByHSTQvHLkWE9Ir5+lGbVOXhxX10fbprhLvdg96wedFZb4NDekDPxVKv5Fwmio+QcMlkkNfuK+5W1peQ5CUhZg==
+  dependencies:
+    loader-utils "^2.0.0"
+    schema-utils "^2.6.6"
+
+style-search@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/style-search/-/style-search-0.1.0.tgz#7958c793e47e32e07d2b5cafe5c0bf8e12e77902"
+  integrity sha1-eVjHk+R+MuB9K1yv5cC/jhLneQI=
+
+stylehacks@^5.0.1:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-5.0.1.tgz#323ec554198520986806388c7fdaebc38d2c06fb"
+  integrity sha512-Es0rVnHIqbWzveU1b24kbw92HsebBepxfcqe5iix7t9j0PQqhs0IxXVXv0pY2Bxa08CgMkzD6OWql7kbGOuEdA==
+  dependencies:
+    browserslist "^4.16.0"
+    postcss-selector-parser "^6.0.4"
+
+stylelint-config-recommended@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/stylelint-config-recommended/-/stylelint-config-recommended-3.0.0.tgz#e0e547434016c5539fe2650afd58049a2fd1d657"
+  integrity sha512-F6yTRuc06xr1h5Qw/ykb2LuFynJ2IxkKfCMf+1xqPffkxh0S09Zc902XCffcsw/XMFq/OzQ1w54fLIDtmRNHnQ==
+
+stylelint-config-standard@^20.0.0:
+  version "20.0.0"
+  resolved "https://registry.yarnpkg.com/stylelint-config-standard/-/stylelint-config-standard-20.0.0.tgz#06135090c9e064befee3d594289f50e295b5e20d"
+  integrity sha512-IB2iFdzOTA/zS4jSVav6z+wGtin08qfj+YyExHB3LF9lnouQht//YyB0KZq9gGz5HNPkddHOzcY8HsUey6ZUlA==
+  dependencies:
+    stylelint-config-recommended "^3.0.0"
+
+stylelint@^13.6.1:
+  version "13.13.1"
+  resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-13.13.1.tgz#fca9c9f5de7990ab26a00f167b8978f083a18f3c"
+  integrity sha512-Mv+BQr5XTUrKqAXmpqm6Ddli6Ief+AiPZkRsIrAoUKFuq/ElkUh9ZMYxXD0iQNZ5ADghZKLOWz1h7hTClB7zgQ==
+  dependencies:
+    "@stylelint/postcss-css-in-js" "^0.37.2"
+    "@stylelint/postcss-markdown" "^0.36.2"
+    autoprefixer "^9.8.6"
+    balanced-match "^2.0.0"
+    chalk "^4.1.1"
+    cosmiconfig "^7.0.0"
+    debug "^4.3.1"
+    execall "^2.0.0"
+    fast-glob "^3.2.5"
+    fastest-levenshtein "^1.0.12"
+    file-entry-cache "^6.0.1"
+    get-stdin "^8.0.0"
+    global-modules "^2.0.0"
+    globby "^11.0.3"
+    globjoin "^0.1.4"
+    html-tags "^3.1.0"
+    ignore "^5.1.8"
+    import-lazy "^4.0.0"
+    imurmurhash "^0.1.4"
+    known-css-properties "^0.21.0"
+    lodash "^4.17.21"
+    log-symbols "^4.1.0"
+    mathml-tag-names "^2.1.3"
+    meow "^9.0.0"
+    micromatch "^4.0.4"
+    normalize-selector "^0.2.0"
+    postcss "^7.0.35"
+    postcss-html "^0.36.0"
+    postcss-less "^3.1.4"
+    postcss-media-query-parser "^0.2.3"
+    postcss-resolve-nested-selector "^0.1.1"
+    postcss-safe-parser "^4.0.2"
+    postcss-sass "^0.4.4"
+    postcss-scss "^2.1.1"
+    postcss-selector-parser "^6.0.5"
+    postcss-syntax "^0.36.2"
+    postcss-value-parser "^4.1.0"
+    resolve-from "^5.0.0"
+    slash "^3.0.0"
+    specificity "^0.4.1"
+    string-width "^4.2.2"
+    strip-ansi "^6.0.0"
+    style-search "^0.1.0"
+    sugarss "^2.0.0"
+    svg-tags "^1.0.0"
+    table "^6.6.0"
+    v8-compile-cache "^2.3.0"
+    write-file-atomic "^3.0.3"
+
+sugarss@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/sugarss/-/sugarss-2.0.0.tgz#ddd76e0124b297d40bf3cca31c8b22ecb43bc61d"
+  integrity sha512-WfxjozUk0UVA4jm+U1d736AUpzSrNsQcIbyOkoE364GrtWmIrFdk5lksEupgWMD4VaT/0kVx1dobpiDumSgmJQ==
+  dependencies:
+    postcss "^7.0.2"
+
+supports-color@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
+  integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=
+
+supports-color@^5.3.0, supports-color@^5.4.0:
+  version "5.5.0"
+  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
+  integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
+  dependencies:
+    has-flag "^3.0.0"
+
+supports-color@^6.1.0:
+  version "6.1.0"
+  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3"
+  integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==
+  dependencies:
+    has-flag "^3.0.0"
+
+supports-color@^7.1.0:
+  version "7.2.0"
+  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
+  integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
+  dependencies:
+    has-flag "^4.0.0"
+
+svg-tags@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/svg-tags/-/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764"
+  integrity sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=
+
+svgo@^2.3.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/svgo/-/svgo-2.3.0.tgz#6b3af81d0cbd1e19c83f5f63cec2cb98c70b5373"
+  integrity sha512-fz4IKjNO6HDPgIQxu4IxwtubtbSfGEAJUq/IXyTPIkGhWck/faiiwfkvsB8LnBkKLvSoyNNIY6d13lZprJMc9Q==
+  dependencies:
+    "@trysound/sax" "0.1.1"
+    chalk "^4.1.0"
+    commander "^7.1.0"
+    css-select "^3.1.2"
+    css-tree "^1.1.2"
+    csso "^4.2.0"
+    stable "^0.1.8"
+
+swagger2openapi@^6.2.1:
+  version "6.2.3"
+  resolved "https://registry.yarnpkg.com/swagger2openapi/-/swagger2openapi-6.2.3.tgz#4a8059f89d851aee4c9ab178f9b7190debd904e2"
+  integrity sha512-cUUktzLpK69UwpMbcTzjMw2ns9RZChfxh56AHv6+hTx3StPOX2foZjPgds3HlJcINbxosYYBn/D3cG8nwcCWwQ==
+  dependencies:
+    better-ajv-errors "^0.6.1"
+    call-me-maybe "^1.0.1"
+    node-fetch-h2 "^2.3.0"
+    node-readfiles "^0.2.0"
+    oas-kit-common "^1.0.8"
+    oas-resolver "^2.4.3"
+    oas-schema-walker "^1.1.5"
+    oas-validator "^4.0.8"
+    reftools "^1.1.5"
+    yaml "^1.8.3"
+    yargs "^15.3.1"
+
+table@^5.2.3:
+  version "5.4.6"
+  resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e"
+  integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==
+  dependencies:
+    ajv "^6.10.2"
+    lodash "^4.17.14"
+    slice-ansi "^2.1.0"
+    string-width "^3.0.0"
+
+table@^6.6.0:
+  version "6.7.0"
+  resolved "https://registry.yarnpkg.com/table/-/table-6.7.0.tgz#26274751f0ee099c547f6cb91d3eff0d61d155b2"
+  integrity sha512-SAM+5p6V99gYiiy2gT5ArdzgM1dLDed0nkrWmG6Fry/bUS/m9x83BwpJUOf1Qj/x2qJd+thL6IkIx7qPGRxqBw==
+  dependencies:
+    ajv "^8.0.1"
+    lodash.clonedeep "^4.5.0"
+    lodash.truncate "^4.4.2"
+    slice-ansi "^4.0.0"
+    string-width "^4.2.0"
+    strip-ansi "^6.0.0"
+
+tapable@^1.0.0, tapable@^1.1.3:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2"
+  integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==
+
+tar@^6.0.2:
+  version "6.0.2"
+  resolved "https://registry.yarnpkg.com/tar/-/tar-6.0.2.tgz#5df17813468a6264ff14f766886c622b84ae2f39"
+  integrity sha512-Glo3jkRtPcvpDlAs/0+hozav78yoXKFr+c4wgw62NNMO3oo4AaJdCo21Uu7lcwr55h39W2XD1LMERc64wtbItg==
+  dependencies:
+    chownr "^2.0.0"
+    fs-minipass "^2.0.0"
+    minipass "^3.0.0"
+    minizlib "^2.1.0"
+    mkdirp "^1.0.3"
+    yallist "^4.0.0"
+
+terser-webpack-plugin@^1.4.3:
+  version "1.4.4"
+  resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.4.tgz#2c63544347324baafa9a56baaddf1634c8abfc2f"
+  integrity sha512-U4mACBHIegmfoEe5fdongHESNJWqsGU+W0S/9+BmYGVQDw1+c2Ow05TpMhxjPK1sRb7cuYq1BPl1e5YHJMTCqA==
+  dependencies:
+    cacache "^12.0.2"
+    find-cache-dir "^2.1.0"
+    is-wsl "^1.1.0"
+    schema-utils "^1.0.0"
+    serialize-javascript "^3.1.0"
+    source-map "^0.6.1"
+    terser "^4.1.2"
+    webpack-sources "^1.4.0"
+    worker-farm "^1.7.0"
+
+terser@^4.1.2:
+  version "4.8.0"
+  resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17"
+  integrity sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==
+  dependencies:
+    commander "^2.20.0"
+    source-map "~0.6.1"
+    source-map-support "~0.5.12"
+
+text-table@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
+  integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=
+
+through2@^2.0.0:
+  version "2.0.5"
+  resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd"
+  integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==
+  dependencies:
+    readable-stream "~2.3.6"
+    xtend "~4.0.1"
+
+timers-browserify@^2.0.4:
+  version "2.0.11"
+  resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.11.tgz#800b1f3eee272e5bc53ee465a04d0e804c31211f"
+  integrity sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==
+  dependencies:
+    setimmediate "^1.0.4"
+
+timsort@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4"
+  integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=
+
+tiny-emitter@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz#1d1a56edfc51c43e863cbb5382a72330e3555423"
+  integrity sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==
+
+to-arraybuffer@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43"
+  integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=
+
+to-fast-properties@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47"
+  integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=
+
+to-fast-properties@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
+  integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=
+
+to-object-path@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af"
+  integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=
+  dependencies:
+    kind-of "^3.0.2"
+
+to-regex-range@^2.1.0:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38"
+  integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=
+  dependencies:
+    is-number "^3.0.0"
+    repeat-string "^1.6.1"
+
+to-regex-range@^5.0.1:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
+  integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
+  dependencies:
+    is-number "^7.0.0"
+
+to-regex@^3.0.1, to-regex@^3.0.2:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce"
+  integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==
+  dependencies:
+    define-property "^2.0.2"
+    extend-shallow "^3.0.2"
+    regex-not "^1.0.2"
+    safe-regex "^1.1.0"
+
+trim-newlines@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.0.tgz#79726304a6a898aa8373427298d54c2ee8b1cb30"
+  integrity sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA==
+
+trim-right@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
+  integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=
+
+trough@^1.0.0:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.5.tgz#b8b639cefad7d0bb2abd37d433ff8293efa5f406"
+  integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==
+
+tsconfig-paths@^3.9.0:
+  version "3.9.0"
+  resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz#098547a6c4448807e8fcb8eae081064ee9a3c90b"
+  integrity sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==
+  dependencies:
+    "@types/json5" "^0.0.29"
+    json5 "^1.0.1"
+    minimist "^1.2.0"
+    strip-bom "^3.0.0"
+
+tslib@^1.9.0:
+  version "1.13.0"
+  resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043"
+  integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==
+
+tslib@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.1.0.tgz#da60860f1c2ecaa5703ab7d39bc05b6bf988b97a"
+  integrity sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==
+
+tty-browserify@0.0.0:
+  version "0.0.0"
+  resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6"
+  integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=
+
+type-check@^0.4.0, type-check@~0.4.0:
+  version "0.4.0"
+  resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1"
+  integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==
+  dependencies:
+    prelude-ls "^1.2.1"
+
+type-fest@^0.18.0:
+  version "0.18.1"
+  resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f"
+  integrity sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==
+
+type-fest@^0.6.0:
+  version "0.6.0"
+  resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b"
+  integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==
+
+type-fest@^0.8.1:
+  version "0.8.1"
+  resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d"
+  integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==
+
+typedarray-to-buffer@^3.1.5:
+  version "3.1.5"
+  resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080"
+  integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==
+  dependencies:
+    is-typedarray "^1.0.0"
+
+typedarray@^0.0.6:
+  version "0.0.6"
+  resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
+  integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
+
+unified@^9.1.0:
+  version "9.2.1"
+  resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.1.tgz#ae18d5674c114021bfdbdf73865ca60f410215a3"
+  integrity sha512-juWjuI8Z4xFg8pJbnEZ41b5xjGUWGHqXALmBZ3FC3WX0PIx1CZBIIJ6mXbYMcf6Yw4Fi0rFUTA1cdz/BglbOhA==
+  dependencies:
+    bail "^1.0.0"
+    extend "^3.0.0"
+    is-buffer "^2.0.0"
+    is-plain-obj "^2.0.0"
+    trough "^1.0.0"
+    vfile "^4.0.0"
+
+union-value@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847"
+  integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==
+  dependencies:
+    arr-union "^3.1.0"
+    get-value "^2.0.6"
+    is-extendable "^0.1.1"
+    set-value "^2.0.1"
+
+uniq@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff"
+  integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=
+
+uniqs@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02"
+  integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI=
+
+unique-filename@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230"
+  integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==
+  dependencies:
+    unique-slug "^2.0.0"
+
+unique-slug@^2.0.0:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c"
+  integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==
+  dependencies:
+    imurmurhash "^0.1.4"
+
+unist-util-find-all-after@^3.0.2:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/unist-util-find-all-after/-/unist-util-find-all-after-3.0.2.tgz#fdfecd14c5b7aea5e9ef38d5e0d5f774eeb561f6"
+  integrity sha512-xaTC/AGZ0rIM2gM28YVRAFPIZpzbpDtU3dRmp7EXlNVA8ziQc4hY3H7BHXM1J49nEmiqc3svnqMReW+PGqbZKQ==
+  dependencies:
+    unist-util-is "^4.0.0"
+
+unist-util-is@^4.0.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.1.0.tgz#976e5f462a7a5de73d94b706bac1b90671b57797"
+  integrity sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==
+
+unist-util-stringify-position@^2.0.0:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz#cce3bfa1cdf85ba7375d1d5b17bdc4cada9bd9da"
+  integrity sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==
+  dependencies:
+    "@types/unist" "^2.0.2"
+
+universalify@^0.1.0:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
+  integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
+
+unset-value@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"
+  integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=
+  dependencies:
+    has-value "^0.3.1"
+    isobject "^3.0.0"
+
+upath@^1.1.1:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894"
+  integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==
+
+uri-js@^4.2.2:
+  version "4.4.1"
+  resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e"
+  integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==
+  dependencies:
+    punycode "^2.1.0"
+
+urix@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
+  integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=
+
+url-loader@4.1.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-4.1.0.tgz#c7d6b0d6b0fccd51ab3ffc58a78d32b8d89a7be2"
+  integrity sha512-IzgAAIC8wRrg6NYkFIJY09vtktQcsvU8V6HhtQj9PTefbYImzLB1hufqo4m+RyM5N3mLx5BqJKccgxJS+W3kqw==
+  dependencies:
+    loader-utils "^2.0.0"
+    mime-types "^2.1.26"
+    schema-utils "^2.6.5"
+
+url-search-params-polyfill@^8.1.0:
+  version "8.1.0"
+  resolved "https://registry.yarnpkg.com/url-search-params-polyfill/-/url-search-params-polyfill-8.1.0.tgz#5c15b69687165bfd4f6c7d8a161d70d85385885b"
+  integrity sha512-MRG3vzXyG20BJ2fox50/9ZRoe+2h3RM7DIudVD2u/GY9MtayO1Dkrna76IUOak+uoUPVWbyR0pHCzxctP/eDYQ==
+
+url-template@^2.0.8:
+  version "2.0.8"
+  resolved "https://registry.yarnpkg.com/url-template/-/url-template-2.0.8.tgz#fc565a3cccbff7730c775f5641f9555791439f21"
+  integrity sha1-/FZaPMy/93MMd19WQflVV5FDnyE=
+
+url@^0.11.0:
+  version "0.11.0"
+  resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"
+  integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=
+  dependencies:
+    punycode "1.3.2"
+    querystring "0.2.0"
+
+use@^3.1.0:
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
+  integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==
+
+util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+  integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
+
+util@0.10.3:
+  version "0.10.3"
+  resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9"
+  integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk=
+  dependencies:
+    inherits "2.0.1"
+
+util@^0.11.0:
+  version "0.11.1"
+  resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61"
+  integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==
+  dependencies:
+    inherits "2.0.3"
+
+v8-compile-cache@^2.0.3:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz#54bc3cdd43317bca91e35dcaf305b1a7237de745"
+  integrity sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==
+
+v8-compile-cache@^2.1.1, v8-compile-cache@^2.3.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee"
+  integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==
+
+validate-npm-package-license@^3.0.1:
+  version "3.0.4"
+  resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a"
+  integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==
+  dependencies:
+    spdx-correct "^3.0.0"
+    spdx-expression-parse "^3.0.0"
+
+vendors@^1.0.3:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e"
+  integrity sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==
+
+vfile-message@^2.0.0:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a"
+  integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==
+  dependencies:
+    "@types/unist" "^2.0.0"
+    unist-util-stringify-position "^2.0.0"
+
+vfile@^4.0.0:
+  version "4.2.1"
+  resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.2.1.tgz#03f1dce28fc625c625bc6514350fbdb00fa9e624"
+  integrity sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==
+  dependencies:
+    "@types/unist" "^2.0.0"
+    is-buffer "^2.0.0"
+    unist-util-stringify-position "^2.0.0"
+    vfile-message "^2.0.0"
+
+vm-browserify@^1.0.1:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0"
+  integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==
+
+watchpack-chokidar2@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz#9948a1866cbbd6cb824dea13a7ed691f6c8ddff0"
+  integrity sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA==
+  dependencies:
+    chokidar "^2.1.8"
+
+watchpack@^1.6.1:
+  version "1.7.2"
+  resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.2.tgz#c02e4d4d49913c3e7e122c3325365af9d331e9aa"
+  integrity sha512-ymVbbQP40MFTp+cNMvpyBpBtygHnPzPkHqoIwRRj/0B8KhqQwV8LaKjtbaxF2lK4vl8zN9wCxS46IFCU5K4W0g==
+  dependencies:
+    graceful-fs "^4.1.2"
+    neo-async "^2.5.0"
+  optionalDependencies:
+    chokidar "^3.4.0"
+    watchpack-chokidar2 "^2.0.0"
+
+webpack-cli@^3.1.0:
+  version "3.3.12"
+  resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.3.12.tgz#94e9ada081453cd0aa609c99e500012fd3ad2d4a"
+  integrity sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag==
+  dependencies:
+    chalk "^2.4.2"
+    cross-spawn "^6.0.5"
+    enhanced-resolve "^4.1.1"
+    findup-sync "^3.0.0"
+    global-modules "^2.0.0"
+    import-local "^2.0.0"
+    interpret "^1.4.0"
+    loader-utils "^1.4.0"
+    supports-color "^6.1.0"
+    v8-compile-cache "^2.1.1"
+    yargs "^13.3.2"
+
+webpack-manifest-plugin@^2.2.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/webpack-manifest-plugin/-/webpack-manifest-plugin-2.2.0.tgz#19ca69b435b0baec7e29fbe90fb4015de2de4f16"
+  integrity sha512-9S6YyKKKh/Oz/eryM1RyLVDVmy3NSPV0JXMRhZ18fJsq+AwGxUY34X54VNwkzYcEmEkDwNxuEOboCZEebJXBAQ==
+  dependencies:
+    fs-extra "^7.0.0"
+    lodash ">=3.5 <5"
+    object.entries "^1.1.0"
+    tapable "^1.0.0"
+
+webpack-sources@^1.1.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1, webpack-sources@^1.4.3:
+  version "1.4.3"
+  resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933"
+  integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==
+  dependencies:
+    source-list-map "^2.0.0"
+    source-map "~0.6.1"
+
+webpack@^4.16.3:
+  version "4.43.0"
+  resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.43.0.tgz#c48547b11d563224c561dad1172c8aa0b8a678e6"
+  integrity sha512-GW1LjnPipFW2Y78OOab8NJlCflB7EFskMih2AHdvjbpKMeDJqEgSx24cXXXiPS65+WSwVyxtDsJH6jGX2czy+g==
+  dependencies:
+    "@webassemblyjs/ast" "1.9.0"
+    "@webassemblyjs/helper-module-context" "1.9.0"
+    "@webassemblyjs/wasm-edit" "1.9.0"
+    "@webassemblyjs/wasm-parser" "1.9.0"
+    acorn "^6.4.1"
+    ajv "^6.10.2"
+    ajv-keywords "^3.4.1"
+    chrome-trace-event "^1.0.2"
+    enhanced-resolve "^4.1.0"
+    eslint-scope "^4.0.3"
+    json-parse-better-errors "^1.0.2"
+    loader-runner "^2.4.0"
+    loader-utils "^1.2.3"
+    memory-fs "^0.4.1"
+    micromatch "^3.1.10"
+    mkdirp "^0.5.3"
+    neo-async "^2.6.1"
+    node-libs-browser "^2.2.1"
+    schema-utils "^1.0.0"
+    tapable "^1.1.3"
+    terser-webpack-plugin "^1.4.3"
+    watchpack "^1.6.1"
+    webpack-sources "^1.4.1"
+
+which-module@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
+  integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=
+
+which@^1.2.14, which@^1.2.9, which@^1.3.1:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
+  integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
+  dependencies:
+    isexe "^2.0.0"
+
+which@^2.0.1:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
+  integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
+  dependencies:
+    isexe "^2.0.0"
+
+word-wrap@^1.2.3:
+  version "1.2.3"
+  resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"
+  integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==
+
+worker-farm@^1.7.0:
+  version "1.7.0"
+  resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8"
+  integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==
+  dependencies:
+    errno "~0.1.7"
+
+wrap-ansi@^5.1.0:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09"
+  integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==
+  dependencies:
+    ansi-styles "^3.2.0"
+    string-width "^3.0.0"
+    strip-ansi "^5.0.0"
+
+wrap-ansi@^6.2.0:
+  version "6.2.0"
+  resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53"
+  integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==
+  dependencies:
+    ansi-styles "^4.0.0"
+    string-width "^4.1.0"
+    strip-ansi "^6.0.0"
+
+wrap-ansi@^7.0.0:
+  version "7.0.0"
+  resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
+  integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
+  dependencies:
+    ansi-styles "^4.0.0"
+    string-width "^4.1.0"
+    strip-ansi "^6.0.0"
+
+wrappy@1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+  integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
+
+write-file-atomic@^3.0.3:
+  version "3.0.3"
+  resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8"
+  integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==
+  dependencies:
+    imurmurhash "^0.1.4"
+    is-typedarray "^1.0.0"
+    signal-exit "^3.0.2"
+    typedarray-to-buffer "^3.1.5"
+
+write@1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3"
+  integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==
+  dependencies:
+    mkdirp "^0.5.1"
+
+xtend@^4.0.0, xtend@~4.0.1:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
+  integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
+
+y18n@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b"
+  integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==
+
+y18n@^5.0.5:
+  version "5.0.5"
+  resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.5.tgz#8769ec08d03b1ea2df2500acef561743bbb9ab18"
+  integrity sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg==
+
+yallist@^3.0.2:
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
+  integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
+
+yallist@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
+  integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
+
+yaml@^1.10.0, yaml@^1.8.3:
+  version "1.10.0"
+  resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e"
+  integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==
+
+yargs-parser@^13.1.2:
+  version "13.1.2"
+  resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38"
+  integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==
+  dependencies:
+    camelcase "^5.0.0"
+    decamelize "^1.2.0"
+
+yargs-parser@^18.1.2:
+  version "18.1.3"
+  resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0"
+  integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==
+  dependencies:
+    camelcase "^5.0.0"
+    decamelize "^1.2.0"
+
+yargs-parser@^20.2.2:
+  version "20.2.6"
+  resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.6.tgz#69f920addf61aafc0b8b89002f5d66e28f2d8b20"
+  integrity sha512-AP1+fQIWSM/sMiET8fyayjx/J+JmTPt2Mr0FkrgqB4todtfa53sOsrSAcIrJRD5XS20bKUwaDIuMkWKCEiQLKA==
+
+yargs-parser@^20.2.3:
+  version "20.2.7"
+  resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.7.tgz#61df85c113edfb5a7a4e36eb8aa60ef423cbc90a"
+  integrity sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==
+
+yargs@^13.3.2:
+  version "13.3.2"
+  resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd"
+  integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==
+  dependencies:
+    cliui "^5.0.0"
+    find-up "^3.0.0"
+    get-caller-file "^2.0.1"
+    require-directory "^2.1.1"
+    require-main-filename "^2.0.0"
+    set-blocking "^2.0.0"
+    string-width "^3.0.0"
+    which-module "^2.0.0"
+    y18n "^4.0.0"
+    yargs-parser "^13.1.2"
+
+yargs@^15.3.1:
+  version "15.4.1"
+  resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8"
+  integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==
+  dependencies:
+    cliui "^6.0.0"
+    decamelize "^1.2.0"
+    find-up "^4.1.0"
+    get-caller-file "^2.0.1"
+    require-directory "^2.1.1"
+    require-main-filename "^2.0.0"
+    set-blocking "^2.0.0"
+    string-width "^4.2.0"
+    which-module "^2.0.0"
+    y18n "^4.0.0"
+    yargs-parser "^18.1.2"
+
+yargs@^16.1.1:
+  version "16.2.0"
+  resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66"
+  integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==
+  dependencies:
+    cliui "^7.0.2"
+    escalade "^3.1.1"
+    get-caller-file "^2.0.5"
+    require-directory "^2.1.1"
+    string-width "^4.2.0"
+    y18n "^5.0.5"
+    yargs-parser "^20.2.2"
+
+zwitch@^1.0.0:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-1.0.5.tgz#d11d7381ffed16b742f6af7b3f223d5cd9fe9920"
+  integrity sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==
diff --git a/nixpkgs/pkgs/development/python-modules/apache-airflow/yarn.nix b/nixpkgs/pkgs/development/python-modules/apache-airflow/yarn.nix
new file mode 100644
index 000000000000..c1c9b8d7857a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/apache-airflow/yarn.nix
@@ -0,0 +1,8485 @@
+{ fetchurl, fetchgit, linkFarm, runCommand, gnutar }: rec {
+  offline_cache = linkFarm "offline" packages;
+  packages = [
+    {
+      name = "_babel_code_frame___code_frame_7.12.13.tgz";
+      path = fetchurl {
+        name = "_babel_code_frame___code_frame_7.12.13.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.13.tgz";
+        sha1 = "dcfc826beef65e75c50e21d3837d7d95798dd658";
+      };
+    }
+    {
+      name = "_babel_code_frame___code_frame_7.10.4.tgz";
+      path = fetchurl {
+        name = "_babel_code_frame___code_frame_7.10.4.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz";
+        sha1 = "168da1a36e90da68ae8d49c0f1b48c7c6249213a";
+      };
+    }
+    {
+      name = "_babel_compat_data___compat_data_7.14.0.tgz";
+      path = fetchurl {
+        name = "_babel_compat_data___compat_data_7.14.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.14.0.tgz";
+        sha1 = "a901128bce2ad02565df95e6ecbf195cf9465919";
+      };
+    }
+    {
+      name = "_babel_core___core_7.14.0.tgz";
+      path = fetchurl {
+        name = "_babel_core___core_7.14.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/core/-/core-7.14.0.tgz";
+        sha1 = "47299ff3ec8d111b493f1a9d04bf88c04e728d88";
+      };
+    }
+    {
+      name = "_babel_generator___generator_7.10.5.tgz";
+      path = fetchurl {
+        name = "_babel_generator___generator_7.10.5.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/generator/-/generator-7.10.5.tgz";
+        sha1 = "1b903554bc8c583ee8d25f1e8969732e6b829a69";
+      };
+    }
+    {
+      name = "_babel_generator___generator_7.14.1.tgz";
+      path = fetchurl {
+        name = "_babel_generator___generator_7.14.1.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/generator/-/generator-7.14.1.tgz";
+        sha1 = "1f99331babd65700183628da186f36f63d615c93";
+      };
+    }
+    {
+      name = "_babel_helper_compilation_targets___helper_compilation_targets_7.13.16.tgz";
+      path = fetchurl {
+        name = "_babel_helper_compilation_targets___helper_compilation_targets_7.13.16.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.16.tgz";
+        sha1 = "6e91dccf15e3f43e5556dffe32d860109887563c";
+      };
+    }
+    {
+      name = "_babel_helper_function_name___helper_function_name_7.10.4.tgz";
+      path = fetchurl {
+        name = "_babel_helper_function_name___helper_function_name_7.10.4.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz";
+        sha1 = "d2d3b20c59ad8c47112fa7d2a94bc09d5ef82f1a";
+      };
+    }
+    {
+      name = "_babel_helper_function_name___helper_function_name_7.12.13.tgz";
+      path = fetchurl {
+        name = "_babel_helper_function_name___helper_function_name_7.12.13.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz";
+        sha1 = "93ad656db3c3c2232559fd7b2c3dbdcbe0eb377a";
+      };
+    }
+    {
+      name = "_babel_helper_get_function_arity___helper_get_function_arity_7.10.4.tgz";
+      path = fetchurl {
+        name = "_babel_helper_get_function_arity___helper_get_function_arity_7.10.4.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz";
+        sha1 = "98c1cbea0e2332f33f9a4661b8ce1505b2c19ba2";
+      };
+    }
+    {
+      name = "_babel_helper_get_function_arity___helper_get_function_arity_7.12.13.tgz";
+      path = fetchurl {
+        name = "_babel_helper_get_function_arity___helper_get_function_arity_7.12.13.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz";
+        sha1 = "bc63451d403a3b3082b97e1d8b3fe5bd4091e583";
+      };
+    }
+    {
+      name = "_babel_helper_member_expression_to_functions___helper_member_expression_to_functions_7.13.12.tgz";
+      path = fetchurl {
+        name = "_babel_helper_member_expression_to_functions___helper_member_expression_to_functions_7.13.12.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz";
+        sha1 = "dfe368f26d426a07299d8d6513821768216e6d72";
+      };
+    }
+    {
+      name = "_babel_helper_module_imports___helper_module_imports_7.13.12.tgz";
+      path = fetchurl {
+        name = "_babel_helper_module_imports___helper_module_imports_7.13.12.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz";
+        sha1 = "c6a369a6f3621cb25da014078684da9196b61977";
+      };
+    }
+    {
+      name = "_babel_helper_module_transforms___helper_module_transforms_7.14.0.tgz";
+      path = fetchurl {
+        name = "_babel_helper_module_transforms___helper_module_transforms_7.14.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.14.0.tgz";
+        sha1 = "8fcf78be220156f22633ee204ea81f73f826a8ad";
+      };
+    }
+    {
+      name = "_babel_helper_optimise_call_expression___helper_optimise_call_expression_7.12.13.tgz";
+      path = fetchurl {
+        name = "_babel_helper_optimise_call_expression___helper_optimise_call_expression_7.12.13.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz";
+        sha1 = "5c02d171b4c8615b1e7163f888c1c81c30a2aaea";
+      };
+    }
+    {
+      name = "_babel_helper_replace_supers___helper_replace_supers_7.13.12.tgz";
+      path = fetchurl {
+        name = "_babel_helper_replace_supers___helper_replace_supers_7.13.12.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz";
+        sha1 = "6442f4c1ad912502481a564a7386de0c77ff3804";
+      };
+    }
+    {
+      name = "_babel_helper_simple_access___helper_simple_access_7.13.12.tgz";
+      path = fetchurl {
+        name = "_babel_helper_simple_access___helper_simple_access_7.13.12.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz";
+        sha1 = "dd6c538afb61819d205a012c31792a39c7a5eaf6";
+      };
+    }
+    {
+      name = "_babel_helper_split_export_declaration___helper_split_export_declaration_7.10.4.tgz";
+      path = fetchurl {
+        name = "_babel_helper_split_export_declaration___helper_split_export_declaration_7.10.4.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz";
+        sha1 = "2c70576eaa3b5609b24cb99db2888cc3fc4251d1";
+      };
+    }
+    {
+      name = "_babel_helper_split_export_declaration___helper_split_export_declaration_7.12.13.tgz";
+      path = fetchurl {
+        name = "_babel_helper_split_export_declaration___helper_split_export_declaration_7.12.13.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz";
+        sha1 = "e9430be00baf3e88b0e13e6f9d4eaf2136372b05";
+      };
+    }
+    {
+      name = "_babel_helper_validator_identifier___helper_validator_identifier_7.14.0.tgz";
+      path = fetchurl {
+        name = "_babel_helper_validator_identifier___helper_validator_identifier_7.14.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz";
+        sha1 = "d26cad8a47c65286b15df1547319a5d0bcf27288";
+      };
+    }
+    {
+      name = "_babel_helper_validator_option___helper_validator_option_7.12.17.tgz";
+      path = fetchurl {
+        name = "_babel_helper_validator_option___helper_validator_option_7.12.17.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz";
+        sha1 = "d1fbf012e1a79b7eebbfdc6d270baaf8d9eb9831";
+      };
+    }
+    {
+      name = "_babel_helpers___helpers_7.14.0.tgz";
+      path = fetchurl {
+        name = "_babel_helpers___helpers_7.14.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.14.0.tgz";
+        sha1 = "ea9b6be9478a13d6f961dbb5f36bf75e2f3b8f62";
+      };
+    }
+    {
+      name = "_babel_highlight___highlight_7.14.0.tgz";
+      path = fetchurl {
+        name = "_babel_highlight___highlight_7.14.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.0.tgz";
+        sha1 = "3197e375711ef6bf834e67d0daec88e4f46113cf";
+      };
+    }
+    {
+      name = "_babel_parser___parser_7.10.5.tgz";
+      path = fetchurl {
+        name = "_babel_parser___parser_7.10.5.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/parser/-/parser-7.10.5.tgz";
+        sha1 = "e7c6bf5a7deff957cec9f04b551e2762909d826b";
+      };
+    }
+    {
+      name = "_babel_parser___parser_7.14.1.tgz";
+      path = fetchurl {
+        name = "_babel_parser___parser_7.14.1.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.1.tgz";
+        sha1 = "1bd644b5db3f5797c4479d89ec1817fe02b84c47";
+      };
+    }
+    {
+      name = "_babel_runtime___runtime_7.10.5.tgz";
+      path = fetchurl {
+        name = "_babel_runtime___runtime_7.10.5.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.10.5.tgz";
+        sha1 = "303d8bd440ecd5a491eae6117fd3367698674c5c";
+      };
+    }
+    {
+      name = "_babel_runtime___runtime_7.13.9.tgz";
+      path = fetchurl {
+        name = "_babel_runtime___runtime_7.13.9.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.13.9.tgz";
+        sha1 = "97dbe2116e2630c489f22e0656decd60aaa1fcee";
+      };
+    }
+    {
+      name = "_babel_template___template_7.10.4.tgz";
+      path = fetchurl {
+        name = "_babel_template___template_7.10.4.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/template/-/template-7.10.4.tgz";
+        sha1 = "3251996c4200ebc71d1a8fc405fba940f36ba278";
+      };
+    }
+    {
+      name = "_babel_template___template_7.12.13.tgz";
+      path = fetchurl {
+        name = "_babel_template___template_7.12.13.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/template/-/template-7.12.13.tgz";
+        sha1 = "530265be8a2589dbb37523844c5bcb55947fb327";
+      };
+    }
+    {
+      name = "_babel_traverse___traverse_7.14.0.tgz";
+      path = fetchurl {
+        name = "_babel_traverse___traverse_7.14.0.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.14.0.tgz";
+        sha1 = "cea0dc8ae7e2b1dec65f512f39f3483e8cc95aef";
+      };
+    }
+    {
+      name = "_babel_traverse___traverse_7.10.5.tgz";
+      path = fetchurl {
+        name = "_babel_traverse___traverse_7.10.5.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.10.5.tgz";
+        sha1 = "77ce464f5b258be265af618d8fddf0536f20b564";
+      };
+    }
+    {
+      name = "_babel_types___types_7.10.5.tgz";
+      path = fetchurl {
+        name = "_babel_types___types_7.10.5.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/types/-/types-7.10.5.tgz";
+        sha1 = "d88ae7e2fde86bfbfe851d4d81afa70a997b5d15";
+      };
+    }
+    {
+      name = "_babel_types___types_7.14.1.tgz";
+      path = fetchurl {
+        name = "_babel_types___types_7.14.1.tgz";
+        url  = "https://registry.yarnpkg.com/@babel/types/-/types-7.14.1.tgz";
+        sha1 = "095bd12f1c08ab63eff6e8f7745fa7c9cc15a9db";
+      };
+    }
+    {
+      name = "_exodus_schemasafe___schemasafe_1.0.0_rc.3.tgz";
+      path = fetchurl {
+        name = "_exodus_schemasafe___schemasafe_1.0.0_rc.3.tgz";
+        url  = "https://registry.yarnpkg.com/@exodus/schemasafe/-/schemasafe-1.0.0-rc.3.tgz";
+        sha1 = "dda2fbf3dafa5ad8c63dadff7e01d3fdf4736025";
+      };
+    }
+    {
+      name = "_nodelib_fs.scandir___fs.scandir_2.1.4.tgz";
+      path = fetchurl {
+        name = "_nodelib_fs.scandir___fs.scandir_2.1.4.tgz";
+        url  = "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz";
+        sha1 = "d4b3549a5db5de2683e0c1071ab4f140904bbf69";
+      };
+    }
+    {
+      name = "_nodelib_fs.stat___fs.stat_2.0.4.tgz";
+      path = fetchurl {
+        name = "_nodelib_fs.stat___fs.stat_2.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz";
+        sha1 = "a3f2dd61bab43b8db8fa108a121cfffe4c676655";
+      };
+    }
+    {
+      name = "_nodelib_fs.walk___fs.walk_1.2.6.tgz";
+      path = fetchurl {
+        name = "_nodelib_fs.walk___fs.walk_1.2.6.tgz";
+        url  = "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz";
+        sha1 = "cce9396b30aa5afe9e3756608f5831adcb53d063";
+      };
+    }
+    {
+      name = "_npmcli_move_file___move_file_1.0.1.tgz";
+      path = fetchurl {
+        name = "_npmcli_move_file___move_file_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.0.1.tgz";
+        sha1 = "de103070dac0f48ce49cf6693c23af59c0f70464";
+      };
+    }
+    {
+      name = "_redocly_react_dropdown_aria___react_dropdown_aria_2.0.11.tgz";
+      path = fetchurl {
+        name = "_redocly_react_dropdown_aria___react_dropdown_aria_2.0.11.tgz";
+        url  = "https://registry.yarnpkg.com/@redocly/react-dropdown-aria/-/react-dropdown-aria-2.0.11.tgz";
+        sha1 = "532b864b329237e646abe45d0f8edc923e77370a";
+      };
+    }
+    {
+      name = "_stylelint_postcss_css_in_js___postcss_css_in_js_0.37.2.tgz";
+      path = fetchurl {
+        name = "_stylelint_postcss_css_in_js___postcss_css_in_js_0.37.2.tgz";
+        url  = "https://registry.yarnpkg.com/@stylelint/postcss-css-in-js/-/postcss-css-in-js-0.37.2.tgz";
+        sha1 = "7e5a84ad181f4234a2480803422a47b8749af3d2";
+      };
+    }
+    {
+      name = "_stylelint_postcss_markdown___postcss_markdown_0.36.2.tgz";
+      path = fetchurl {
+        name = "_stylelint_postcss_markdown___postcss_markdown_0.36.2.tgz";
+        url  = "https://registry.yarnpkg.com/@stylelint/postcss-markdown/-/postcss-markdown-0.36.2.tgz";
+        sha1 = "0a540c4692f8dcdfc13c8e352c17e7bfee2bb391";
+      };
+    }
+    {
+      name = "_trysound_sax___sax_0.1.1.tgz";
+      path = fetchurl {
+        name = "_trysound_sax___sax_0.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.1.1.tgz";
+        sha1 = "3348564048e7a2d7398c935d466c0414ebb6a669";
+      };
+    }
+    {
+      name = "_types_anymatch___anymatch_1.3.1.tgz";
+      path = fetchurl {
+        name = "_types_anymatch___anymatch_1.3.1.tgz";
+        url  = "https://registry.yarnpkg.com/@types/anymatch/-/anymatch-1.3.1.tgz";
+        sha1 = "336badc1beecb9dacc38bea2cf32adf627a8421a";
+      };
+    }
+    {
+      name = "_types_color_name___color_name_1.1.1.tgz";
+      path = fetchurl {
+        name = "_types_color_name___color_name_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz";
+        sha1 = "1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0";
+      };
+    }
+    {
+      name = "_types_glob___glob_7.1.3.tgz";
+      path = fetchurl {
+        name = "_types_glob___glob_7.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.3.tgz";
+        sha1 = "e6ba80f36b7daad2c685acd9266382e68985c183";
+      };
+    }
+    {
+      name = "_types_json_schema___json_schema_7.0.5.tgz";
+      path = fetchurl {
+        name = "_types_json_schema___json_schema_7.0.5.tgz";
+        url  = "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.5.tgz";
+        sha1 = "dcce4430e64b443ba8945f0290fb564ad5bac6dd";
+      };
+    }
+    {
+      name = "_types_json_schema___json_schema_7.0.7.tgz";
+      path = fetchurl {
+        name = "_types_json_schema___json_schema_7.0.7.tgz";
+        url  = "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.7.tgz";
+        sha1 = "98a993516c859eb0d5c4c8f098317a9ea68db9ad";
+      };
+    }
+    {
+      name = "_types_json5___json5_0.0.29.tgz";
+      path = fetchurl {
+        name = "_types_json5___json5_0.0.29.tgz";
+        url  = "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz";
+        sha1 = "ee28707ae94e11d2b827bcbe5270bcea7f3e71ee";
+      };
+    }
+    {
+      name = "_types_mdast___mdast_3.0.3.tgz";
+      path = fetchurl {
+        name = "_types_mdast___mdast_3.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.3.tgz";
+        sha1 = "2d7d671b1cd1ea3deb306ea75036c2a0407d2deb";
+      };
+    }
+    {
+      name = "_types_minimatch___minimatch_3.0.3.tgz";
+      path = fetchurl {
+        name = "_types_minimatch___minimatch_3.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz";
+        sha1 = "3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d";
+      };
+    }
+    {
+      name = "_types_minimist___minimist_1.2.1.tgz";
+      path = fetchurl {
+        name = "_types_minimist___minimist_1.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.1.tgz";
+        sha1 = "283f669ff76d7b8260df8ab7a4262cc83d988256";
+      };
+    }
+    {
+      name = "_types_node___node_14.0.24.tgz";
+      path = fetchurl {
+        name = "_types_node___node_14.0.24.tgz";
+        url  = "https://registry.yarnpkg.com/@types/node/-/node-14.0.24.tgz";
+        sha1 = "b0f86f58564fa02a28b68f8b55d4cdec42e3b9d6";
+      };
+    }
+    {
+      name = "_types_node___node_13.13.14.tgz";
+      path = fetchurl {
+        name = "_types_node___node_13.13.14.tgz";
+        url  = "https://registry.yarnpkg.com/@types/node/-/node-13.13.14.tgz";
+        sha1 = "20cd7d2a98f0c3b08d379f4ea9e6b315d2019529";
+      };
+    }
+    {
+      name = "_types_normalize_package_data___normalize_package_data_2.4.0.tgz";
+      path = fetchurl {
+        name = "_types_normalize_package_data___normalize_package_data_2.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz";
+        sha1 = "e486d0d97396d79beedd0a6e33f4534ff6b4973e";
+      };
+    }
+    {
+      name = "_types_parse_json___parse_json_4.0.0.tgz";
+      path = fetchurl {
+        name = "_types_parse_json___parse_json_4.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz";
+        sha1 = "2f8bb441434d163b35fb8ffdccd7138927ffb8c0";
+      };
+    }
+    {
+      name = "_types_source_list_map___source_list_map_0.1.2.tgz";
+      path = fetchurl {
+        name = "_types_source_list_map___source_list_map_0.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.2.tgz";
+        sha1 = "0078836063ffaf17412349bba364087e0ac02ec9";
+      };
+    }
+    {
+      name = "_types_tapable___tapable_1.0.6.tgz";
+      path = fetchurl {
+        name = "_types_tapable___tapable_1.0.6.tgz";
+        url  = "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.6.tgz";
+        sha1 = "a9ca4b70a18b270ccb2bc0aaafefd1d486b7ea74";
+      };
+    }
+    {
+      name = "_types_uglify_js___uglify_js_3.9.3.tgz";
+      path = fetchurl {
+        name = "_types_uglify_js___uglify_js_3.9.3.tgz";
+        url  = "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.9.3.tgz";
+        sha1 = "d94ed608e295bc5424c9600e6b8565407b6b4b6b";
+      };
+    }
+    {
+      name = "_types_unist___unist_2.0.3.tgz";
+      path = fetchurl {
+        name = "_types_unist___unist_2.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.3.tgz";
+        sha1 = "9c088679876f374eb5983f150d4787aa6fb32d7e";
+      };
+    }
+    {
+      name = "_types_webpack_sources___webpack_sources_1.4.0.tgz";
+      path = fetchurl {
+        name = "_types_webpack_sources___webpack_sources_1.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-1.4.0.tgz";
+        sha1 = "e58f1f05f87d39a5c64cf85705bdbdbb94d4d57e";
+      };
+    }
+    {
+      name = "_types_webpack___webpack_4.41.21.tgz";
+      path = fetchurl {
+        name = "_types_webpack___webpack_4.41.21.tgz";
+        url  = "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.21.tgz";
+        sha1 = "cc685b332c33f153bb2f5fc1fa3ac8adeb592dee";
+      };
+    }
+    {
+      name = "_webassemblyjs_ast___ast_1.9.0.tgz";
+      path = fetchurl {
+        name = "_webassemblyjs_ast___ast_1.9.0.tgz";
+        url  = "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz";
+        sha1 = "bd850604b4042459a5a41cd7d338cbed695ed964";
+      };
+    }
+    {
+      name = "_webassemblyjs_floating_point_hex_parser___floating_point_hex_parser_1.9.0.tgz";
+      path = fetchurl {
+        name = "_webassemblyjs_floating_point_hex_parser___floating_point_hex_parser_1.9.0.tgz";
+        url  = "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz";
+        sha1 = "3c3d3b271bddfc84deb00f71344438311d52ffb4";
+      };
+    }
+    {
+      name = "_webassemblyjs_helper_api_error___helper_api_error_1.9.0.tgz";
+      path = fetchurl {
+        name = "_webassemblyjs_helper_api_error___helper_api_error_1.9.0.tgz";
+        url  = "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz";
+        sha1 = "203f676e333b96c9da2eeab3ccef33c45928b6a2";
+      };
+    }
+    {
+      name = "_webassemblyjs_helper_buffer___helper_buffer_1.9.0.tgz";
+      path = fetchurl {
+        name = "_webassemblyjs_helper_buffer___helper_buffer_1.9.0.tgz";
+        url  = "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz";
+        sha1 = "a1442d269c5feb23fcbc9ef759dac3547f29de00";
+      };
+    }
+    {
+      name = "_webassemblyjs_helper_code_frame___helper_code_frame_1.9.0.tgz";
+      path = fetchurl {
+        name = "_webassemblyjs_helper_code_frame___helper_code_frame_1.9.0.tgz";
+        url  = "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz";
+        sha1 = "647f8892cd2043a82ac0c8c5e75c36f1d9159f27";
+      };
+    }
+    {
+      name = "_webassemblyjs_helper_fsm___helper_fsm_1.9.0.tgz";
+      path = fetchurl {
+        name = "_webassemblyjs_helper_fsm___helper_fsm_1.9.0.tgz";
+        url  = "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz";
+        sha1 = "c05256b71244214671f4b08ec108ad63b70eddb8";
+      };
+    }
+    {
+      name = "_webassemblyjs_helper_module_context___helper_module_context_1.9.0.tgz";
+      path = fetchurl {
+        name = "_webassemblyjs_helper_module_context___helper_module_context_1.9.0.tgz";
+        url  = "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz";
+        sha1 = "25d8884b76839871a08a6c6f806c3979ef712f07";
+      };
+    }
+    {
+      name = "_webassemblyjs_helper_wasm_bytecode___helper_wasm_bytecode_1.9.0.tgz";
+      path = fetchurl {
+        name = "_webassemblyjs_helper_wasm_bytecode___helper_wasm_bytecode_1.9.0.tgz";
+        url  = "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz";
+        sha1 = "4fed8beac9b8c14f8c58b70d124d549dd1fe5790";
+      };
+    }
+    {
+      name = "_webassemblyjs_helper_wasm_section___helper_wasm_section_1.9.0.tgz";
+      path = fetchurl {
+        name = "_webassemblyjs_helper_wasm_section___helper_wasm_section_1.9.0.tgz";
+        url  = "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz";
+        sha1 = "5a4138d5a6292ba18b04c5ae49717e4167965346";
+      };
+    }
+    {
+      name = "_webassemblyjs_ieee754___ieee754_1.9.0.tgz";
+      path = fetchurl {
+        name = "_webassemblyjs_ieee754___ieee754_1.9.0.tgz";
+        url  = "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz";
+        sha1 = "15c7a0fbaae83fb26143bbacf6d6df1702ad39e4";
+      };
+    }
+    {
+      name = "_webassemblyjs_leb128___leb128_1.9.0.tgz";
+      path = fetchurl {
+        name = "_webassemblyjs_leb128___leb128_1.9.0.tgz";
+        url  = "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.9.0.tgz";
+        sha1 = "f19ca0b76a6dc55623a09cffa769e838fa1e1c95";
+      };
+    }
+    {
+      name = "_webassemblyjs_utf8___utf8_1.9.0.tgz";
+      path = fetchurl {
+        name = "_webassemblyjs_utf8___utf8_1.9.0.tgz";
+        url  = "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.9.0.tgz";
+        sha1 = "04d33b636f78e6a6813227e82402f7637b6229ab";
+      };
+    }
+    {
+      name = "_webassemblyjs_wasm_edit___wasm_edit_1.9.0.tgz";
+      path = fetchurl {
+        name = "_webassemblyjs_wasm_edit___wasm_edit_1.9.0.tgz";
+        url  = "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz";
+        sha1 = "3fe6d79d3f0f922183aa86002c42dd256cfee9cf";
+      };
+    }
+    {
+      name = "_webassemblyjs_wasm_gen___wasm_gen_1.9.0.tgz";
+      path = fetchurl {
+        name = "_webassemblyjs_wasm_gen___wasm_gen_1.9.0.tgz";
+        url  = "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz";
+        sha1 = "50bc70ec68ded8e2763b01a1418bf43491a7a49c";
+      };
+    }
+    {
+      name = "_webassemblyjs_wasm_opt___wasm_opt_1.9.0.tgz";
+      path = fetchurl {
+        name = "_webassemblyjs_wasm_opt___wasm_opt_1.9.0.tgz";
+        url  = "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz";
+        sha1 = "2211181e5b31326443cc8112eb9f0b9028721a61";
+      };
+    }
+    {
+      name = "_webassemblyjs_wasm_parser___wasm_parser_1.9.0.tgz";
+      path = fetchurl {
+        name = "_webassemblyjs_wasm_parser___wasm_parser_1.9.0.tgz";
+        url  = "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz";
+        sha1 = "9d48e44826df4a6598294aa6c87469d642fff65e";
+      };
+    }
+    {
+      name = "_webassemblyjs_wast_parser___wast_parser_1.9.0.tgz";
+      path = fetchurl {
+        name = "_webassemblyjs_wast_parser___wast_parser_1.9.0.tgz";
+        url  = "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz";
+        sha1 = "3031115d79ac5bd261556cecc3fa90a3ef451914";
+      };
+    }
+    {
+      name = "_webassemblyjs_wast_printer___wast_printer_1.9.0.tgz";
+      path = fetchurl {
+        name = "_webassemblyjs_wast_printer___wast_printer_1.9.0.tgz";
+        url  = "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz";
+        sha1 = "4935d54c85fef637b00ce9f52377451d00d47899";
+      };
+    }
+    {
+      name = "_xtuc_ieee754___ieee754_1.2.0.tgz";
+      path = fetchurl {
+        name = "_xtuc_ieee754___ieee754_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz";
+        sha1 = "eef014a3145ae477a1cbc00cd1e552336dceb790";
+      };
+    }
+    {
+      name = "_xtuc_long___long_4.2.2.tgz";
+      path = fetchurl {
+        name = "_xtuc_long___long_4.2.2.tgz";
+        url  = "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz";
+        sha1 = "d291c6a4e97989b5c61d9acf396ae4fe133a718d";
+      };
+    }
+    {
+      name = "acorn_jsx___acorn_jsx_5.2.0.tgz";
+      path = fetchurl {
+        name = "acorn_jsx___acorn_jsx_5.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz";
+        sha1 = "4c66069173d6fdd68ed85239fc256226182b2ebe";
+      };
+    }
+    {
+      name = "acorn___acorn_6.4.1.tgz";
+      path = fetchurl {
+        name = "acorn___acorn_6.4.1.tgz";
+        url  = "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz";
+        sha1 = "531e58ba3f51b9dacb9a6646ca4debf5b14ca474";
+      };
+    }
+    {
+      name = "acorn___acorn_7.3.1.tgz";
+      path = fetchurl {
+        name = "acorn___acorn_7.3.1.tgz";
+        url  = "https://registry.yarnpkg.com/acorn/-/acorn-7.3.1.tgz";
+        sha1 = "85010754db53c3fbaf3b9ea3e083aa5c5d147ffd";
+      };
+    }
+    {
+      name = "aggregate_error___aggregate_error_3.0.1.tgz";
+      path = fetchurl {
+        name = "aggregate_error___aggregate_error_3.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.0.1.tgz";
+        sha1 = "db2fe7246e536f40d9b5442a39e117d7dd6a24e0";
+      };
+    }
+    {
+      name = "ajv_errors___ajv_errors_1.0.1.tgz";
+      path = fetchurl {
+        name = "ajv_errors___ajv_errors_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz";
+        sha1 = "f35986aceb91afadec4102fbd85014950cefa64d";
+      };
+    }
+    {
+      name = "ajv_keywords___ajv_keywords_3.5.1.tgz";
+      path = fetchurl {
+        name = "ajv_keywords___ajv_keywords_3.5.1.tgz";
+        url  = "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.1.tgz";
+        sha1 = "b83ca89c5d42d69031f424cad49aada0236c6957";
+      };
+    }
+    {
+      name = "ajv_keywords___ajv_keywords_3.5.2.tgz";
+      path = fetchurl {
+        name = "ajv_keywords___ajv_keywords_3.5.2.tgz";
+        url  = "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz";
+        sha1 = "31f29da5ab6e00d1c2d329acf7b5929614d5014d";
+      };
+    }
+    {
+      name = "ajv___ajv_5.5.2.tgz";
+      path = fetchurl {
+        name = "ajv___ajv_5.5.2.tgz";
+        url  = "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz";
+        sha1 = "73b5eeca3fab653e3d3f9422b341ad42205dc965";
+      };
+    }
+    {
+      name = "ajv___ajv_6.12.3.tgz";
+      path = fetchurl {
+        name = "ajv___ajv_6.12.3.tgz";
+        url  = "https://registry.yarnpkg.com/ajv/-/ajv-6.12.3.tgz";
+        sha1 = "18c5af38a111ddeb4f2697bd78d68abc1cabd706";
+      };
+    }
+    {
+      name = "ajv___ajv_6.12.6.tgz";
+      path = fetchurl {
+        name = "ajv___ajv_6.12.6.tgz";
+        url  = "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz";
+        sha1 = "baf5a62e802b07d977034586f8c3baf5adf26df4";
+      };
+    }
+    {
+      name = "ajv___ajv_8.3.0.tgz";
+      path = fetchurl {
+        name = "ajv___ajv_8.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/ajv/-/ajv-8.3.0.tgz";
+        sha1 = "25ee7348e32cdc4a1dbb38256bf6bdc451dd577c";
+      };
+    }
+    {
+      name = "alphanum_sort___alphanum_sort_1.0.2.tgz";
+      path = fetchurl {
+        name = "alphanum_sort___alphanum_sort_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz";
+        sha1 = "97a1119649b211ad33691d9f9f486a8ec9fbe0a3";
+      };
+    }
+    {
+      name = "ansi_colors___ansi_colors_4.1.1.tgz";
+      path = fetchurl {
+        name = "ansi_colors___ansi_colors_4.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz";
+        sha1 = "cbb9ae256bf750af1eab344f229aa27fe94ba348";
+      };
+    }
+    {
+      name = "ansi_regex___ansi_regex_2.1.1.tgz";
+      path = fetchurl {
+        name = "ansi_regex___ansi_regex_2.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz";
+        sha1 = "c3b33ab5ee360d86e0e628f0468ae7ef27d654df";
+      };
+    }
+    {
+      name = "ansi_regex___ansi_regex_4.1.0.tgz";
+      path = fetchurl {
+        name = "ansi_regex___ansi_regex_4.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz";
+        sha1 = "8b9f8f08cf1acb843756a839ca8c7e3168c51997";
+      };
+    }
+    {
+      name = "ansi_regex___ansi_regex_5.0.0.tgz";
+      path = fetchurl {
+        name = "ansi_regex___ansi_regex_5.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz";
+        sha1 = "388539f55179bf39339c81af30a654d69f87cb75";
+      };
+    }
+    {
+      name = "ansi_styles___ansi_styles_2.2.1.tgz";
+      path = fetchurl {
+        name = "ansi_styles___ansi_styles_2.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz";
+        sha1 = "b432dd3358b634cf75e1e4664368240533c1ddbe";
+      };
+    }
+    {
+      name = "ansi_styles___ansi_styles_3.2.1.tgz";
+      path = fetchurl {
+        name = "ansi_styles___ansi_styles_3.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz";
+        sha1 = "41fbb20243e50b12be0f04b8dedbf07520ce841d";
+      };
+    }
+    {
+      name = "ansi_styles___ansi_styles_4.2.1.tgz";
+      path = fetchurl {
+        name = "ansi_styles___ansi_styles_4.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz";
+        sha1 = "90ae75c424d008d2624c5bf29ead3177ebfcf359";
+      };
+    }
+    {
+      name = "ansi_styles___ansi_styles_4.3.0.tgz";
+      path = fetchurl {
+        name = "ansi_styles___ansi_styles_4.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz";
+        sha1 = "edd803628ae71c04c85ae7a0906edad34b648937";
+      };
+    }
+    {
+      name = "anymatch___anymatch_2.0.0.tgz";
+      path = fetchurl {
+        name = "anymatch___anymatch_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz";
+        sha1 = "bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb";
+      };
+    }
+    {
+      name = "anymatch___anymatch_3.1.1.tgz";
+      path = fetchurl {
+        name = "anymatch___anymatch_3.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz";
+        sha1 = "c55ecf02185e2469259399310c173ce31233b142";
+      };
+    }
+    {
+      name = "aproba___aproba_1.2.0.tgz";
+      path = fetchurl {
+        name = "aproba___aproba_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz";
+        sha1 = "6802e6264efd18c790a1b0d517f0f2627bf2c94a";
+      };
+    }
+    {
+      name = "argparse___argparse_1.0.10.tgz";
+      path = fetchurl {
+        name = "argparse___argparse_1.0.10.tgz";
+        url  = "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz";
+        sha1 = "bcd6791ea5ae09725e17e5ad988134cd40b3d911";
+      };
+    }
+    {
+      name = "arr_diff___arr_diff_4.0.0.tgz";
+      path = fetchurl {
+        name = "arr_diff___arr_diff_4.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz";
+        sha1 = "d6461074febfec71e7e15235761a329a5dc7c520";
+      };
+    }
+    {
+      name = "arr_flatten___arr_flatten_1.1.0.tgz";
+      path = fetchurl {
+        name = "arr_flatten___arr_flatten_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz";
+        sha1 = "36048bbff4e7b47e136644316c99669ea5ae91f1";
+      };
+    }
+    {
+      name = "arr_union___arr_union_3.1.0.tgz";
+      path = fetchurl {
+        name = "arr_union___arr_union_3.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz";
+        sha1 = "e39b09aea9def866a8f206e288af63919bae39c4";
+      };
+    }
+    {
+      name = "array_includes___array_includes_3.1.1.tgz";
+      path = fetchurl {
+        name = "array_includes___array_includes_3.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.1.tgz";
+        sha1 = "cdd67e6852bdf9c1215460786732255ed2459348";
+      };
+    }
+    {
+      name = "array_union___array_union_1.0.2.tgz";
+      path = fetchurl {
+        name = "array_union___array_union_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz";
+        sha1 = "9a34410e4f4e3da23dea375be5be70f24778ec39";
+      };
+    }
+    {
+      name = "array_union___array_union_2.1.0.tgz";
+      path = fetchurl {
+        name = "array_union___array_union_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz";
+        sha1 = "b798420adbeb1de828d84acd8a2e23d3efe85e8d";
+      };
+    }
+    {
+      name = "array_uniq___array_uniq_1.0.3.tgz";
+      path = fetchurl {
+        name = "array_uniq___array_uniq_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz";
+        sha1 = "af6ac877a25cc7f74e058894753858dfdb24fdb6";
+      };
+    }
+    {
+      name = "array_unique___array_unique_0.3.2.tgz";
+      path = fetchurl {
+        name = "array_unique___array_unique_0.3.2.tgz";
+        url  = "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz";
+        sha1 = "a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428";
+      };
+    }
+    {
+      name = "array.prototype.flat___array.prototype.flat_1.2.3.tgz";
+      path = fetchurl {
+        name = "array.prototype.flat___array.prototype.flat_1.2.3.tgz";
+        url  = "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz";
+        sha1 = "0de82b426b0318dbfdb940089e38b043d37f6c7b";
+      };
+    }
+    {
+      name = "arrify___arrify_1.0.1.tgz";
+      path = fetchurl {
+        name = "arrify___arrify_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz";
+        sha1 = "898508da2226f380df904728456849c1501a4b0d";
+      };
+    }
+    {
+      name = "asn1.js___asn1.js_4.10.1.tgz";
+      path = fetchurl {
+        name = "asn1.js___asn1.js_4.10.1.tgz";
+        url  = "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz";
+        sha1 = "b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0";
+      };
+    }
+    {
+      name = "assert___assert_1.5.0.tgz";
+      path = fetchurl {
+        name = "assert___assert_1.5.0.tgz";
+        url  = "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz";
+        sha1 = "55c109aaf6e0aefdb3dc4b71240c70bf574b18eb";
+      };
+    }
+    {
+      name = "assign_symbols___assign_symbols_1.0.0.tgz";
+      path = fetchurl {
+        name = "assign_symbols___assign_symbols_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz";
+        sha1 = "59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367";
+      };
+    }
+    {
+      name = "astral_regex___astral_regex_1.0.0.tgz";
+      path = fetchurl {
+        name = "astral_regex___astral_regex_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz";
+        sha1 = "6c8c3fb827dd43ee3918f27b82782ab7658a6fd9";
+      };
+    }
+    {
+      name = "astral_regex___astral_regex_2.0.0.tgz";
+      path = fetchurl {
+        name = "astral_regex___astral_regex_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz";
+        sha1 = "483143c567aeed4785759c0865786dc77d7d2e31";
+      };
+    }
+    {
+      name = "async_each___async_each_1.0.3.tgz";
+      path = fetchurl {
+        name = "async_each___async_each_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz";
+        sha1 = "b727dbf87d7651602f06f4d4ac387f47d91b0cbf";
+      };
+    }
+    {
+      name = "atob___atob_2.1.2.tgz";
+      path = fetchurl {
+        name = "atob___atob_2.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz";
+        sha1 = "6d9517eb9e030d2436666651e86bd9f6f13533c9";
+      };
+    }
+    {
+      name = "autoprefixer___autoprefixer_9.8.6.tgz";
+      path = fetchurl {
+        name = "autoprefixer___autoprefixer_9.8.6.tgz";
+        url  = "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.6.tgz";
+        sha1 = "3b73594ca1bf9266320c5acf1588d74dea74210f";
+      };
+    }
+    {
+      name = "babel_code_frame___babel_code_frame_6.26.0.tgz";
+      path = fetchurl {
+        name = "babel_code_frame___babel_code_frame_6.26.0.tgz";
+        url  = "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz";
+        sha1 = "63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b";
+      };
+    }
+    {
+      name = "babel_core___babel_core_6.26.3.tgz";
+      path = fetchurl {
+        name = "babel_core___babel_core_6.26.3.tgz";
+        url  = "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz";
+        sha1 = "b2e2f09e342d0f0c88e2f02e067794125e75c207";
+      };
+    }
+    {
+      name = "babel_eslint___babel_eslint_10.1.0.tgz";
+      path = fetchurl {
+        name = "babel_eslint___babel_eslint_10.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.1.0.tgz";
+        sha1 = "6968e568a910b78fb3779cdd8b6ac2f479943232";
+      };
+    }
+    {
+      name = "babel_generator___babel_generator_6.26.1.tgz";
+      path = fetchurl {
+        name = "babel_generator___babel_generator_6.26.1.tgz";
+        url  = "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz";
+        sha1 = "1844408d3b8f0d35a404ea7ac180f087a601bd90";
+      };
+    }
+    {
+      name = "babel_helpers___babel_helpers_6.24.1.tgz";
+      path = fetchurl {
+        name = "babel_helpers___babel_helpers_6.24.1.tgz";
+        url  = "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz";
+        sha1 = "3471de9caec388e5c850e597e58a26ddf37602b2";
+      };
+    }
+    {
+      name = "babel_loader___babel_loader_8.1.0.tgz";
+      path = fetchurl {
+        name = "babel_loader___babel_loader_8.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.1.0.tgz";
+        sha1 = "c611d5112bd5209abe8b9fa84c3e4da25275f1c3";
+      };
+    }
+    {
+      name = "babel_messages___babel_messages_6.23.0.tgz";
+      path = fetchurl {
+        name = "babel_messages___babel_messages_6.23.0.tgz";
+        url  = "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz";
+        sha1 = "f3cdf4703858035b2a2951c6ec5edf6c62f2630e";
+      };
+    }
+    {
+      name = "babel_plugin_css_modules_transform___babel_plugin_css_modules_transform_1.6.2.tgz";
+      path = fetchurl {
+        name = "babel_plugin_css_modules_transform___babel_plugin_css_modules_transform_1.6.2.tgz";
+        url  = "https://registry.yarnpkg.com/babel-plugin-css-modules-transform/-/babel-plugin-css-modules-transform-1.6.2.tgz";
+        sha1 = "eecf4889637bf1c56cda25ee21df060775d1bd22";
+      };
+    }
+    {
+      name = "babel_polyfill___babel_polyfill_6.26.0.tgz";
+      path = fetchurl {
+        name = "babel_polyfill___babel_polyfill_6.26.0.tgz";
+        url  = "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz";
+        sha1 = "379937abc67d7895970adc621f284cd966cf2153";
+      };
+    }
+    {
+      name = "babel_register___babel_register_6.26.0.tgz";
+      path = fetchurl {
+        name = "babel_register___babel_register_6.26.0.tgz";
+        url  = "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz";
+        sha1 = "6ed021173e2fcb486d7acb45c6009a856f647071";
+      };
+    }
+    {
+      name = "babel_runtime___babel_runtime_6.26.0.tgz";
+      path = fetchurl {
+        name = "babel_runtime___babel_runtime_6.26.0.tgz";
+        url  = "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz";
+        sha1 = "965c7058668e82b55d7bfe04ff2337bc8b5647fe";
+      };
+    }
+    {
+      name = "babel_template___babel_template_6.26.0.tgz";
+      path = fetchurl {
+        name = "babel_template___babel_template_6.26.0.tgz";
+        url  = "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz";
+        sha1 = "de03e2d16396b069f46dd9fff8521fb1a0e35e02";
+      };
+    }
+    {
+      name = "babel_traverse___babel_traverse_6.26.0.tgz";
+      path = fetchurl {
+        name = "babel_traverse___babel_traverse_6.26.0.tgz";
+        url  = "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz";
+        sha1 = "46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee";
+      };
+    }
+    {
+      name = "babel_types___babel_types_6.26.0.tgz";
+      path = fetchurl {
+        name = "babel_types___babel_types_6.26.0.tgz";
+        url  = "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz";
+        sha1 = "a3b073f94ab49eb6fa55cd65227a334380632497";
+      };
+    }
+    {
+      name = "babel___babel_6.23.0.tgz";
+      path = fetchurl {
+        name = "babel___babel_6.23.0.tgz";
+        url  = "https://registry.yarnpkg.com/babel/-/babel-6.23.0.tgz";
+        sha1 = "d0d1e7d803e974765beea3232d4e153c0efb90f4";
+      };
+    }
+    {
+      name = "babylon___babylon_6.18.0.tgz";
+      path = fetchurl {
+        name = "babylon___babylon_6.18.0.tgz";
+        url  = "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz";
+        sha1 = "af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3";
+      };
+    }
+    {
+      name = "bail___bail_1.0.5.tgz";
+      path = fetchurl {
+        name = "bail___bail_1.0.5.tgz";
+        url  = "https://registry.yarnpkg.com/bail/-/bail-1.0.5.tgz";
+        sha1 = "b6fa133404a392cbc1f8c4bf63f5953351e7a776";
+      };
+    }
+    {
+      name = "balanced_match___balanced_match_1.0.2.tgz";
+      path = fetchurl {
+        name = "balanced_match___balanced_match_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz";
+        sha1 = "e83e3a7e3f300b34cb9d87f615fa0cbf357690ee";
+      };
+    }
+    {
+      name = "balanced_match___balanced_match_2.0.0.tgz";
+      path = fetchurl {
+        name = "balanced_match___balanced_match_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/balanced-match/-/balanced-match-2.0.0.tgz";
+        sha1 = "dc70f920d78db8b858535795867bf48f820633d9";
+      };
+    }
+    {
+      name = "base64_js___base64_js_1.3.1.tgz";
+      path = fetchurl {
+        name = "base64_js___base64_js_1.3.1.tgz";
+        url  = "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz";
+        sha1 = "58ece8cb75dd07e71ed08c736abc5fac4dbf8df1";
+      };
+    }
+    {
+      name = "base___base_0.11.2.tgz";
+      path = fetchurl {
+        name = "base___base_0.11.2.tgz";
+        url  = "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz";
+        sha1 = "7bde5ced145b6d551a90db87f83c558b4eb48a8f";
+      };
+    }
+    {
+      name = "better_ajv_errors___better_ajv_errors_0.6.7.tgz";
+      path = fetchurl {
+        name = "better_ajv_errors___better_ajv_errors_0.6.7.tgz";
+        url  = "https://registry.yarnpkg.com/better-ajv-errors/-/better-ajv-errors-0.6.7.tgz";
+        sha1 = "b5344af1ce10f434fe02fc4390a5a9c811e470d1";
+      };
+    }
+    {
+      name = "big.js___big.js_3.2.0.tgz";
+      path = fetchurl {
+        name = "big.js___big.js_3.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz";
+        sha1 = "a5fc298b81b9e0dca2e458824784b65c52ba588e";
+      };
+    }
+    {
+      name = "big.js___big.js_5.2.2.tgz";
+      path = fetchurl {
+        name = "big.js___big.js_5.2.2.tgz";
+        url  = "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz";
+        sha1 = "65f0af382f578bcdc742bd9c281e9cb2d7768328";
+      };
+    }
+    {
+      name = "binary_extensions___binary_extensions_1.13.1.tgz";
+      path = fetchurl {
+        name = "binary_extensions___binary_extensions_1.13.1.tgz";
+        url  = "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz";
+        sha1 = "598afe54755b2868a5330d2aff9d4ebb53209b65";
+      };
+    }
+    {
+      name = "binary_extensions___binary_extensions_2.1.0.tgz";
+      path = fetchurl {
+        name = "binary_extensions___binary_extensions_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.1.0.tgz";
+        sha1 = "30fa40c9e7fe07dbc895678cd287024dea241dd9";
+      };
+    }
+    {
+      name = "bindings___bindings_1.5.0.tgz";
+      path = fetchurl {
+        name = "bindings___bindings_1.5.0.tgz";
+        url  = "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz";
+        sha1 = "10353c9e945334bc0511a6d90b38fbc7c9c504df";
+      };
+    }
+    {
+      name = "bluebird___bluebird_3.7.2.tgz";
+      path = fetchurl {
+        name = "bluebird___bluebird_3.7.2.tgz";
+        url  = "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz";
+        sha1 = "9f229c15be272454ffa973ace0dbee79a1b0c36f";
+      };
+    }
+    {
+      name = "bn.js___bn.js_4.12.0.tgz";
+      path = fetchurl {
+        name = "bn.js___bn.js_4.12.0.tgz";
+        url  = "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz";
+        sha1 = "775b3f278efbb9718eec7361f483fb36fbbfea88";
+      };
+    }
+    {
+      name = "bn.js___bn.js_5.1.2.tgz";
+      path = fetchurl {
+        name = "bn.js___bn.js_5.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.2.tgz";
+        sha1 = "c9686902d3c9a27729f43ab10f9d79c2004da7b0";
+      };
+    }
+    {
+      name = "boolbase___boolbase_1.0.0.tgz";
+      path = fetchurl {
+        name = "boolbase___boolbase_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz";
+        sha1 = "68dff5fbe60c51eb37725ea9e3ed310dcc1e776e";
+      };
+    }
+    {
+      name = "bootstrap_3_typeahead___bootstrap_3_typeahead_4.0.2.tgz";
+      path = fetchurl {
+        name = "bootstrap_3_typeahead___bootstrap_3_typeahead_4.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/bootstrap-3-typeahead/-/bootstrap-3-typeahead-4.0.2.tgz";
+        sha1 = "cb1c969044856862096fc8c71cc21b3acbb50412";
+      };
+    }
+    {
+      name = "bootstrap___bootstrap_3.4.1.tgz";
+      path = fetchurl {
+        name = "bootstrap___bootstrap_3.4.1.tgz";
+        url  = "https://registry.yarnpkg.com/bootstrap/-/bootstrap-3.4.1.tgz";
+        sha1 = "c3a347d419e289ad11f4033e3c4132b87c081d72";
+      };
+    }
+    {
+      name = "brace_expansion___brace_expansion_1.1.11.tgz";
+      path = fetchurl {
+        name = "brace_expansion___brace_expansion_1.1.11.tgz";
+        url  = "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz";
+        sha1 = "3c7fcbf529d87226f3d2f52b966ff5271eb441dd";
+      };
+    }
+    {
+      name = "braces___braces_2.3.2.tgz";
+      path = fetchurl {
+        name = "braces___braces_2.3.2.tgz";
+        url  = "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz";
+        sha1 = "5979fd3f14cd531565e5fa2df1abfff1dfaee729";
+      };
+    }
+    {
+      name = "braces___braces_3.0.2.tgz";
+      path = fetchurl {
+        name = "braces___braces_3.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz";
+        sha1 = "3454e1a462ee8d599e236df336cd9ea4f8afe107";
+      };
+    }
+    {
+      name = "brorand___brorand_1.1.0.tgz";
+      path = fetchurl {
+        name = "brorand___brorand_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz";
+        sha1 = "12c25efe40a45e3c323eb8675a0a0ce57b22371f";
+      };
+    }
+    {
+      name = "browserify_aes___browserify_aes_1.2.0.tgz";
+      path = fetchurl {
+        name = "browserify_aes___browserify_aes_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz";
+        sha1 = "326734642f403dabc3003209853bb70ad428ef48";
+      };
+    }
+    {
+      name = "browserify_cipher___browserify_cipher_1.0.1.tgz";
+      path = fetchurl {
+        name = "browserify_cipher___browserify_cipher_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz";
+        sha1 = "8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0";
+      };
+    }
+    {
+      name = "browserify_des___browserify_des_1.0.2.tgz";
+      path = fetchurl {
+        name = "browserify_des___browserify_des_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz";
+        sha1 = "3af4f1f59839403572f1c66204375f7a7f703e9c";
+      };
+    }
+    {
+      name = "browserify_rsa___browserify_rsa_4.0.1.tgz";
+      path = fetchurl {
+        name = "browserify_rsa___browserify_rsa_4.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz";
+        sha1 = "21e0abfaf6f2029cf2fafb133567a701d4135524";
+      };
+    }
+    {
+      name = "browserify_sign___browserify_sign_4.2.0.tgz";
+      path = fetchurl {
+        name = "browserify_sign___browserify_sign_4.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.0.tgz";
+        sha1 = "545d0b1b07e6b2c99211082bf1b12cce7a0b0e11";
+      };
+    }
+    {
+      name = "browserify_zlib___browserify_zlib_0.2.0.tgz";
+      path = fetchurl {
+        name = "browserify_zlib___browserify_zlib_0.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz";
+        sha1 = "2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f";
+      };
+    }
+    {
+      name = "browserslist___browserslist_4.14.5.tgz";
+      path = fetchurl {
+        name = "browserslist___browserslist_4.14.5.tgz";
+        url  = "https://registry.yarnpkg.com/browserslist/-/browserslist-4.14.5.tgz";
+        sha1 = "1c751461a102ddc60e40993639b709be7f2c4015";
+      };
+    }
+    {
+      name = "browserslist___browserslist_4.16.6.tgz";
+      path = fetchurl {
+        name = "browserslist___browserslist_4.16.6.tgz";
+        url  = "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.6.tgz";
+        sha1 = "d7901277a5a88e554ed305b183ec9b0c08f66fa2";
+      };
+    }
+    {
+      name = "buffer_from___buffer_from_1.1.1.tgz";
+      path = fetchurl {
+        name = "buffer_from___buffer_from_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz";
+        sha1 = "32713bc028f75c02fdb710d7c7bcec1f2c6070ef";
+      };
+    }
+    {
+      name = "buffer_xor___buffer_xor_1.0.3.tgz";
+      path = fetchurl {
+        name = "buffer_xor___buffer_xor_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz";
+        sha1 = "26e61ed1422fb70dd42e6e36729ed51d855fe8d9";
+      };
+    }
+    {
+      name = "buffer___buffer_4.9.2.tgz";
+      path = fetchurl {
+        name = "buffer___buffer_4.9.2.tgz";
+        url  = "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz";
+        sha1 = "230ead344002988644841ab0244af8c44bbe3ef8";
+      };
+    }
+    {
+      name = "builtin_status_codes___builtin_status_codes_3.0.0.tgz";
+      path = fetchurl {
+        name = "builtin_status_codes___builtin_status_codes_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz";
+        sha1 = "85982878e21b98e1c66425e03d0174788f569ee8";
+      };
+    }
+    {
+      name = "cacache___cacache_12.0.4.tgz";
+      path = fetchurl {
+        name = "cacache___cacache_12.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz";
+        sha1 = "668bcbd105aeb5f1d92fe25570ec9525c8faa40c";
+      };
+    }
+    {
+      name = "cacache___cacache_15.0.5.tgz";
+      path = fetchurl {
+        name = "cacache___cacache_15.0.5.tgz";
+        url  = "https://registry.yarnpkg.com/cacache/-/cacache-15.0.5.tgz";
+        sha1 = "69162833da29170d6732334643c60e005f5f17d0";
+      };
+    }
+    {
+      name = "cache_base___cache_base_1.0.1.tgz";
+      path = fetchurl {
+        name = "cache_base___cache_base_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz";
+        sha1 = "0a7f46416831c8b662ee36fe4e7c59d76f666ab2";
+      };
+    }
+    {
+      name = "call_me_maybe___call_me_maybe_1.0.1.tgz";
+      path = fetchurl {
+        name = "call_me_maybe___call_me_maybe_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz";
+        sha1 = "26d208ea89e37b5cbde60250a15f031c16a4d66b";
+      };
+    }
+    {
+      name = "callsites___callsites_3.1.0.tgz";
+      path = fetchurl {
+        name = "callsites___callsites_3.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz";
+        sha1 = "b3630abd8943432f54b3f0519238e33cd7df2f73";
+      };
+    }
+    {
+      name = "camelcase_keys___camelcase_keys_6.2.2.tgz";
+      path = fetchurl {
+        name = "camelcase_keys___camelcase_keys_6.2.2.tgz";
+        url  = "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz";
+        sha1 = "5e755d6ba51aa223ec7d3d52f25778210f9dc3c0";
+      };
+    }
+    {
+      name = "camelcase___camelcase_5.3.1.tgz";
+      path = fetchurl {
+        name = "camelcase___camelcase_5.3.1.tgz";
+        url  = "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz";
+        sha1 = "e3c9b31569e106811df242f715725a1f4c494320";
+      };
+    }
+    {
+      name = "caniuse_api___caniuse_api_3.0.0.tgz";
+      path = fetchurl {
+        name = "caniuse_api___caniuse_api_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz";
+        sha1 = "5e4d90e2274961d46291997df599e3ed008ee4c0";
+      };
+    }
+    {
+      name = "caniuse_lite___caniuse_lite_1.0.30001236.tgz";
+      path = fetchurl {
+        name = "caniuse_lite___caniuse_lite_1.0.30001236.tgz";
+        url  = "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001236.tgz";
+        sha1 = "0a80de4cdf62e1770bb46a30d884fc8d633e3958";
+      };
+    }
+    {
+      name = "chalk___chalk_1.1.3.tgz";
+      path = fetchurl {
+        name = "chalk___chalk_1.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz";
+        sha1 = "a8115c55e4a702fe4d150abd3872822a7e09fc98";
+      };
+    }
+    {
+      name = "chalk___chalk_2.4.2.tgz";
+      path = fetchurl {
+        name = "chalk___chalk_2.4.2.tgz";
+        url  = "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz";
+        sha1 = "cd42541677a54333cf541a49108c1432b44c9424";
+      };
+    }
+    {
+      name = "chalk___chalk_4.1.1.tgz";
+      path = fetchurl {
+        name = "chalk___chalk_4.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz";
+        sha1 = "c80b3fab28bf6371e6863325eee67e618b77e6ad";
+      };
+    }
+    {
+      name = "character_entities_legacy___character_entities_legacy_1.1.4.tgz";
+      path = fetchurl {
+        name = "character_entities_legacy___character_entities_legacy_1.1.4.tgz";
+        url  = "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz";
+        sha1 = "94bc1845dce70a5bb9d2ecc748725661293d8fc1";
+      };
+    }
+    {
+      name = "character_entities___character_entities_1.2.4.tgz";
+      path = fetchurl {
+        name = "character_entities___character_entities_1.2.4.tgz";
+        url  = "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz";
+        sha1 = "e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b";
+      };
+    }
+    {
+      name = "character_reference_invalid___character_reference_invalid_1.1.4.tgz";
+      path = fetchurl {
+        name = "character_reference_invalid___character_reference_invalid_1.1.4.tgz";
+        url  = "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz";
+        sha1 = "083329cda0eae272ab3dbbf37e9a382c13af1560";
+      };
+    }
+    {
+      name = "chokidar___chokidar_2.1.8.tgz";
+      path = fetchurl {
+        name = "chokidar___chokidar_2.1.8.tgz";
+        url  = "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz";
+        sha1 = "804b3a7b6a99358c3c5c61e71d8728f041cff917";
+      };
+    }
+    {
+      name = "chokidar___chokidar_3.4.1.tgz";
+      path = fetchurl {
+        name = "chokidar___chokidar_3.4.1.tgz";
+        url  = "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.1.tgz";
+        sha1 = "e905bdecf10eaa0a0b1db0c664481cc4cbc22ba1";
+      };
+    }
+    {
+      name = "chownr___chownr_1.1.4.tgz";
+      path = fetchurl {
+        name = "chownr___chownr_1.1.4.tgz";
+        url  = "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz";
+        sha1 = "6fc9d7b42d32a583596337666e7d08084da2cc6b";
+      };
+    }
+    {
+      name = "chownr___chownr_2.0.0.tgz";
+      path = fetchurl {
+        name = "chownr___chownr_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz";
+        sha1 = "15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece";
+      };
+    }
+    {
+      name = "chrome_trace_event___chrome_trace_event_1.0.2.tgz";
+      path = fetchurl {
+        name = "chrome_trace_event___chrome_trace_event_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz";
+        sha1 = "234090ee97c7d4ad1a2c4beae27505deffc608a4";
+      };
+    }
+    {
+      name = "cipher_base___cipher_base_1.0.4.tgz";
+      path = fetchurl {
+        name = "cipher_base___cipher_base_1.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz";
+        sha1 = "8760e4ecc272f4c363532f926d874aae2c1397de";
+      };
+    }
+    {
+      name = "class_utils___class_utils_0.3.6.tgz";
+      path = fetchurl {
+        name = "class_utils___class_utils_0.3.6.tgz";
+        url  = "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz";
+        sha1 = "f93369ae8b9a7ce02fd41faad0ca83033190c463";
+      };
+    }
+    {
+      name = "classnames___classnames_2.2.6.tgz";
+      path = fetchurl {
+        name = "classnames___classnames_2.2.6.tgz";
+        url  = "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz";
+        sha1 = "43935bffdd291f326dad0a205309b38d00f650ce";
+      };
+    }
+    {
+      name = "clean_stack___clean_stack_2.2.0.tgz";
+      path = fetchurl {
+        name = "clean_stack___clean_stack_2.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz";
+        sha1 = "ee8472dbb129e727b31e8a10a427dee9dfe4008b";
+      };
+    }
+    {
+      name = "clean_webpack_plugin___clean_webpack_plugin_3.0.0.tgz";
+      path = fetchurl {
+        name = "clean_webpack_plugin___clean_webpack_plugin_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/clean-webpack-plugin/-/clean-webpack-plugin-3.0.0.tgz";
+        sha1 = "a99d8ec34c1c628a4541567aa7b457446460c62b";
+      };
+    }
+    {
+      name = "cli___cli_1.0.1.tgz";
+      path = fetchurl {
+        name = "cli___cli_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/cli/-/cli-1.0.1.tgz";
+        sha1 = "22817534f24bfa4950c34d532d48ecbc621b8c14";
+      };
+    }
+    {
+      name = "clipboard___clipboard_2.0.6.tgz";
+      path = fetchurl {
+        name = "clipboard___clipboard_2.0.6.tgz";
+        url  = "https://registry.yarnpkg.com/clipboard/-/clipboard-2.0.6.tgz";
+        sha1 = "52921296eec0fdf77ead1749421b21c968647376";
+      };
+    }
+    {
+      name = "cliui___cliui_5.0.0.tgz";
+      path = fetchurl {
+        name = "cliui___cliui_5.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz";
+        sha1 = "deefcfdb2e800784aa34f46fa08e06851c7bbbc5";
+      };
+    }
+    {
+      name = "cliui___cliui_6.0.0.tgz";
+      path = fetchurl {
+        name = "cliui___cliui_6.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz";
+        sha1 = "511d702c0c4e41ca156d7d0e96021f23e13225b1";
+      };
+    }
+    {
+      name = "cliui___cliui_7.0.4.tgz";
+      path = fetchurl {
+        name = "cliui___cliui_7.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz";
+        sha1 = "a0265ee655476fc807aea9df3df8df7783808b4f";
+      };
+    }
+    {
+      name = "clone_regexp___clone_regexp_2.2.0.tgz";
+      path = fetchurl {
+        name = "clone_regexp___clone_regexp_2.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/clone-regexp/-/clone-regexp-2.2.0.tgz";
+        sha1 = "7d65e00885cd8796405c35a737e7a86b7429e36f";
+      };
+    }
+    {
+      name = "clsx___clsx_1.1.1.tgz";
+      path = fetchurl {
+        name = "clsx___clsx_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/clsx/-/clsx-1.1.1.tgz";
+        sha1 = "98b3134f9abbdf23b2663491ace13c5c03a73188";
+      };
+    }
+    {
+      name = "co___co_4.6.0.tgz";
+      path = fetchurl {
+        name = "co___co_4.6.0.tgz";
+        url  = "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz";
+        sha1 = "6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184";
+      };
+    }
+    {
+      name = "code_error_fragment___code_error_fragment_0.0.230.tgz";
+      path = fetchurl {
+        name = "code_error_fragment___code_error_fragment_0.0.230.tgz";
+        url  = "https://registry.yarnpkg.com/code-error-fragment/-/code-error-fragment-0.0.230.tgz";
+        sha1 = "d736d75c832445342eca1d1fedbf17d9618b14d7";
+      };
+    }
+    {
+      name = "codemirror___codemirror_5.59.1.tgz";
+      path = fetchurl {
+        name = "codemirror___codemirror_5.59.1.tgz";
+        url  = "https://registry.yarnpkg.com/codemirror/-/codemirror-5.59.1.tgz";
+        sha1 = "cd6465555a87f8a2243eb41ffb460c777e15212c";
+      };
+    }
+    {
+      name = "collection_visit___collection_visit_1.0.0.tgz";
+      path = fetchurl {
+        name = "collection_visit___collection_visit_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz";
+        sha1 = "4bc0373c164bc3291b4d368c829cf1a80a59dca0";
+      };
+    }
+    {
+      name = "color_convert___color_convert_1.9.3.tgz";
+      path = fetchurl {
+        name = "color_convert___color_convert_1.9.3.tgz";
+        url  = "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz";
+        sha1 = "bb71850690e1f136567de629d2d5471deda4c1e8";
+      };
+    }
+    {
+      name = "color_convert___color_convert_2.0.1.tgz";
+      path = fetchurl {
+        name = "color_convert___color_convert_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz";
+        sha1 = "72d3a68d598c9bdb3af2ad1e84f21d896abd4de3";
+      };
+    }
+    {
+      name = "color_name___color_name_1.1.3.tgz";
+      path = fetchurl {
+        name = "color_name___color_name_1.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz";
+        sha1 = "a7d0558bd89c42f795dd42328f740831ca53bc25";
+      };
+    }
+    {
+      name = "color_name___color_name_1.1.4.tgz";
+      path = fetchurl {
+        name = "color_name___color_name_1.1.4.tgz";
+        url  = "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz";
+        sha1 = "c2a09a87acbde69543de6f63fa3995c826c536a2";
+      };
+    }
+    {
+      name = "colord___colord_2.0.1.tgz";
+      path = fetchurl {
+        name = "colord___colord_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/colord/-/colord-2.0.1.tgz";
+        sha1 = "1e7fb1f9fa1cf74f42c58cb9c20320bab8435aa0";
+      };
+    }
+    {
+      name = "colorette___colorette_1.2.2.tgz";
+      path = fetchurl {
+        name = "colorette___colorette_1.2.2.tgz";
+        url  = "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz";
+        sha1 = "cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94";
+      };
+    }
+    {
+      name = "commander___commander_2.20.3.tgz";
+      path = fetchurl {
+        name = "commander___commander_2.20.3.tgz";
+        url  = "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz";
+        sha1 = "fd485e84c03eb4881c20722ba48035e8531aeb33";
+      };
+    }
+    {
+      name = "commander___commander_7.2.0.tgz";
+      path = fetchurl {
+        name = "commander___commander_7.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz";
+        sha1 = "a36cb57d0b501ce108e4d20559a150a391d97ab7";
+      };
+    }
+    {
+      name = "commondir___commondir_1.0.1.tgz";
+      path = fetchurl {
+        name = "commondir___commondir_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz";
+        sha1 = "ddd800da0c66127393cca5950ea968a3aaf1253b";
+      };
+    }
+    {
+      name = "component_emitter___component_emitter_1.3.0.tgz";
+      path = fetchurl {
+        name = "component_emitter___component_emitter_1.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz";
+        sha1 = "16e4070fba8ae29b679f2215853ee181ab2eabc0";
+      };
+    }
+    {
+      name = "concat_map___concat_map_0.0.1.tgz";
+      path = fetchurl {
+        name = "concat_map___concat_map_0.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz";
+        sha1 = "d8a96bd77fd68df7793a73036a3ba0d5405d477b";
+      };
+    }
+    {
+      name = "concat_stream___concat_stream_1.6.2.tgz";
+      path = fetchurl {
+        name = "concat_stream___concat_stream_1.6.2.tgz";
+        url  = "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz";
+        sha1 = "904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34";
+      };
+    }
+    {
+      name = "confusing_browser_globals___confusing_browser_globals_1.0.9.tgz";
+      path = fetchurl {
+        name = "confusing_browser_globals___confusing_browser_globals_1.0.9.tgz";
+        url  = "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz";
+        sha1 = "72bc13b483c0276801681871d4898516f8f54fdd";
+      };
+    }
+    {
+      name = "console_browserify___console_browserify_1.1.0.tgz";
+      path = fetchurl {
+        name = "console_browserify___console_browserify_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz";
+        sha1 = "f0241c45730a9fc6323b206dbf38edc741d0bb10";
+      };
+    }
+    {
+      name = "console_browserify___console_browserify_1.2.0.tgz";
+      path = fetchurl {
+        name = "console_browserify___console_browserify_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz";
+        sha1 = "67063cef57ceb6cf4993a2ab3a55840ae8c49336";
+      };
+    }
+    {
+      name = "constants_browserify___constants_browserify_1.0.0.tgz";
+      path = fetchurl {
+        name = "constants_browserify___constants_browserify_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz";
+        sha1 = "c20b96d8c617748aaf1c16021760cd27fcb8cb75";
+      };
+    }
+    {
+      name = "contains_path___contains_path_0.1.0.tgz";
+      path = fetchurl {
+        name = "contains_path___contains_path_0.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz";
+        sha1 = "fe8cf184ff6670b6baef01a9d4861a5cbec4120a";
+      };
+    }
+    {
+      name = "convert_source_map___convert_source_map_1.7.0.tgz";
+      path = fetchurl {
+        name = "convert_source_map___convert_source_map_1.7.0.tgz";
+        url  = "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz";
+        sha1 = "17a2cb882d7f77d3490585e2ce6c524424a3a442";
+      };
+    }
+    {
+      name = "copy_concurrently___copy_concurrently_1.0.5.tgz";
+      path = fetchurl {
+        name = "copy_concurrently___copy_concurrently_1.0.5.tgz";
+        url  = "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz";
+        sha1 = "92297398cae34937fcafd6ec8139c18051f0b5e0";
+      };
+    }
+    {
+      name = "copy_descriptor___copy_descriptor_0.1.1.tgz";
+      path = fetchurl {
+        name = "copy_descriptor___copy_descriptor_0.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz";
+        sha1 = "676f6eb3c39997c2ee1ac3a924fd6124748f578d";
+      };
+    }
+    {
+      name = "copy_webpack_plugin___copy_webpack_plugin_6.0.3.tgz";
+      path = fetchurl {
+        name = "copy_webpack_plugin___copy_webpack_plugin_6.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-6.0.3.tgz";
+        sha1 = "2b3d2bfc6861b96432a65f0149720adbd902040b";
+      };
+    }
+    {
+      name = "core_js___core_js_2.6.11.tgz";
+      path = fetchurl {
+        name = "core_js___core_js_2.6.11.tgz";
+        url  = "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz";
+        sha1 = "38831469f9922bded8ee21c9dc46985e0399308c";
+      };
+    }
+    {
+      name = "core_js___core_js_3.6.5.tgz";
+      path = fetchurl {
+        name = "core_js___core_js_3.6.5.tgz";
+        url  = "https://registry.yarnpkg.com/core-js/-/core-js-3.6.5.tgz";
+        sha1 = "7395dc273af37fb2e50e9bd3d9fe841285231d1a";
+      };
+    }
+    {
+      name = "core_util_is___core_util_is_1.0.2.tgz";
+      path = fetchurl {
+        name = "core_util_is___core_util_is_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz";
+        sha1 = "b5fd54220aa2bc5ab57aab7140c940754503c1a7";
+      };
+    }
+    {
+      name = "cosmiconfig___cosmiconfig_7.0.0.tgz";
+      path = fetchurl {
+        name = "cosmiconfig___cosmiconfig_7.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.0.tgz";
+        sha1 = "ef9b44d773959cae63ddecd122de23853b60f8d3";
+      };
+    }
+    {
+      name = "create_ecdh___create_ecdh_4.0.3.tgz";
+      path = fetchurl {
+        name = "create_ecdh___create_ecdh_4.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz";
+        sha1 = "c9111b6f33045c4697f144787f9254cdc77c45ff";
+      };
+    }
+    {
+      name = "create_hash___create_hash_1.2.0.tgz";
+      path = fetchurl {
+        name = "create_hash___create_hash_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz";
+        sha1 = "889078af11a63756bcfb59bd221996be3a9ef196";
+      };
+    }
+    {
+      name = "create_hmac___create_hmac_1.1.7.tgz";
+      path = fetchurl {
+        name = "create_hmac___create_hmac_1.1.7.tgz";
+        url  = "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz";
+        sha1 = "69170c78b3ab957147b2b8b04572e47ead2243ff";
+      };
+    }
+    {
+      name = "cross_spawn___cross_spawn_6.0.5.tgz";
+      path = fetchurl {
+        name = "cross_spawn___cross_spawn_6.0.5.tgz";
+        url  = "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz";
+        sha1 = "4a5ec7c64dfae22c3a14124dbacdee846d80cbc4";
+      };
+    }
+    {
+      name = "cross_spawn___cross_spawn_7.0.3.tgz";
+      path = fetchurl {
+        name = "cross_spawn___cross_spawn_7.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz";
+        sha1 = "f73a85b9d5d41d045551c177e2882d4ac85728a6";
+      };
+    }
+    {
+      name = "crypto_browserify___crypto_browserify_3.12.0.tgz";
+      path = fetchurl {
+        name = "crypto_browserify___crypto_browserify_3.12.0.tgz";
+        url  = "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz";
+        sha1 = "396cf9f3137f03e4b8e532c58f698254e00f80ec";
+      };
+    }
+    {
+      name = "css_color_names___css_color_names_0.0.4.tgz";
+      path = fetchurl {
+        name = "css_color_names___css_color_names_0.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz";
+        sha1 = "808adc2e79cf84738069b646cb20ec27beb629e0";
+      };
+    }
+    {
+      name = "css_color_names___css_color_names_1.0.1.tgz";
+      path = fetchurl {
+        name = "css_color_names___css_color_names_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/css-color-names/-/css-color-names-1.0.1.tgz";
+        sha1 = "6ff7ee81a823ad46e020fa2fd6ab40a887e2ba67";
+      };
+    }
+    {
+      name = "css_declaration_sorter___css_declaration_sorter_6.0.3.tgz";
+      path = fetchurl {
+        name = "css_declaration_sorter___css_declaration_sorter_6.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-6.0.3.tgz";
+        sha1 = "9dfd8ea0df4cc7846827876fafb52314890c21a9";
+      };
+    }
+    {
+      name = "css_loader___css_loader_3.6.0.tgz";
+      path = fetchurl {
+        name = "css_loader___css_loader_3.6.0.tgz";
+        url  = "https://registry.yarnpkg.com/css-loader/-/css-loader-3.6.0.tgz";
+        sha1 = "2e4b2c7e6e2d27f8c8f28f61bffcd2e6c91ef645";
+      };
+    }
+    {
+      name = "css_modules_require_hook___css_modules_require_hook_4.2.3.tgz";
+      path = fetchurl {
+        name = "css_modules_require_hook___css_modules_require_hook_4.2.3.tgz";
+        url  = "https://registry.yarnpkg.com/css-modules-require-hook/-/css-modules-require-hook-4.2.3.tgz";
+        sha1 = "6792ca412b15e23e6f9be6a07dcef7f577ff904d";
+      };
+    }
+    {
+      name = "css_select___css_select_3.1.2.tgz";
+      path = fetchurl {
+        name = "css_select___css_select_3.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/css-select/-/css-select-3.1.2.tgz";
+        sha1 = "d52cbdc6fee379fba97fb0d3925abbd18af2d9d8";
+      };
+    }
+    {
+      name = "css_selector_tokenizer___css_selector_tokenizer_0.7.1.tgz";
+      path = fetchurl {
+        name = "css_selector_tokenizer___css_selector_tokenizer_0.7.1.tgz";
+        url  = "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz";
+        sha1 = "a177271a8bca5019172f4f891fc6eed9cbf68d5d";
+      };
+    }
+    {
+      name = "css_tree___css_tree_1.1.3.tgz";
+      path = fetchurl {
+        name = "css_tree___css_tree_1.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz";
+        sha1 = "eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d";
+      };
+    }
+    {
+      name = "css_what___css_what_4.0.0.tgz";
+      path = fetchurl {
+        name = "css_what___css_what_4.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/css-what/-/css-what-4.0.0.tgz";
+        sha1 = "35e73761cab2eeb3d3661126b23d7aa0e8432233";
+      };
+    }
+    {
+      name = "cssesc___cssesc_0.1.0.tgz";
+      path = fetchurl {
+        name = "cssesc___cssesc_0.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/cssesc/-/cssesc-0.1.0.tgz";
+        sha1 = "c814903e45623371a0477b40109aaafbeeaddbb4";
+      };
+    }
+    {
+      name = "cssesc___cssesc_3.0.0.tgz";
+      path = fetchurl {
+        name = "cssesc___cssesc_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz";
+        sha1 = "37741919903b868565e1c09ea747445cd18983ee";
+      };
+    }
+    {
+      name = "cssnano_preset_default___cssnano_preset_default_5.1.3.tgz";
+      path = fetchurl {
+        name = "cssnano_preset_default___cssnano_preset_default_5.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-5.1.3.tgz";
+        sha1 = "caa54183a8c8df03124a9e23f374ab89df5a9a99";
+      };
+    }
+    {
+      name = "cssnano_utils___cssnano_utils_2.0.1.tgz";
+      path = fetchurl {
+        name = "cssnano_utils___cssnano_utils_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-2.0.1.tgz";
+        sha1 = "8660aa2b37ed869d2e2f22918196a9a8b6498ce2";
+      };
+    }
+    {
+      name = "cssnano___cssnano_5.0.6.tgz";
+      path = fetchurl {
+        name = "cssnano___cssnano_5.0.6.tgz";
+        url  = "https://registry.yarnpkg.com/cssnano/-/cssnano-5.0.6.tgz";
+        sha1 = "2a91ad34c6521ae31eab3da9c90108ea3093535d";
+      };
+    }
+    {
+      name = "csso___csso_4.2.0.tgz";
+      path = fetchurl {
+        name = "csso___csso_4.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz";
+        sha1 = "ea3a561346e8dc9f546d6febedd50187cf389529";
+      };
+    }
+    {
+      name = "cyclist___cyclist_1.0.1.tgz";
+      path = fetchurl {
+        name = "cyclist___cyclist_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz";
+        sha1 = "596e9698fd0c80e12038c2b82d6eb1b35b6224d9";
+      };
+    }
+    {
+      name = "d3_array___d3_array_1.2.4.tgz";
+      path = fetchurl {
+        name = "d3_array___d3_array_1.2.4.tgz";
+        url  = "https://registry.yarnpkg.com/d3-array/-/d3-array-1.2.4.tgz";
+        sha1 = "635ce4d5eea759f6f605863dbcfc30edc737f71f";
+      };
+    }
+    {
+      name = "d3_axis___d3_axis_1.0.12.tgz";
+      path = fetchurl {
+        name = "d3_axis___d3_axis_1.0.12.tgz";
+        url  = "https://registry.yarnpkg.com/d3-axis/-/d3-axis-1.0.12.tgz";
+        sha1 = "cdf20ba210cfbb43795af33756886fb3638daac9";
+      };
+    }
+    {
+      name = "d3_brush___d3_brush_1.1.5.tgz";
+      path = fetchurl {
+        name = "d3_brush___d3_brush_1.1.5.tgz";
+        url  = "https://registry.yarnpkg.com/d3-brush/-/d3-brush-1.1.5.tgz";
+        sha1 = "066b8e84d17b192986030446c97c0fba7e1bacdc";
+      };
+    }
+    {
+      name = "d3_chord___d3_chord_1.0.6.tgz";
+      path = fetchurl {
+        name = "d3_chord___d3_chord_1.0.6.tgz";
+        url  = "https://registry.yarnpkg.com/d3-chord/-/d3-chord-1.0.6.tgz";
+        sha1 = "309157e3f2db2c752f0280fedd35f2067ccbb15f";
+      };
+    }
+    {
+      name = "d3_collection___d3_collection_1.0.7.tgz";
+      path = fetchurl {
+        name = "d3_collection___d3_collection_1.0.7.tgz";
+        url  = "https://registry.yarnpkg.com/d3-collection/-/d3-collection-1.0.7.tgz";
+        sha1 = "349bd2aa9977db071091c13144d5e4f16b5b310e";
+      };
+    }
+    {
+      name = "d3_color___d3_color_1.4.0.tgz";
+      path = fetchurl {
+        name = "d3_color___d3_color_1.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/d3-color/-/d3-color-1.4.0.tgz";
+        sha1 = "89c45a995ed773b13314f06460df26d60ba0ecaf";
+      };
+    }
+    {
+      name = "d3_contour___d3_contour_1.3.2.tgz";
+      path = fetchurl {
+        name = "d3_contour___d3_contour_1.3.2.tgz";
+        url  = "https://registry.yarnpkg.com/d3-contour/-/d3-contour-1.3.2.tgz";
+        sha1 = "652aacd500d2264cb3423cee10db69f6f59bead3";
+      };
+    }
+    {
+      name = "d3_dispatch___d3_dispatch_1.0.6.tgz";
+      path = fetchurl {
+        name = "d3_dispatch___d3_dispatch_1.0.6.tgz";
+        url  = "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-1.0.6.tgz";
+        sha1 = "00d37bcee4dd8cd97729dd893a0ac29caaba5d58";
+      };
+    }
+    {
+      name = "d3_drag___d3_drag_1.2.5.tgz";
+      path = fetchurl {
+        name = "d3_drag___d3_drag_1.2.5.tgz";
+        url  = "https://registry.yarnpkg.com/d3-drag/-/d3-drag-1.2.5.tgz";
+        sha1 = "2537f451acd39d31406677b7dc77c82f7d988f70";
+      };
+    }
+    {
+      name = "d3_dsv___d3_dsv_1.2.0.tgz";
+      path = fetchurl {
+        name = "d3_dsv___d3_dsv_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/d3-dsv/-/d3-dsv-1.2.0.tgz";
+        sha1 = "9d5f75c3a5f8abd611f74d3f5847b0d4338b885c";
+      };
+    }
+    {
+      name = "d3_ease___d3_ease_1.0.6.tgz";
+      path = fetchurl {
+        name = "d3_ease___d3_ease_1.0.6.tgz";
+        url  = "https://registry.yarnpkg.com/d3-ease/-/d3-ease-1.0.6.tgz";
+        sha1 = "ebdb6da22dfac0a22222f2d4da06f66c416a0ec0";
+      };
+    }
+    {
+      name = "d3_fetch___d3_fetch_1.1.2.tgz";
+      path = fetchurl {
+        name = "d3_fetch___d3_fetch_1.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/d3-fetch/-/d3-fetch-1.1.2.tgz";
+        sha1 = "957c8fbc6d4480599ba191b1b2518bf86b3e1be2";
+      };
+    }
+    {
+      name = "d3_force___d3_force_1.2.1.tgz";
+      path = fetchurl {
+        name = "d3_force___d3_force_1.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/d3-force/-/d3-force-1.2.1.tgz";
+        sha1 = "fd29a5d1ff181c9e7f0669e4bd72bdb0e914ec0b";
+      };
+    }
+    {
+      name = "d3_format___d3_format_1.4.3.tgz";
+      path = fetchurl {
+        name = "d3_format___d3_format_1.4.3.tgz";
+        url  = "https://registry.yarnpkg.com/d3-format/-/d3-format-1.4.3.tgz";
+        sha1 = "4e8eb4dff3fdcb891a8489ec6e698601c41b96f1";
+      };
+    }
+    {
+      name = "d3_geo___d3_geo_1.11.9.tgz";
+      path = fetchurl {
+        name = "d3_geo___d3_geo_1.11.9.tgz";
+        url  = "https://registry.yarnpkg.com/d3-geo/-/d3-geo-1.11.9.tgz";
+        sha1 = "77eaed14ba62fc2c0aef55cd2943849c866f7ae6";
+      };
+    }
+    {
+      name = "d3_hierarchy___d3_hierarchy_1.1.9.tgz";
+      path = fetchurl {
+        name = "d3_hierarchy___d3_hierarchy_1.1.9.tgz";
+        url  = "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz";
+        sha1 = "2f6bee24caaea43f8dc37545fa01628559647a83";
+      };
+    }
+    {
+      name = "d3_interpolate___d3_interpolate_1.4.0.tgz";
+      path = fetchurl {
+        name = "d3_interpolate___d3_interpolate_1.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-1.4.0.tgz";
+        sha1 = "526e79e2d80daa383f9e0c1c1c7dcc0f0583e987";
+      };
+    }
+    {
+      name = "d3_path___d3_path_1.0.9.tgz";
+      path = fetchurl {
+        name = "d3_path___d3_path_1.0.9.tgz";
+        url  = "https://registry.yarnpkg.com/d3-path/-/d3-path-1.0.9.tgz";
+        sha1 = "48c050bb1fe8c262493a8caf5524e3e9591701cf";
+      };
+    }
+    {
+      name = "d3_path___d3_path_2.0.0.tgz";
+      path = fetchurl {
+        name = "d3_path___d3_path_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/d3-path/-/d3-path-2.0.0.tgz";
+        sha1 = "55d86ac131a0548adae241eebfb56b4582dd09d8";
+      };
+    }
+    {
+      name = "d3_polygon___d3_polygon_1.0.6.tgz";
+      path = fetchurl {
+        name = "d3_polygon___d3_polygon_1.0.6.tgz";
+        url  = "https://registry.yarnpkg.com/d3-polygon/-/d3-polygon-1.0.6.tgz";
+        sha1 = "0bf8cb8180a6dc107f518ddf7975e12abbfbd38e";
+      };
+    }
+    {
+      name = "d3_quadtree___d3_quadtree_1.0.7.tgz";
+      path = fetchurl {
+        name = "d3_quadtree___d3_quadtree_1.0.7.tgz";
+        url  = "https://registry.yarnpkg.com/d3-quadtree/-/d3-quadtree-1.0.7.tgz";
+        sha1 = "ca8b84df7bb53763fe3c2f24bd435137f4e53135";
+      };
+    }
+    {
+      name = "d3_random___d3_random_1.1.2.tgz";
+      path = fetchurl {
+        name = "d3_random___d3_random_1.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/d3-random/-/d3-random-1.1.2.tgz";
+        sha1 = "2833be7c124360bf9e2d3fd4f33847cfe6cab291";
+      };
+    }
+    {
+      name = "d3_scale_chromatic___d3_scale_chromatic_1.5.0.tgz";
+      path = fetchurl {
+        name = "d3_scale_chromatic___d3_scale_chromatic_1.5.0.tgz";
+        url  = "https://registry.yarnpkg.com/d3-scale-chromatic/-/d3-scale-chromatic-1.5.0.tgz";
+        sha1 = "54e333fc78212f439b14641fb55801dd81135a98";
+      };
+    }
+    {
+      name = "d3_scale___d3_scale_2.2.2.tgz";
+      path = fetchurl {
+        name = "d3_scale___d3_scale_2.2.2.tgz";
+        url  = "https://registry.yarnpkg.com/d3-scale/-/d3-scale-2.2.2.tgz";
+        sha1 = "4e880e0b2745acaaddd3ede26a9e908a9e17b81f";
+      };
+    }
+    {
+      name = "d3_selection___d3_selection_1.4.1.tgz";
+      path = fetchurl {
+        name = "d3_selection___d3_selection_1.4.1.tgz";
+        url  = "https://registry.yarnpkg.com/d3-selection/-/d3-selection-1.4.1.tgz";
+        sha1 = "98eedbbe085fbda5bafa2f9e3f3a2f4d7d622a98";
+      };
+    }
+    {
+      name = "d3_shape___d3_shape_1.3.7.tgz";
+      path = fetchurl {
+        name = "d3_shape___d3_shape_1.3.7.tgz";
+        url  = "https://registry.yarnpkg.com/d3-shape/-/d3-shape-1.3.7.tgz";
+        sha1 = "df63801be07bc986bc54f63789b4fe502992b5d7";
+      };
+    }
+    {
+      name = "d3_shape___d3_shape_2.1.0.tgz";
+      path = fetchurl {
+        name = "d3_shape___d3_shape_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/d3-shape/-/d3-shape-2.1.0.tgz";
+        sha1 = "3b6a82ccafbc45de55b57fcf956c584ded3b666f";
+      };
+    }
+    {
+      name = "d3_time_format___d3_time_format_2.2.3.tgz";
+      path = fetchurl {
+        name = "d3_time_format___d3_time_format_2.2.3.tgz";
+        url  = "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-2.2.3.tgz";
+        sha1 = "0c9a12ee28342b2037e5ea1cf0b9eb4dd75f29cb";
+      };
+    }
+    {
+      name = "d3_time___d3_time_1.1.0.tgz";
+      path = fetchurl {
+        name = "d3_time___d3_time_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/d3-time/-/d3-time-1.1.0.tgz";
+        sha1 = "b1e19d307dae9c900b7e5b25ffc5dcc249a8a0f1";
+      };
+    }
+    {
+      name = "d3_timer___d3_timer_1.0.10.tgz";
+      path = fetchurl {
+        name = "d3_timer___d3_timer_1.0.10.tgz";
+        url  = "https://registry.yarnpkg.com/d3-timer/-/d3-timer-1.0.10.tgz";
+        sha1 = "dfe76b8a91748831b13b6d9c793ffbd508dd9de5";
+      };
+    }
+    {
+      name = "d3_tip___d3_tip_0.9.1.tgz";
+      path = fetchurl {
+        name = "d3_tip___d3_tip_0.9.1.tgz";
+        url  = "https://registry.yarnpkg.com/d3-tip/-/d3-tip-0.9.1.tgz";
+        sha1 = "84e6d331c4e6650d80c5228a07e41820609ab64b";
+      };
+    }
+    {
+      name = "d3_transition___d3_transition_1.3.2.tgz";
+      path = fetchurl {
+        name = "d3_transition___d3_transition_1.3.2.tgz";
+        url  = "https://registry.yarnpkg.com/d3-transition/-/d3-transition-1.3.2.tgz";
+        sha1 = "a98ef2151be8d8600543434c1ca80140ae23b398";
+      };
+    }
+    {
+      name = "d3_voronoi___d3_voronoi_1.1.4.tgz";
+      path = fetchurl {
+        name = "d3_voronoi___d3_voronoi_1.1.4.tgz";
+        url  = "https://registry.yarnpkg.com/d3-voronoi/-/d3-voronoi-1.1.4.tgz";
+        sha1 = "dd3c78d7653d2bb359284ae478645d95944c8297";
+      };
+    }
+    {
+      name = "d3_zoom___d3_zoom_1.8.3.tgz";
+      path = fetchurl {
+        name = "d3_zoom___d3_zoom_1.8.3.tgz";
+        url  = "https://registry.yarnpkg.com/d3-zoom/-/d3-zoom-1.8.3.tgz";
+        sha1 = "b6a3dbe738c7763121cd05b8a7795ffe17f4fc0a";
+      };
+    }
+    {
+      name = "d3___d3_3.5.17.tgz";
+      path = fetchurl {
+        name = "d3___d3_3.5.17.tgz";
+        url  = "https://registry.yarnpkg.com/d3/-/d3-3.5.17.tgz";
+        sha1 = "bc46748004378b21a360c9fc7cf5231790762fb8";
+      };
+    }
+    {
+      name = "d3___d3_5.15.0.tgz";
+      path = fetchurl {
+        name = "d3___d3_5.15.0.tgz";
+        url  = "https://registry.yarnpkg.com/d3/-/d3-5.15.0.tgz";
+        sha1 = "ffd44958e6a3cb8a59a84429c45429b8bca5677a";
+      };
+    }
+    {
+      name = "dagre_d3___dagre_d3_0.6.4.tgz";
+      path = fetchurl {
+        name = "dagre_d3___dagre_d3_0.6.4.tgz";
+        url  = "https://registry.yarnpkg.com/dagre-d3/-/dagre-d3-0.6.4.tgz";
+        sha1 = "0728d5ce7f177ca2337df141ceb60fbe6eeb7b29";
+      };
+    }
+    {
+      name = "dagre___dagre_0.8.5.tgz";
+      path = fetchurl {
+        name = "dagre___dagre_0.8.5.tgz";
+        url  = "https://registry.yarnpkg.com/dagre/-/dagre-0.8.5.tgz";
+        sha1 = "ba30b0055dac12b6c1fcc247817442777d06afee";
+      };
+    }
+    {
+      name = "datatables.net_bs___datatables.net_bs_1.10.23.tgz";
+      path = fetchurl {
+        name = "datatables.net_bs___datatables.net_bs_1.10.23.tgz";
+        url  = "https://registry.yarnpkg.com/datatables.net-bs/-/datatables.net-bs-1.10.23.tgz";
+        sha1 = "985094ea63b28c630de4a0ecb75804ab53341fb0";
+      };
+    }
+    {
+      name = "datatables.net___datatables.net_1.10.23.tgz";
+      path = fetchurl {
+        name = "datatables.net___datatables.net_1.10.23.tgz";
+        url  = "https://registry.yarnpkg.com/datatables.net/-/datatables.net-1.10.23.tgz";
+        sha1 = "59f7d7b12845183b1b379530d1385077e113ec01";
+      };
+    }
+    {
+      name = "date_now___date_now_0.1.4.tgz";
+      path = fetchurl {
+        name = "date_now___date_now_0.1.4.tgz";
+        url  = "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz";
+        sha1 = "eaf439fd4d4848ad74e5cc7dbef200672b9e345b";
+      };
+    }
+    {
+      name = "debug___debug_2.6.9.tgz";
+      path = fetchurl {
+        name = "debug___debug_2.6.9.tgz";
+        url  = "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz";
+        sha1 = "5d128515df134ff327e90a4c93f4e077a536341f";
+      };
+    }
+    {
+      name = "debug___debug_4.3.1.tgz";
+      path = fetchurl {
+        name = "debug___debug_4.3.1.tgz";
+        url  = "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz";
+        sha1 = "f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee";
+      };
+    }
+    {
+      name = "debug___debug_4.1.1.tgz";
+      path = fetchurl {
+        name = "debug___debug_4.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz";
+        sha1 = "3b72260255109c6b589cee050f1d516139664791";
+      };
+    }
+    {
+      name = "decamelize_keys___decamelize_keys_1.1.0.tgz";
+      path = fetchurl {
+        name = "decamelize_keys___decamelize_keys_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz";
+        sha1 = "d171a87933252807eb3cb61dc1c1445d078df2d9";
+      };
+    }
+    {
+      name = "decamelize___decamelize_1.2.0.tgz";
+      path = fetchurl {
+        name = "decamelize___decamelize_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz";
+        sha1 = "f6534d15148269b20352e7bee26f501f9a191290";
+      };
+    }
+    {
+      name = "decko___decko_1.2.0.tgz";
+      path = fetchurl {
+        name = "decko___decko_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/decko/-/decko-1.2.0.tgz";
+        sha1 = "fd43c735e967b8013306884a56fbe665996b6817";
+      };
+    }
+    {
+      name = "decode_uri_component___decode_uri_component_0.2.0.tgz";
+      path = fetchurl {
+        name = "decode_uri_component___decode_uri_component_0.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz";
+        sha1 = "eb3913333458775cb84cd1a1fae062106bb87545";
+      };
+    }
+    {
+      name = "deep_is___deep_is_0.1.3.tgz";
+      path = fetchurl {
+        name = "deep_is___deep_is_0.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz";
+        sha1 = "b369d6fb5dbc13eecf524f91b070feedc357cf34";
+      };
+    }
+    {
+      name = "define_properties___define_properties_1.1.3.tgz";
+      path = fetchurl {
+        name = "define_properties___define_properties_1.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz";
+        sha1 = "cf88da6cbee26fe6db7094f61d870cbd84cee9f1";
+      };
+    }
+    {
+      name = "define_property___define_property_0.2.5.tgz";
+      path = fetchurl {
+        name = "define_property___define_property_0.2.5.tgz";
+        url  = "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz";
+        sha1 = "c35b1ef918ec3c990f9a5bc57be04aacec5c8116";
+      };
+    }
+    {
+      name = "define_property___define_property_1.0.0.tgz";
+      path = fetchurl {
+        name = "define_property___define_property_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz";
+        sha1 = "769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6";
+      };
+    }
+    {
+      name = "define_property___define_property_2.0.2.tgz";
+      path = fetchurl {
+        name = "define_property___define_property_2.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz";
+        sha1 = "d459689e8d654ba77e02a817f8710d702cb16e9d";
+      };
+    }
+    {
+      name = "del___del_4.1.1.tgz";
+      path = fetchurl {
+        name = "del___del_4.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz";
+        sha1 = "9e8f117222ea44a31ff3a156c049b99052a9f0b4";
+      };
+    }
+    {
+      name = "delegate___delegate_3.2.0.tgz";
+      path = fetchurl {
+        name = "delegate___delegate_3.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/delegate/-/delegate-3.2.0.tgz";
+        sha1 = "b66b71c3158522e8ab5744f720d8ca0c2af59166";
+      };
+    }
+    {
+      name = "des.js___des.js_1.0.1.tgz";
+      path = fetchurl {
+        name = "des.js___des.js_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz";
+        sha1 = "5382142e1bdc53f85d86d53e5f4aa7deb91e0843";
+      };
+    }
+    {
+      name = "detect_file___detect_file_1.0.0.tgz";
+      path = fetchurl {
+        name = "detect_file___detect_file_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz";
+        sha1 = "f0d66d03672a825cb1b73bdb3fe62310c8e552b7";
+      };
+    }
+    {
+      name = "detect_indent___detect_indent_4.0.0.tgz";
+      path = fetchurl {
+        name = "detect_indent___detect_indent_4.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz";
+        sha1 = "f76d064352cdf43a1cb6ce619c4ee3a9475de208";
+      };
+    }
+    {
+      name = "diffie_hellman___diffie_hellman_5.0.3.tgz";
+      path = fetchurl {
+        name = "diffie_hellman___diffie_hellman_5.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz";
+        sha1 = "40e8ee98f55a2149607146921c63e1ae5f3d2875";
+      };
+    }
+    {
+      name = "dir_glob___dir_glob_3.0.1.tgz";
+      path = fetchurl {
+        name = "dir_glob___dir_glob_3.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz";
+        sha1 = "56dbf73d992a4a93ba1584f4534063fd2e41717f";
+      };
+    }
+    {
+      name = "doctrine___doctrine_1.5.0.tgz";
+      path = fetchurl {
+        name = "doctrine___doctrine_1.5.0.tgz";
+        url  = "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz";
+        sha1 = "379dce730f6166f76cefa4e6707a159b02c5a6fa";
+      };
+    }
+    {
+      name = "doctrine___doctrine_3.0.0.tgz";
+      path = fetchurl {
+        name = "doctrine___doctrine_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz";
+        sha1 = "addebead72a6574db783639dc87a121773973961";
+      };
+    }
+    {
+      name = "dom_serializer___dom_serializer_0.2.2.tgz";
+      path = fetchurl {
+        name = "dom_serializer___dom_serializer_0.2.2.tgz";
+        url  = "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz";
+        sha1 = "1afb81f533717175d478655debc5e332d9f9bb51";
+      };
+    }
+    {
+      name = "dom_serializer___dom_serializer_1.3.2.tgz";
+      path = fetchurl {
+        name = "dom_serializer___dom_serializer_1.3.2.tgz";
+        url  = "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.3.2.tgz";
+        sha1 = "6206437d32ceefaec7161803230c7a20bc1b4d91";
+      };
+    }
+    {
+      name = "domain_browser___domain_browser_1.2.0.tgz";
+      path = fetchurl {
+        name = "domain_browser___domain_browser_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz";
+        sha1 = "3d31f50191a6749dd1375a7f522e823d42e54eda";
+      };
+    }
+    {
+      name = "domelementtype___domelementtype_1.3.1.tgz";
+      path = fetchurl {
+        name = "domelementtype___domelementtype_1.3.1.tgz";
+        url  = "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz";
+        sha1 = "d048c44b37b0d10a7f2a3d5fee3f4333d790481f";
+      };
+    }
+    {
+      name = "domelementtype___domelementtype_2.2.0.tgz";
+      path = fetchurl {
+        name = "domelementtype___domelementtype_2.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz";
+        sha1 = "9a0b6c2782ed6a1c7323d42267183df9bd8b1d57";
+      };
+    }
+    {
+      name = "domhandler___domhandler_2.3.0.tgz";
+      path = fetchurl {
+        name = "domhandler___domhandler_2.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/domhandler/-/domhandler-2.3.0.tgz";
+        sha1 = "2de59a0822d5027fabff6f032c2b25a2a8abe738";
+      };
+    }
+    {
+      name = "domhandler___domhandler_2.4.2.tgz";
+      path = fetchurl {
+        name = "domhandler___domhandler_2.4.2.tgz";
+        url  = "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz";
+        sha1 = "8805097e933d65e85546f726d60f5eb88b44f803";
+      };
+    }
+    {
+      name = "domhandler___domhandler_3.0.0.tgz";
+      path = fetchurl {
+        name = "domhandler___domhandler_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/domhandler/-/domhandler-3.0.0.tgz";
+        sha1 = "51cd13efca31da95bbb0c5bee3a48300e333b3e9";
+      };
+    }
+    {
+      name = "domhandler___domhandler_4.2.0.tgz";
+      path = fetchurl {
+        name = "domhandler___domhandler_4.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/domhandler/-/domhandler-4.2.0.tgz";
+        sha1 = "f9768a5f034be60a89a27c2e4d0f74eba0d8b059";
+      };
+    }
+    {
+      name = "dompurify___dompurify_2.2.6.tgz";
+      path = fetchurl {
+        name = "dompurify___dompurify_2.2.6.tgz";
+        url  = "https://registry.yarnpkg.com/dompurify/-/dompurify-2.2.6.tgz";
+        sha1 = "54945dc5c0b45ce5ae228705777e8e59d7b2edc4";
+      };
+    }
+    {
+      name = "domutils___domutils_1.5.1.tgz";
+      path = fetchurl {
+        name = "domutils___domutils_1.5.1.tgz";
+        url  = "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz";
+        sha1 = "dcd8488a26f563d61079e48c9f7b7e32373682cf";
+      };
+    }
+    {
+      name = "domutils___domutils_1.7.0.tgz";
+      path = fetchurl {
+        name = "domutils___domutils_1.7.0.tgz";
+        url  = "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz";
+        sha1 = "56ea341e834e06e6748af7a1cb25da67ea9f8c2a";
+      };
+    }
+    {
+      name = "domutils___domutils_2.1.0.tgz";
+      path = fetchurl {
+        name = "domutils___domutils_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/domutils/-/domutils-2.1.0.tgz";
+        sha1 = "7ade3201af43703fde154952e3a868eb4b635f16";
+      };
+    }
+    {
+      name = "domutils___domutils_2.7.0.tgz";
+      path = fetchurl {
+        name = "domutils___domutils_2.7.0.tgz";
+        url  = "https://registry.yarnpkg.com/domutils/-/domutils-2.7.0.tgz";
+        sha1 = "8ebaf0c41ebafcf55b0b72ec31c56323712c5442";
+      };
+    }
+    {
+      name = "duplexify___duplexify_3.7.1.tgz";
+      path = fetchurl {
+        name = "duplexify___duplexify_3.7.1.tgz";
+        url  = "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz";
+        sha1 = "2a4df5317f6ccfd91f86d6fd25d8d8a103b88309";
+      };
+    }
+    {
+      name = "electron_to_chromium___electron_to_chromium_1.3.580.tgz";
+      path = fetchurl {
+        name = "electron_to_chromium___electron_to_chromium_1.3.580.tgz";
+        url  = "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.580.tgz";
+        sha1 = "eb27873cfa012c43c53c9e9129038b8fd7cb964f";
+      };
+    }
+    {
+      name = "electron_to_chromium___electron_to_chromium_1.3.727.tgz";
+      path = fetchurl {
+        name = "electron_to_chromium___electron_to_chromium_1.3.727.tgz";
+        url  = "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.727.tgz";
+        sha1 = "857e310ca00f0b75da4e1db6ff0e073cc4a91ddf";
+      };
+    }
+    {
+      name = "elliptic___elliptic_6.5.4.tgz";
+      path = fetchurl {
+        name = "elliptic___elliptic_6.5.4.tgz";
+        url  = "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz";
+        sha1 = "da37cebd31e79a1367e941b592ed1fbebd58abbb";
+      };
+    }
+    {
+      name = "emoji_regex___emoji_regex_7.0.3.tgz";
+      path = fetchurl {
+        name = "emoji_regex___emoji_regex_7.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz";
+        sha1 = "933a04052860c85e83c122479c4748a8e4c72156";
+      };
+    }
+    {
+      name = "emoji_regex___emoji_regex_8.0.0.tgz";
+      path = fetchurl {
+        name = "emoji_regex___emoji_regex_8.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz";
+        sha1 = "e818fd69ce5ccfcb404594f842963bf53164cc37";
+      };
+    }
+    {
+      name = "emojis_list___emojis_list_2.1.0.tgz";
+      path = fetchurl {
+        name = "emojis_list___emojis_list_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz";
+        sha1 = "4daa4d9db00f9819880c79fa457ae5b09a1fd389";
+      };
+    }
+    {
+      name = "emojis_list___emojis_list_3.0.0.tgz";
+      path = fetchurl {
+        name = "emojis_list___emojis_list_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz";
+        sha1 = "5570662046ad29e2e916e71aae260abdff4f6a78";
+      };
+    }
+    {
+      name = "end_of_stream___end_of_stream_1.4.4.tgz";
+      path = fetchurl {
+        name = "end_of_stream___end_of_stream_1.4.4.tgz";
+        url  = "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz";
+        sha1 = "5ae64a5f45057baf3626ec14da0ca5e4b2431eb0";
+      };
+    }
+    {
+      name = "enhanced_resolve___enhanced_resolve_4.3.0.tgz";
+      path = fetchurl {
+        name = "enhanced_resolve___enhanced_resolve_4.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz";
+        sha1 = "3b806f3bfafc1ec7de69551ef93cca46c1704126";
+      };
+    }
+    {
+      name = "enquirer___enquirer_2.3.6.tgz";
+      path = fetchurl {
+        name = "enquirer___enquirer_2.3.6.tgz";
+        url  = "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz";
+        sha1 = "2a7fe5dd634a1e4125a975ec994ff5456dc3734d";
+      };
+    }
+    {
+      name = "entities___entities_1.0.0.tgz";
+      path = fetchurl {
+        name = "entities___entities_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/entities/-/entities-1.0.0.tgz";
+        sha1 = "b2987aa3821347fcde642b24fdfc9e4fb712bf26";
+      };
+    }
+    {
+      name = "entities___entities_1.1.2.tgz";
+      path = fetchurl {
+        name = "entities___entities_1.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz";
+        sha1 = "bdfa735299664dfafd34529ed4f8522a275fea56";
+      };
+    }
+    {
+      name = "entities___entities_2.2.0.tgz";
+      path = fetchurl {
+        name = "entities___entities_2.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz";
+        sha1 = "098dc90ebb83d8dffa089d55256b351d34c4da55";
+      };
+    }
+    {
+      name = "eonasdan_bootstrap_datetimepicker___eonasdan_bootstrap_datetimepicker_4.17.47.tgz";
+      path = fetchurl {
+        name = "eonasdan_bootstrap_datetimepicker___eonasdan_bootstrap_datetimepicker_4.17.47.tgz";
+        url  = "https://registry.yarnpkg.com/eonasdan-bootstrap-datetimepicker/-/eonasdan-bootstrap-datetimepicker-4.17.47.tgz";
+        sha1 = "7a49970044065276e7965efd16f822735219e735";
+      };
+    }
+    {
+      name = "errno___errno_0.1.7.tgz";
+      path = fetchurl {
+        name = "errno___errno_0.1.7.tgz";
+        url  = "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz";
+        sha1 = "4684d71779ad39af177e3f007996f7c67c852618";
+      };
+    }
+    {
+      name = "error_ex___error_ex_1.3.2.tgz";
+      path = fetchurl {
+        name = "error_ex___error_ex_1.3.2.tgz";
+        url  = "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz";
+        sha1 = "b4ac40648107fdcdcfae242f428bea8a14d4f1bf";
+      };
+    }
+    {
+      name = "es_abstract___es_abstract_1.17.6.tgz";
+      path = fetchurl {
+        name = "es_abstract___es_abstract_1.17.6.tgz";
+        url  = "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.6.tgz";
+        sha1 = "9142071707857b2cacc7b89ecb670316c3e2d52a";
+      };
+    }
+    {
+      name = "es_abstract___es_abstract_1.17.0_next.1.tgz";
+      path = fetchurl {
+        name = "es_abstract___es_abstract_1.17.0_next.1.tgz";
+        url  = "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.0-next.1.tgz";
+        sha1 = "94acc93e20b05a6e96dacb5ab2f1cb3a81fc2172";
+      };
+    }
+    {
+      name = "es_to_primitive___es_to_primitive_1.2.1.tgz";
+      path = fetchurl {
+        name = "es_to_primitive___es_to_primitive_1.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz";
+        sha1 = "e55cd4c9cdc188bcefb03b366c736323fc5c898a";
+      };
+    }
+    {
+      name = "es6_promise___es6_promise_3.3.1.tgz";
+      path = fetchurl {
+        name = "es6_promise___es6_promise_3.3.1.tgz";
+        url  = "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz";
+        sha1 = "a08cdde84ccdbf34d027a1451bc91d4bcd28a613";
+      };
+    }
+    {
+      name = "escalade___escalade_3.1.1.tgz";
+      path = fetchurl {
+        name = "escalade___escalade_3.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz";
+        sha1 = "d8cfdc7000965c5a0174b4a82eaa5c0552742e40";
+      };
+    }
+    {
+      name = "escape_string_regexp___escape_string_regexp_1.0.5.tgz";
+      path = fetchurl {
+        name = "escape_string_regexp___escape_string_regexp_1.0.5.tgz";
+        url  = "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz";
+        sha1 = "1b61c0562190a8dff6ae3bb2cf0200ca130b86d4";
+      };
+    }
+    {
+      name = "eslint_config_airbnb_base___eslint_config_airbnb_base_14.2.0.tgz";
+      path = fetchurl {
+        name = "eslint_config_airbnb_base___eslint_config_airbnb_base_14.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.0.tgz";
+        sha1 = "fe89c24b3f9dc8008c9c0d0d88c28f95ed65e9c4";
+      };
+    }
+    {
+      name = "eslint_import_resolver_node___eslint_import_resolver_node_0.3.4.tgz";
+      path = fetchurl {
+        name = "eslint_import_resolver_node___eslint_import_resolver_node_0.3.4.tgz";
+        url  = "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz";
+        sha1 = "85ffa81942c25012d8231096ddf679c03042c717";
+      };
+    }
+    {
+      name = "eslint_module_utils___eslint_module_utils_2.6.0.tgz";
+      path = fetchurl {
+        name = "eslint_module_utils___eslint_module_utils_2.6.0.tgz";
+        url  = "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz";
+        sha1 = "579ebd094f56af7797d19c9866c9c9486629bfa6";
+      };
+    }
+    {
+      name = "eslint_plugin_es___eslint_plugin_es_3.0.1.tgz";
+      path = fetchurl {
+        name = "eslint_plugin_es___eslint_plugin_es_3.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz";
+        sha1 = "75a7cdfdccddc0589934aeeb384175f221c57893";
+      };
+    }
+    {
+      name = "eslint_plugin_html___eslint_plugin_html_6.0.2.tgz";
+      path = fetchurl {
+        name = "eslint_plugin_html___eslint_plugin_html_6.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/eslint-plugin-html/-/eslint-plugin-html-6.0.2.tgz";
+        sha1 = "fcbd293e218d03dd72c147fc999d185c6f5989fe";
+      };
+    }
+    {
+      name = "eslint_plugin_import___eslint_plugin_import_2.22.0.tgz";
+      path = fetchurl {
+        name = "eslint_plugin_import___eslint_plugin_import_2.22.0.tgz";
+        url  = "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.22.0.tgz";
+        sha1 = "92f7736fe1fde3e2de77623c838dd992ff5ffb7e";
+      };
+    }
+    {
+      name = "eslint_plugin_node___eslint_plugin_node_11.1.0.tgz";
+      path = fetchurl {
+        name = "eslint_plugin_node___eslint_plugin_node_11.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz";
+        sha1 = "c95544416ee4ada26740a30474eefc5402dc671d";
+      };
+    }
+    {
+      name = "eslint_plugin_promise___eslint_plugin_promise_4.2.1.tgz";
+      path = fetchurl {
+        name = "eslint_plugin_promise___eslint_plugin_promise_4.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-4.2.1.tgz";
+        sha1 = "845fd8b2260ad8f82564c1222fce44ad71d9418a";
+      };
+    }
+    {
+      name = "eslint_plugin_standard___eslint_plugin_standard_4.0.1.tgz";
+      path = fetchurl {
+        name = "eslint_plugin_standard___eslint_plugin_standard_4.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-4.0.1.tgz";
+        sha1 = "ff0519f7ffaff114f76d1bd7c3996eef0f6e20b4";
+      };
+    }
+    {
+      name = "eslint_scope___eslint_scope_4.0.3.tgz";
+      path = fetchurl {
+        name = "eslint_scope___eslint_scope_4.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz";
+        sha1 = "ca03833310f6889a3264781aa82e63eb9cfe7848";
+      };
+    }
+    {
+      name = "eslint_scope___eslint_scope_5.1.0.tgz";
+      path = fetchurl {
+        name = "eslint_scope___eslint_scope_5.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.0.tgz";
+        sha1 = "d0f971dfe59c69e0cada684b23d49dbf82600ce5";
+      };
+    }
+    {
+      name = "eslint_utils___eslint_utils_2.1.0.tgz";
+      path = fetchurl {
+        name = "eslint_utils___eslint_utils_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz";
+        sha1 = "d2de5e03424e707dc10c74068ddedae708741b27";
+      };
+    }
+    {
+      name = "eslint_visitor_keys___eslint_visitor_keys_1.1.0.tgz";
+      path = fetchurl {
+        name = "eslint_visitor_keys___eslint_visitor_keys_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz";
+        sha1 = "e2a82cea84ff246ad6fb57f9bde5b46621459ec2";
+      };
+    }
+    {
+      name = "eslint_visitor_keys___eslint_visitor_keys_1.3.0.tgz";
+      path = fetchurl {
+        name = "eslint_visitor_keys___eslint_visitor_keys_1.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz";
+        sha1 = "30ebd1ef7c2fdff01c3a4f151044af25fab0523e";
+      };
+    }
+    {
+      name = "eslint___eslint_7.5.0.tgz";
+      path = fetchurl {
+        name = "eslint___eslint_7.5.0.tgz";
+        url  = "https://registry.yarnpkg.com/eslint/-/eslint-7.5.0.tgz";
+        sha1 = "9ecbfad62216d223b82ac9ffea7ef3444671d135";
+      };
+    }
+    {
+      name = "espree___espree_7.2.0.tgz";
+      path = fetchurl {
+        name = "espree___espree_7.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/espree/-/espree-7.2.0.tgz";
+        sha1 = "1c263d5b513dbad0ac30c4991b93ac354e948d69";
+      };
+    }
+    {
+      name = "esprima___esprima_4.0.1.tgz";
+      path = fetchurl {
+        name = "esprima___esprima_4.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz";
+        sha1 = "13b04cdb3e6c5d19df91ab6987a8695619b0aa71";
+      };
+    }
+    {
+      name = "esquery___esquery_1.3.1.tgz";
+      path = fetchurl {
+        name = "esquery___esquery_1.3.1.tgz";
+        url  = "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz";
+        sha1 = "b78b5828aa8e214e29fb74c4d5b752e1c033da57";
+      };
+    }
+    {
+      name = "esrecurse___esrecurse_4.2.1.tgz";
+      path = fetchurl {
+        name = "esrecurse___esrecurse_4.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz";
+        sha1 = "007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf";
+      };
+    }
+    {
+      name = "estraverse___estraverse_4.3.0.tgz";
+      path = fetchurl {
+        name = "estraverse___estraverse_4.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz";
+        sha1 = "398ad3f3c5a24948be7725e83d11a7de28cdbd1d";
+      };
+    }
+    {
+      name = "estraverse___estraverse_5.1.0.tgz";
+      path = fetchurl {
+        name = "estraverse___estraverse_5.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/estraverse/-/estraverse-5.1.0.tgz";
+        sha1 = "374309d39fd935ae500e7b92e8a6b4c720e59642";
+      };
+    }
+    {
+      name = "esutils___esutils_2.0.3.tgz";
+      path = fetchurl {
+        name = "esutils___esutils_2.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz";
+        sha1 = "74d2eb4de0b8da1293711910d50775b9b710ef64";
+      };
+    }
+    {
+      name = "eventemitter3___eventemitter3_4.0.7.tgz";
+      path = fetchurl {
+        name = "eventemitter3___eventemitter3_4.0.7.tgz";
+        url  = "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz";
+        sha1 = "2de9b68f6528d5644ef5c59526a1b4a07306169f";
+      };
+    }
+    {
+      name = "events___events_3.2.0.tgz";
+      path = fetchurl {
+        name = "events___events_3.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/events/-/events-3.2.0.tgz";
+        sha1 = "93b87c18f8efcd4202a461aec4dfc0556b639379";
+      };
+    }
+    {
+      name = "evp_bytestokey___evp_bytestokey_1.0.3.tgz";
+      path = fetchurl {
+        name = "evp_bytestokey___evp_bytestokey_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz";
+        sha1 = "7fcbdb198dc71959432efe13842684e0525acb02";
+      };
+    }
+    {
+      name = "execall___execall_2.0.0.tgz";
+      path = fetchurl {
+        name = "execall___execall_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/execall/-/execall-2.0.0.tgz";
+        sha1 = "16a06b5fe5099df7d00be5d9c06eecded1663b45";
+      };
+    }
+    {
+      name = "exit___exit_0.1.2.tgz";
+      path = fetchurl {
+        name = "exit___exit_0.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz";
+        sha1 = "0632638f8d877cc82107d30a0fff1a17cba1cd0c";
+      };
+    }
+    {
+      name = "expand_brackets___expand_brackets_2.1.4.tgz";
+      path = fetchurl {
+        name = "expand_brackets___expand_brackets_2.1.4.tgz";
+        url  = "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz";
+        sha1 = "b77735e315ce30f6b6eff0f83b04151a22449622";
+      };
+    }
+    {
+      name = "expand_tilde___expand_tilde_2.0.2.tgz";
+      path = fetchurl {
+        name = "expand_tilde___expand_tilde_2.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz";
+        sha1 = "97e801aa052df02454de46b02bf621642cdc8502";
+      };
+    }
+    {
+      name = "extend_shallow___extend_shallow_2.0.1.tgz";
+      path = fetchurl {
+        name = "extend_shallow___extend_shallow_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz";
+        sha1 = "51af7d614ad9a9f610ea1bafbb989d6b1c56890f";
+      };
+    }
+    {
+      name = "extend_shallow___extend_shallow_3.0.2.tgz";
+      path = fetchurl {
+        name = "extend_shallow___extend_shallow_3.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz";
+        sha1 = "26a71aaf073b39fb2127172746131c2704028db8";
+      };
+    }
+    {
+      name = "extend___extend_3.0.2.tgz";
+      path = fetchurl {
+        name = "extend___extend_3.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz";
+        sha1 = "f8b1136b4071fbd8eb140aff858b1019ec2915fa";
+      };
+    }
+    {
+      name = "extglob___extglob_2.0.4.tgz";
+      path = fetchurl {
+        name = "extglob___extglob_2.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz";
+        sha1 = "ad00fe4dc612a9232e8718711dc5cb5ab0285543";
+      };
+    }
+    {
+      name = "fast_deep_equal___fast_deep_equal_1.1.0.tgz";
+      path = fetchurl {
+        name = "fast_deep_equal___fast_deep_equal_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz";
+        sha1 = "c053477817c86b51daa853c81e059b733d023614";
+      };
+    }
+    {
+      name = "fast_deep_equal___fast_deep_equal_3.1.3.tgz";
+      path = fetchurl {
+        name = "fast_deep_equal___fast_deep_equal_3.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz";
+        sha1 = "3a7d56b559d6cbc3eb512325244e619a65c6c525";
+      };
+    }
+    {
+      name = "fast_glob___fast_glob_3.2.5.tgz";
+      path = fetchurl {
+        name = "fast_glob___fast_glob_3.2.5.tgz";
+        url  = "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.5.tgz";
+        sha1 = "7939af2a656de79a4f1901903ee8adcaa7cb9661";
+      };
+    }
+    {
+      name = "fast_glob___fast_glob_3.2.4.tgz";
+      path = fetchurl {
+        name = "fast_glob___fast_glob_3.2.4.tgz";
+        url  = "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.4.tgz";
+        sha1 = "d20aefbf99579383e7f3cc66529158c9b98554d3";
+      };
+    }
+    {
+      name = "fast_json_stable_stringify___fast_json_stable_stringify_2.1.0.tgz";
+      path = fetchurl {
+        name = "fast_json_stable_stringify___fast_json_stable_stringify_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz";
+        sha1 = "874bf69c6f404c2b5d99c481341399fd55892633";
+      };
+    }
+    {
+      name = "fast_levenshtein___fast_levenshtein_2.0.6.tgz";
+      path = fetchurl {
+        name = "fast_levenshtein___fast_levenshtein_2.0.6.tgz";
+        url  = "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz";
+        sha1 = "3d8a5c66883a16a30ca8643e851f19baa7797917";
+      };
+    }
+    {
+      name = "fast_safe_stringify___fast_safe_stringify_2.0.7.tgz";
+      path = fetchurl {
+        name = "fast_safe_stringify___fast_safe_stringify_2.0.7.tgz";
+        url  = "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz";
+        sha1 = "124aa885899261f68aedb42a7c080de9da608743";
+      };
+    }
+    {
+      name = "fastest_levenshtein___fastest_levenshtein_1.0.12.tgz";
+      path = fetchurl {
+        name = "fastest_levenshtein___fastest_levenshtein_1.0.12.tgz";
+        url  = "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz";
+        sha1 = "9990f7d3a88cc5a9ffd1f1745745251700d497e2";
+      };
+    }
+    {
+      name = "fastparse___fastparse_1.1.2.tgz";
+      path = fetchurl {
+        name = "fastparse___fastparse_1.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.2.tgz";
+        sha1 = "91728c5a5942eced8531283c79441ee4122c35a9";
+      };
+    }
+    {
+      name = "fastq___fastq_1.11.0.tgz";
+      path = fetchurl {
+        name = "fastq___fastq_1.11.0.tgz";
+        url  = "https://registry.yarnpkg.com/fastq/-/fastq-1.11.0.tgz";
+        sha1 = "bb9fb955a07130a918eb63c1f5161cc32a5d0858";
+      };
+    }
+    {
+      name = "figgy_pudding___figgy_pudding_3.5.2.tgz";
+      path = fetchurl {
+        name = "figgy_pudding___figgy_pudding_3.5.2.tgz";
+        url  = "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz";
+        sha1 = "b4eee8148abb01dcf1d1ac34367d59e12fa61d6e";
+      };
+    }
+    {
+      name = "file_entry_cache___file_entry_cache_5.0.1.tgz";
+      path = fetchurl {
+        name = "file_entry_cache___file_entry_cache_5.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz";
+        sha1 = "ca0f6efa6dd3d561333fb14515065c2fafdf439c";
+      };
+    }
+    {
+      name = "file_entry_cache___file_entry_cache_6.0.1.tgz";
+      path = fetchurl {
+        name = "file_entry_cache___file_entry_cache_6.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz";
+        sha1 = "211b2dd9659cb0394b073e7323ac3c933d522027";
+      };
+    }
+    {
+      name = "file_loader___file_loader_6.0.0.tgz";
+      path = fetchurl {
+        name = "file_loader___file_loader_6.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/file-loader/-/file-loader-6.0.0.tgz";
+        sha1 = "97bbfaab7a2460c07bcbd72d3a6922407f67649f";
+      };
+    }
+    {
+      name = "file_uri_to_path___file_uri_to_path_1.0.0.tgz";
+      path = fetchurl {
+        name = "file_uri_to_path___file_uri_to_path_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz";
+        sha1 = "553a7b8446ff6f684359c445f1e37a05dacc33dd";
+      };
+    }
+    {
+      name = "fill_range___fill_range_4.0.0.tgz";
+      path = fetchurl {
+        name = "fill_range___fill_range_4.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz";
+        sha1 = "d544811d428f98eb06a63dc402d2403c328c38f7";
+      };
+    }
+    {
+      name = "fill_range___fill_range_7.0.1.tgz";
+      path = fetchurl {
+        name = "fill_range___fill_range_7.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz";
+        sha1 = "1919a6a7c75fe38b2c7c77e5198535da9acdda40";
+      };
+    }
+    {
+      name = "find_cache_dir___find_cache_dir_2.1.0.tgz";
+      path = fetchurl {
+        name = "find_cache_dir___find_cache_dir_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz";
+        sha1 = "8d0f94cd13fe43c6c7c261a0d86115ca918c05f7";
+      };
+    }
+    {
+      name = "find_cache_dir___find_cache_dir_3.3.1.tgz";
+      path = fetchurl {
+        name = "find_cache_dir___find_cache_dir_3.3.1.tgz";
+        url  = "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz";
+        sha1 = "89b33fad4a4670daa94f855f7fbe31d6d84fe880";
+      };
+    }
+    {
+      name = "find_up___find_up_2.1.0.tgz";
+      path = fetchurl {
+        name = "find_up___find_up_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz";
+        sha1 = "45d1b7e506c717ddd482775a2b77920a3c0c57a7";
+      };
+    }
+    {
+      name = "find_up___find_up_3.0.0.tgz";
+      path = fetchurl {
+        name = "find_up___find_up_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz";
+        sha1 = "49169f1d7993430646da61ecc5ae355c21c97b73";
+      };
+    }
+    {
+      name = "find_up___find_up_4.1.0.tgz";
+      path = fetchurl {
+        name = "find_up___find_up_4.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz";
+        sha1 = "97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19";
+      };
+    }
+    {
+      name = "findup_sync___findup_sync_3.0.0.tgz";
+      path = fetchurl {
+        name = "findup_sync___findup_sync_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/findup-sync/-/findup-sync-3.0.0.tgz";
+        sha1 = "17b108f9ee512dfb7a5c7f3c8b27ea9e1a9c08d1";
+      };
+    }
+    {
+      name = "flat_cache___flat_cache_2.0.1.tgz";
+      path = fetchurl {
+        name = "flat_cache___flat_cache_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz";
+        sha1 = "5d296d6f04bda44a4630a301413bdbc2ec085ec0";
+      };
+    }
+    {
+      name = "flat_cache___flat_cache_3.0.4.tgz";
+      path = fetchurl {
+        name = "flat_cache___flat_cache_3.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz";
+        sha1 = "61b0338302b2fe9f957dcc32fc2a87f1c3048b11";
+      };
+    }
+    {
+      name = "flatted___flatted_2.0.2.tgz";
+      path = fetchurl {
+        name = "flatted___flatted_2.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz";
+        sha1 = "4575b21e2bcee7434aa9be662f4b7b5f9c2b5138";
+      };
+    }
+    {
+      name = "flatted___flatted_3.1.1.tgz";
+      path = fetchurl {
+        name = "flatted___flatted_3.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/flatted/-/flatted-3.1.1.tgz";
+        sha1 = "c4b489e80096d9df1dfc97c79871aea7c617c469";
+      };
+    }
+    {
+      name = "flush_write_stream___flush_write_stream_1.1.1.tgz";
+      path = fetchurl {
+        name = "flush_write_stream___flush_write_stream_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz";
+        sha1 = "8dd7d873a1babc207d94ead0c2e0e44276ebf2e8";
+      };
+    }
+    {
+      name = "for_in___for_in_1.0.2.tgz";
+      path = fetchurl {
+        name = "for_in___for_in_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz";
+        sha1 = "81068d295a8142ec0ac726c6e2200c30fb6d5e80";
+      };
+    }
+    {
+      name = "foreach___foreach_2.0.5.tgz";
+      path = fetchurl {
+        name = "foreach___foreach_2.0.5.tgz";
+        url  = "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz";
+        sha1 = "0bee005018aeb260d0a3af3ae658dd0136ec1b99";
+      };
+    }
+    {
+      name = "format_util___format_util_1.0.5.tgz";
+      path = fetchurl {
+        name = "format_util___format_util_1.0.5.tgz";
+        url  = "https://registry.yarnpkg.com/format-util/-/format-util-1.0.5.tgz";
+        sha1 = "1ffb450c8a03e7bccffe40643180918cc297d271";
+      };
+    }
+    {
+      name = "fragment_cache___fragment_cache_0.2.1.tgz";
+      path = fetchurl {
+        name = "fragment_cache___fragment_cache_0.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz";
+        sha1 = "4290fad27f13e89be7f33799c6bc5a0abfff0d19";
+      };
+    }
+    {
+      name = "from2___from2_2.3.0.tgz";
+      path = fetchurl {
+        name = "from2___from2_2.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz";
+        sha1 = "8bfb5502bde4a4d36cfdeea007fcca21d7e382af";
+      };
+    }
+    {
+      name = "fs_extra___fs_extra_7.0.1.tgz";
+      path = fetchurl {
+        name = "fs_extra___fs_extra_7.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz";
+        sha1 = "4f189c44aa123b895f722804f55ea23eadc348e9";
+      };
+    }
+    {
+      name = "fs_minipass___fs_minipass_2.1.0.tgz";
+      path = fetchurl {
+        name = "fs_minipass___fs_minipass_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz";
+        sha1 = "7f5036fdbf12c63c169190cbe4199c852271f9fb";
+      };
+    }
+    {
+      name = "fs_write_stream_atomic___fs_write_stream_atomic_1.0.10.tgz";
+      path = fetchurl {
+        name = "fs_write_stream_atomic___fs_write_stream_atomic_1.0.10.tgz";
+        url  = "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz";
+        sha1 = "b47df53493ef911df75731e70a9ded0189db40c9";
+      };
+    }
+    {
+      name = "fs.realpath___fs.realpath_1.0.0.tgz";
+      path = fetchurl {
+        name = "fs.realpath___fs.realpath_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz";
+        sha1 = "1504ad2523158caa40db4a2787cb01411994ea4f";
+      };
+    }
+    {
+      name = "fsevents___fsevents_1.2.13.tgz";
+      path = fetchurl {
+        name = "fsevents___fsevents_1.2.13.tgz";
+        url  = "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz";
+        sha1 = "f325cb0455592428bcf11b383370ef70e3bfcc38";
+      };
+    }
+    {
+      name = "fsevents___fsevents_2.1.3.tgz";
+      path = fetchurl {
+        name = "fsevents___fsevents_2.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz";
+        sha1 = "fb738703ae8d2f9fe900c33836ddebee8b97f23e";
+      };
+    }
+    {
+      name = "function_bind___function_bind_1.1.1.tgz";
+      path = fetchurl {
+        name = "function_bind___function_bind_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz";
+        sha1 = "a56899d3ea3c9bab874bb9773b7c5ede92f4895d";
+      };
+    }
+    {
+      name = "functional_red_black_tree___functional_red_black_tree_1.0.1.tgz";
+      path = fetchurl {
+        name = "functional_red_black_tree___functional_red_black_tree_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz";
+        sha1 = "1b0ab3bd553b2a0d6399d29c0e3ea0b252078327";
+      };
+    }
+    {
+      name = "generic_names___generic_names_1.0.3.tgz";
+      path = fetchurl {
+        name = "generic_names___generic_names_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/generic-names/-/generic-names-1.0.3.tgz";
+        sha1 = "2d786a121aee508876796939e8e3bff836c20917";
+      };
+    }
+    {
+      name = "gensync___gensync_1.0.0_beta.2.tgz";
+      path = fetchurl {
+        name = "gensync___gensync_1.0.0_beta.2.tgz";
+        url  = "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz";
+        sha1 = "32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0";
+      };
+    }
+    {
+      name = "get_caller_file___get_caller_file_2.0.5.tgz";
+      path = fetchurl {
+        name = "get_caller_file___get_caller_file_2.0.5.tgz";
+        url  = "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz";
+        sha1 = "4f94412a82db32f36e3b0b9741f8a97feb031f7e";
+      };
+    }
+    {
+      name = "get_stdin___get_stdin_8.0.0.tgz";
+      path = fetchurl {
+        name = "get_stdin___get_stdin_8.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/get-stdin/-/get-stdin-8.0.0.tgz";
+        sha1 = "cbad6a73feb75f6eeb22ba9e01f89aa28aa97a53";
+      };
+    }
+    {
+      name = "get_value___get_value_2.0.6.tgz";
+      path = fetchurl {
+        name = "get_value___get_value_2.0.6.tgz";
+        url  = "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz";
+        sha1 = "dc15ca1c672387ca76bd37ac0a395ba2042a2c28";
+      };
+    }
+    {
+      name = "glob_parent___glob_parent_3.1.0.tgz";
+      path = fetchurl {
+        name = "glob_parent___glob_parent_3.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz";
+        sha1 = "9e6af6299d8d3bd2bd40430832bd113df906c5ae";
+      };
+    }
+    {
+      name = "glob_parent___glob_parent_5.1.1.tgz";
+      path = fetchurl {
+        name = "glob_parent___glob_parent_5.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz";
+        sha1 = "b6c1ef417c4e5663ea498f1c45afac6916bbc229";
+      };
+    }
+    {
+      name = "glob_parent___glob_parent_5.1.2.tgz";
+      path = fetchurl {
+        name = "glob_parent___glob_parent_5.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz";
+        sha1 = "869832c58034fe68a4093c17dc15e8340d8401c4";
+      };
+    }
+    {
+      name = "glob_to_regexp___glob_to_regexp_0.3.0.tgz";
+      path = fetchurl {
+        name = "glob_to_regexp___glob_to_regexp_0.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz";
+        sha1 = "8c5a1494d2066c570cc3bfe4496175acc4d502ab";
+      };
+    }
+    {
+      name = "glob___glob_7.1.6.tgz";
+      path = fetchurl {
+        name = "glob___glob_7.1.6.tgz";
+        url  = "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz";
+        sha1 = "141f33b81a7c2492e125594307480c46679278a6";
+      };
+    }
+    {
+      name = "glob___glob_7.1.7.tgz";
+      path = fetchurl {
+        name = "glob___glob_7.1.7.tgz";
+        url  = "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz";
+        sha1 = "3b193e9233f01d42d0b3f78294bbeeb418f94a90";
+      };
+    }
+    {
+      name = "global_modules___global_modules_1.0.0.tgz";
+      path = fetchurl {
+        name = "global_modules___global_modules_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz";
+        sha1 = "6d770f0eb523ac78164d72b5e71a8877265cc3ea";
+      };
+    }
+    {
+      name = "global_modules___global_modules_2.0.0.tgz";
+      path = fetchurl {
+        name = "global_modules___global_modules_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz";
+        sha1 = "997605ad2345f27f51539bea26574421215c7780";
+      };
+    }
+    {
+      name = "global_prefix___global_prefix_1.0.2.tgz";
+      path = fetchurl {
+        name = "global_prefix___global_prefix_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz";
+        sha1 = "dbf743c6c14992593c655568cb66ed32c0122ebe";
+      };
+    }
+    {
+      name = "global_prefix___global_prefix_3.0.0.tgz";
+      path = fetchurl {
+        name = "global_prefix___global_prefix_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz";
+        sha1 = "fc85f73064df69f50421f47f883fe5b913ba9b97";
+      };
+    }
+    {
+      name = "globals___globals_11.12.0.tgz";
+      path = fetchurl {
+        name = "globals___globals_11.12.0.tgz";
+        url  = "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz";
+        sha1 = "ab8795338868a0babd8525758018c2a7eb95c42e";
+      };
+    }
+    {
+      name = "globals___globals_12.4.0.tgz";
+      path = fetchurl {
+        name = "globals___globals_12.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz";
+        sha1 = "a18813576a41b00a24a97e7f815918c2e19925f8";
+      };
+    }
+    {
+      name = "globals___globals_9.18.0.tgz";
+      path = fetchurl {
+        name = "globals___globals_9.18.0.tgz";
+        url  = "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz";
+        sha1 = "aa3896b3e69b487f17e31ed2143d69a8e30c2d8a";
+      };
+    }
+    {
+      name = "globby___globby_11.0.3.tgz";
+      path = fetchurl {
+        name = "globby___globby_11.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/globby/-/globby-11.0.3.tgz";
+        sha1 = "9b1f0cb523e171dd1ad8c7b2a9fb4b644b9593cb";
+      };
+    }
+    {
+      name = "globby___globby_6.1.0.tgz";
+      path = fetchurl {
+        name = "globby___globby_6.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz";
+        sha1 = "f5a6d70e8395e21c858fb0489d64df02424d506c";
+      };
+    }
+    {
+      name = "globjoin___globjoin_0.1.4.tgz";
+      path = fetchurl {
+        name = "globjoin___globjoin_0.1.4.tgz";
+        url  = "https://registry.yarnpkg.com/globjoin/-/globjoin-0.1.4.tgz";
+        sha1 = "2f4494ac8919e3767c5cbb691e9f463324285d43";
+      };
+    }
+    {
+      name = "gonzales_pe___gonzales_pe_4.3.0.tgz";
+      path = fetchurl {
+        name = "gonzales_pe___gonzales_pe_4.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/gonzales-pe/-/gonzales-pe-4.3.0.tgz";
+        sha1 = "fe9dec5f3c557eead09ff868c65826be54d067b3";
+      };
+    }
+    {
+      name = "good_listener___good_listener_1.2.2.tgz";
+      path = fetchurl {
+        name = "good_listener___good_listener_1.2.2.tgz";
+        url  = "https://registry.yarnpkg.com/good-listener/-/good-listener-1.2.2.tgz";
+        sha1 = "d53b30cdf9313dffb7dc9a0d477096aa6d145c50";
+      };
+    }
+    {
+      name = "graceful_fs___graceful_fs_4.2.4.tgz";
+      path = fetchurl {
+        name = "graceful_fs___graceful_fs_4.2.4.tgz";
+        url  = "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz";
+        sha1 = "2256bde14d3632958c465ebc96dc467ca07a29fb";
+      };
+    }
+    {
+      name = "graceful_fs___graceful_fs_4.2.3.tgz";
+      path = fetchurl {
+        name = "graceful_fs___graceful_fs_4.2.3.tgz";
+        url  = "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz";
+        sha1 = "4a12ff1b60376ef09862c2093edd908328be8423";
+      };
+    }
+    {
+      name = "grapheme_splitter___grapheme_splitter_1.0.4.tgz";
+      path = fetchurl {
+        name = "grapheme_splitter___grapheme_splitter_1.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz";
+        sha1 = "9cf3a665c6247479896834af35cf1dbb4400767e";
+      };
+    }
+    {
+      name = "graphlib___graphlib_2.1.8.tgz";
+      path = fetchurl {
+        name = "graphlib___graphlib_2.1.8.tgz";
+        url  = "https://registry.yarnpkg.com/graphlib/-/graphlib-2.1.8.tgz";
+        sha1 = "5761d414737870084c92ec7b5dbcb0592c9d35da";
+      };
+    }
+    {
+      name = "hard_rejection___hard_rejection_2.1.0.tgz";
+      path = fetchurl {
+        name = "hard_rejection___hard_rejection_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz";
+        sha1 = "1c6eda5c1685c63942766d79bb40ae773cecd883";
+      };
+    }
+    {
+      name = "has_ansi___has_ansi_2.0.0.tgz";
+      path = fetchurl {
+        name = "has_ansi___has_ansi_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz";
+        sha1 = "34f5049ce1ecdf2b0649af3ef24e45ed35416d91";
+      };
+    }
+    {
+      name = "has_flag___has_flag_3.0.0.tgz";
+      path = fetchurl {
+        name = "has_flag___has_flag_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz";
+        sha1 = "b5d454dc2199ae225699f3467e5a07f3b955bafd";
+      };
+    }
+    {
+      name = "has_flag___has_flag_4.0.0.tgz";
+      path = fetchurl {
+        name = "has_flag___has_flag_4.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz";
+        sha1 = "944771fd9c81c81265c4d6941860da06bb59479b";
+      };
+    }
+    {
+      name = "has_symbols___has_symbols_1.0.1.tgz";
+      path = fetchurl {
+        name = "has_symbols___has_symbols_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz";
+        sha1 = "9f5214758a44196c406d9bd76cebf81ec2dd31e8";
+      };
+    }
+    {
+      name = "has_value___has_value_0.3.1.tgz";
+      path = fetchurl {
+        name = "has_value___has_value_0.3.1.tgz";
+        url  = "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz";
+        sha1 = "7b1f58bada62ca827ec0a2078025654845995e1f";
+      };
+    }
+    {
+      name = "has_value___has_value_1.0.0.tgz";
+      path = fetchurl {
+        name = "has_value___has_value_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz";
+        sha1 = "18b281da585b1c5c51def24c930ed29a0be6b177";
+      };
+    }
+    {
+      name = "has_values___has_values_0.1.4.tgz";
+      path = fetchurl {
+        name = "has_values___has_values_0.1.4.tgz";
+        url  = "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz";
+        sha1 = "6d61de95d91dfca9b9a02089ad384bff8f62b771";
+      };
+    }
+    {
+      name = "has_values___has_values_1.0.0.tgz";
+      path = fetchurl {
+        name = "has_values___has_values_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz";
+        sha1 = "95b0b63fec2146619a6fe57fe75628d5a39efe4f";
+      };
+    }
+    {
+      name = "has___has_1.0.3.tgz";
+      path = fetchurl {
+        name = "has___has_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz";
+        sha1 = "722d7cbfc1f6aa8241f16dd814e011e1f41e8796";
+      };
+    }
+    {
+      name = "hash_base___hash_base_3.1.0.tgz";
+      path = fetchurl {
+        name = "hash_base___hash_base_3.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz";
+        sha1 = "55c381d9e06e1d2997a883b4a3fddfe7f0d3af33";
+      };
+    }
+    {
+      name = "hash.js___hash.js_1.1.7.tgz";
+      path = fetchurl {
+        name = "hash.js___hash.js_1.1.7.tgz";
+        url  = "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz";
+        sha1 = "0babca538e8d4ee4a0f8988d68866537a003cf42";
+      };
+    }
+    {
+      name = "hex_color_regex___hex_color_regex_1.1.0.tgz";
+      path = fetchurl {
+        name = "hex_color_regex___hex_color_regex_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz";
+        sha1 = "4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e";
+      };
+    }
+    {
+      name = "hmac_drbg___hmac_drbg_1.0.1.tgz";
+      path = fetchurl {
+        name = "hmac_drbg___hmac_drbg_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz";
+        sha1 = "d2745701025a6c775a6c545793ed502fc0c649a1";
+      };
+    }
+    {
+      name = "home_or_tmp___home_or_tmp_2.0.0.tgz";
+      path = fetchurl {
+        name = "home_or_tmp___home_or_tmp_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz";
+        sha1 = "e36c3f2d2cae7d746a857e38d18d5f32a7882db8";
+      };
+    }
+    {
+      name = "homedir_polyfill___homedir_polyfill_1.0.3.tgz";
+      path = fetchurl {
+        name = "homedir_polyfill___homedir_polyfill_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz";
+        sha1 = "743298cef4e5af3e194161fbadcc2151d3a058e8";
+      };
+    }
+    {
+      name = "hosted_git_info___hosted_git_info_2.8.9.tgz";
+      path = fetchurl {
+        name = "hosted_git_info___hosted_git_info_2.8.9.tgz";
+        url  = "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz";
+        sha1 = "dffc0bf9a21c02209090f2aa69429e1414daf3f9";
+      };
+    }
+    {
+      name = "hosted_git_info___hosted_git_info_4.0.2.tgz";
+      path = fetchurl {
+        name = "hosted_git_info___hosted_git_info_4.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.0.2.tgz";
+        sha1 = "5e425507eede4fea846b7262f0838456c4209961";
+      };
+    }
+    {
+      name = "hsl_regex___hsl_regex_1.0.0.tgz";
+      path = fetchurl {
+        name = "hsl_regex___hsl_regex_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz";
+        sha1 = "d49330c789ed819e276a4c0d272dffa30b18fe6e";
+      };
+    }
+    {
+      name = "hsla_regex___hsla_regex_1.0.0.tgz";
+      path = fetchurl {
+        name = "hsla_regex___hsla_regex_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz";
+        sha1 = "c1ce7a3168c8c6614033a4b5f7877f3b225f9c38";
+      };
+    }
+    {
+      name = "html_tags___html_tags_3.1.0.tgz";
+      path = fetchurl {
+        name = "html_tags___html_tags_3.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/html-tags/-/html-tags-3.1.0.tgz";
+        sha1 = "7b5e6f7e665e9fb41f30007ed9e0d41e97fb2140";
+      };
+    }
+    {
+      name = "htmlparser2___htmlparser2_3.8.3.tgz";
+      path = fetchurl {
+        name = "htmlparser2___htmlparser2_3.8.3.tgz";
+        url  = "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.8.3.tgz";
+        sha1 = "996c28b191516a8be86501a7d79757e5c70c1068";
+      };
+    }
+    {
+      name = "htmlparser2___htmlparser2_3.10.1.tgz";
+      path = fetchurl {
+        name = "htmlparser2___htmlparser2_3.10.1.tgz";
+        url  = "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz";
+        sha1 = "bd679dc3f59897b6a34bb10749c855bb53a9392f";
+      };
+    }
+    {
+      name = "htmlparser2___htmlparser2_4.1.0.tgz";
+      path = fetchurl {
+        name = "htmlparser2___htmlparser2_4.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-4.1.0.tgz";
+        sha1 = "9a4ef161f2e4625ebf7dfbe6c0a2f52d18a59e78";
+      };
+    }
+    {
+      name = "http2_client___http2_client_1.3.3.tgz";
+      path = fetchurl {
+        name = "http2_client___http2_client_1.3.3.tgz";
+        url  = "https://registry.yarnpkg.com/http2-client/-/http2-client-1.3.3.tgz";
+        sha1 = "90fc15d646cca86956b156d07c83947d57d659a9";
+      };
+    }
+    {
+      name = "https_browserify___https_browserify_1.0.0.tgz";
+      path = fetchurl {
+        name = "https_browserify___https_browserify_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz";
+        sha1 = "ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73";
+      };
+    }
+    {
+      name = "iconv_lite___iconv_lite_0.4.24.tgz";
+      path = fetchurl {
+        name = "iconv_lite___iconv_lite_0.4.24.tgz";
+        url  = "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz";
+        sha1 = "2022b4b25fbddc21d2f524974a474aafe733908b";
+      };
+    }
+    {
+      name = "icss_replace_symbols___icss_replace_symbols_1.1.0.tgz";
+      path = fetchurl {
+        name = "icss_replace_symbols___icss_replace_symbols_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz";
+        sha1 = "06ea6f83679a7749e386cfe1fe812ae5db223ded";
+      };
+    }
+    {
+      name = "icss_utils___icss_utils_3.0.1.tgz";
+      path = fetchurl {
+        name = "icss_utils___icss_utils_3.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/icss-utils/-/icss-utils-3.0.1.tgz";
+        sha1 = "ee70d3ae8cac38c6be5ed91e851b27eed343ad0f";
+      };
+    }
+    {
+      name = "icss_utils___icss_utils_4.1.1.tgz";
+      path = fetchurl {
+        name = "icss_utils___icss_utils_4.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz";
+        sha1 = "21170b53789ee27447c2f47dd683081403f9a467";
+      };
+    }
+    {
+      name = "ieee754___ieee754_1.1.13.tgz";
+      path = fetchurl {
+        name = "ieee754___ieee754_1.1.13.tgz";
+        url  = "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz";
+        sha1 = "ec168558e95aa181fd87d37f55c32bbcb6708b84";
+      };
+    }
+    {
+      name = "iferr___iferr_0.1.5.tgz";
+      path = fetchurl {
+        name = "iferr___iferr_0.1.5.tgz";
+        url  = "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz";
+        sha1 = "c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501";
+      };
+    }
+    {
+      name = "ignore___ignore_4.0.6.tgz";
+      path = fetchurl {
+        name = "ignore___ignore_4.0.6.tgz";
+        url  = "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz";
+        sha1 = "750e3db5862087b4737ebac8207ffd1ef27b25fc";
+      };
+    }
+    {
+      name = "ignore___ignore_5.1.8.tgz";
+      path = fetchurl {
+        name = "ignore___ignore_5.1.8.tgz";
+        url  = "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz";
+        sha1 = "f150a8b50a34289b33e22f5889abd4d8016f0e57";
+      };
+    }
+    {
+      name = "import_fresh___import_fresh_3.2.1.tgz";
+      path = fetchurl {
+        name = "import_fresh___import_fresh_3.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz";
+        sha1 = "633ff618506e793af5ac91bf48b72677e15cbe66";
+      };
+    }
+    {
+      name = "import_fresh___import_fresh_3.3.0.tgz";
+      path = fetchurl {
+        name = "import_fresh___import_fresh_3.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz";
+        sha1 = "37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b";
+      };
+    }
+    {
+      name = "import_lazy___import_lazy_4.0.0.tgz";
+      path = fetchurl {
+        name = "import_lazy___import_lazy_4.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/import-lazy/-/import-lazy-4.0.0.tgz";
+        sha1 = "e8eb627483a0a43da3c03f3e35548be5cb0cc153";
+      };
+    }
+    {
+      name = "import_local___import_local_2.0.0.tgz";
+      path = fetchurl {
+        name = "import_local___import_local_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz";
+        sha1 = "55070be38a5993cf18ef6db7e961f5bee5c5a09d";
+      };
+    }
+    {
+      name = "imports_loader___imports_loader_1.1.0.tgz";
+      path = fetchurl {
+        name = "imports_loader___imports_loader_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/imports-loader/-/imports-loader-1.1.0.tgz";
+        sha1 = "1c3a388d0c5cd7f9eb08f3646d4aae3b70e57933";
+      };
+    }
+    {
+      name = "imurmurhash___imurmurhash_0.1.4.tgz";
+      path = fetchurl {
+        name = "imurmurhash___imurmurhash_0.1.4.tgz";
+        url  = "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz";
+        sha1 = "9218b9b2b928a238b13dc4fb6b6d576f231453ea";
+      };
+    }
+    {
+      name = "indent_string___indent_string_4.0.0.tgz";
+      path = fetchurl {
+        name = "indent_string___indent_string_4.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz";
+        sha1 = "624f8f4497d619b2d9768531d58f4122854d7251";
+      };
+    }
+    {
+      name = "indexes_of___indexes_of_1.0.1.tgz";
+      path = fetchurl {
+        name = "indexes_of___indexes_of_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz";
+        sha1 = "f30f716c8e2bd346c7b67d3df3915566a7c05607";
+      };
+    }
+    {
+      name = "infer_owner___infer_owner_1.0.4.tgz";
+      path = fetchurl {
+        name = "infer_owner___infer_owner_1.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz";
+        sha1 = "c4cefcaa8e51051c2a40ba2ce8a3d27295af9467";
+      };
+    }
+    {
+      name = "inflight___inflight_1.0.6.tgz";
+      path = fetchurl {
+        name = "inflight___inflight_1.0.6.tgz";
+        url  = "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz";
+        sha1 = "49bd6331d7d02d0c09bc910a1075ba8165b56df9";
+      };
+    }
+    {
+      name = "inherits___inherits_2.0.4.tgz";
+      path = fetchurl {
+        name = "inherits___inherits_2.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz";
+        sha1 = "0fa2c64f932917c3433a0ded55363aae37416b7c";
+      };
+    }
+    {
+      name = "inherits___inherits_2.0.1.tgz";
+      path = fetchurl {
+        name = "inherits___inherits_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz";
+        sha1 = "b17d08d326b4423e568eff719f91b0b1cbdf69f1";
+      };
+    }
+    {
+      name = "inherits___inherits_2.0.3.tgz";
+      path = fetchurl {
+        name = "inherits___inherits_2.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz";
+        sha1 = "633c2c83e3da42a502f52466022480f4208261de";
+      };
+    }
+    {
+      name = "ini___ini_1.3.8.tgz";
+      path = fetchurl {
+        name = "ini___ini_1.3.8.tgz";
+        url  = "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz";
+        sha1 = "a29da425b48806f34767a4efce397269af28432c";
+      };
+    }
+    {
+      name = "interpret___interpret_1.4.0.tgz";
+      path = fetchurl {
+        name = "interpret___interpret_1.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz";
+        sha1 = "665ab8bc4da27a774a40584e812e3e0fa45b1a1e";
+      };
+    }
+    {
+      name = "invariant___invariant_2.2.4.tgz";
+      path = fetchurl {
+        name = "invariant___invariant_2.2.4.tgz";
+        url  = "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz";
+        sha1 = "610f3c92c9359ce1db616e538008d23ff35158e6";
+      };
+    }
+    {
+      name = "is_absolute_url___is_absolute_url_3.0.3.tgz";
+      path = fetchurl {
+        name = "is_absolute_url___is_absolute_url_3.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz";
+        sha1 = "96c6a22b6a23929b11ea0afb1836c36ad4a5d698";
+      };
+    }
+    {
+      name = "is_accessor_descriptor___is_accessor_descriptor_0.1.6.tgz";
+      path = fetchurl {
+        name = "is_accessor_descriptor___is_accessor_descriptor_0.1.6.tgz";
+        url  = "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz";
+        sha1 = "a9e12cb3ae8d876727eeef3843f8a0897b5c98d6";
+      };
+    }
+    {
+      name = "is_accessor_descriptor___is_accessor_descriptor_1.0.0.tgz";
+      path = fetchurl {
+        name = "is_accessor_descriptor___is_accessor_descriptor_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz";
+        sha1 = "169c2f6d3df1f992618072365c9b0ea1f6878656";
+      };
+    }
+    {
+      name = "is_alphabetical___is_alphabetical_1.0.4.tgz";
+      path = fetchurl {
+        name = "is_alphabetical___is_alphabetical_1.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz";
+        sha1 = "9e7d6b94916be22153745d184c298cbf986a686d";
+      };
+    }
+    {
+      name = "is_alphanumerical___is_alphanumerical_1.0.4.tgz";
+      path = fetchurl {
+        name = "is_alphanumerical___is_alphanumerical_1.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz";
+        sha1 = "7eb9a2431f855f6b1ef1a78e326df515696c4dbf";
+      };
+    }
+    {
+      name = "is_arrayish___is_arrayish_0.2.1.tgz";
+      path = fetchurl {
+        name = "is_arrayish___is_arrayish_0.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz";
+        sha1 = "77c99840527aa8ecb1a8ba697b80645a7a926a9d";
+      };
+    }
+    {
+      name = "is_binary_path___is_binary_path_1.0.1.tgz";
+      path = fetchurl {
+        name = "is_binary_path___is_binary_path_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz";
+        sha1 = "75f16642b480f187a711c814161fd3a4a7655898";
+      };
+    }
+    {
+      name = "is_binary_path___is_binary_path_2.1.0.tgz";
+      path = fetchurl {
+        name = "is_binary_path___is_binary_path_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz";
+        sha1 = "ea1f7f3b80f064236e83470f86c09c254fb45b09";
+      };
+    }
+    {
+      name = "is_buffer___is_buffer_1.1.6.tgz";
+      path = fetchurl {
+        name = "is_buffer___is_buffer_1.1.6.tgz";
+        url  = "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz";
+        sha1 = "efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be";
+      };
+    }
+    {
+      name = "is_buffer___is_buffer_2.0.5.tgz";
+      path = fetchurl {
+        name = "is_buffer___is_buffer_2.0.5.tgz";
+        url  = "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz";
+        sha1 = "ebc252e400d22ff8d77fa09888821a24a658c191";
+      };
+    }
+    {
+      name = "is_callable___is_callable_1.1.4.tgz";
+      path = fetchurl {
+        name = "is_callable___is_callable_1.1.4.tgz";
+        url  = "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz";
+        sha1 = "1e1adf219e1eeb684d691f9d6a05ff0d30a24d75";
+      };
+    }
+    {
+      name = "is_callable___is_callable_1.2.0.tgz";
+      path = fetchurl {
+        name = "is_callable___is_callable_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.0.tgz";
+        sha1 = "83336560b54a38e35e3a2df7afd0454d691468bb";
+      };
+    }
+    {
+      name = "is_color_stop___is_color_stop_1.1.0.tgz";
+      path = fetchurl {
+        name = "is_color_stop___is_color_stop_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz";
+        sha1 = "cfff471aee4dd5c9e158598fbe12967b5cdad345";
+      };
+    }
+    {
+      name = "is_core_module___is_core_module_2.4.0.tgz";
+      path = fetchurl {
+        name = "is_core_module___is_core_module_2.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.4.0.tgz";
+        sha1 = "8e9fc8e15027b011418026e98f0e6f4d86305cc1";
+      };
+    }
+    {
+      name = "is_data_descriptor___is_data_descriptor_0.1.4.tgz";
+      path = fetchurl {
+        name = "is_data_descriptor___is_data_descriptor_0.1.4.tgz";
+        url  = "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz";
+        sha1 = "0b5ee648388e2c860282e793f1856fec3f301b56";
+      };
+    }
+    {
+      name = "is_data_descriptor___is_data_descriptor_1.0.0.tgz";
+      path = fetchurl {
+        name = "is_data_descriptor___is_data_descriptor_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz";
+        sha1 = "d84876321d0e7add03990406abbbbd36ba9268c7";
+      };
+    }
+    {
+      name = "is_date_object___is_date_object_1.0.1.tgz";
+      path = fetchurl {
+        name = "is_date_object___is_date_object_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz";
+        sha1 = "9aa20eb6aeebbff77fbd33e74ca01b33581d3a16";
+      };
+    }
+    {
+      name = "is_decimal___is_decimal_1.0.4.tgz";
+      path = fetchurl {
+        name = "is_decimal___is_decimal_1.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz";
+        sha1 = "65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5";
+      };
+    }
+    {
+      name = "is_descriptor___is_descriptor_0.1.6.tgz";
+      path = fetchurl {
+        name = "is_descriptor___is_descriptor_0.1.6.tgz";
+        url  = "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz";
+        sha1 = "366d8240dde487ca51823b1ab9f07a10a78251ca";
+      };
+    }
+    {
+      name = "is_descriptor___is_descriptor_1.0.2.tgz";
+      path = fetchurl {
+        name = "is_descriptor___is_descriptor_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz";
+        sha1 = "3b159746a66604b04f8c81524ba365c5f14d86ec";
+      };
+    }
+    {
+      name = "is_extendable___is_extendable_0.1.1.tgz";
+      path = fetchurl {
+        name = "is_extendable___is_extendable_0.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz";
+        sha1 = "62b110e289a471418e3ec36a617d472e301dfc89";
+      };
+    }
+    {
+      name = "is_extendable___is_extendable_1.0.1.tgz";
+      path = fetchurl {
+        name = "is_extendable___is_extendable_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz";
+        sha1 = "a7470f9e426733d81bd81e1155264e3a3507cab4";
+      };
+    }
+    {
+      name = "is_extglob___is_extglob_2.1.1.tgz";
+      path = fetchurl {
+        name = "is_extglob___is_extglob_2.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz";
+        sha1 = "a88c02535791f02ed37c76a1b9ea9773c833f8c2";
+      };
+    }
+    {
+      name = "is_finite___is_finite_1.0.2.tgz";
+      path = fetchurl {
+        name = "is_finite___is_finite_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz";
+        sha1 = "cc6677695602be550ef11e8b4aa6305342b6d0aa";
+      };
+    }
+    {
+      name = "is_fullwidth_code_point___is_fullwidth_code_point_2.0.0.tgz";
+      path = fetchurl {
+        name = "is_fullwidth_code_point___is_fullwidth_code_point_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz";
+        sha1 = "a3b30a5c4f199183167aaab93beefae3ddfb654f";
+      };
+    }
+    {
+      name = "is_fullwidth_code_point___is_fullwidth_code_point_3.0.0.tgz";
+      path = fetchurl {
+        name = "is_fullwidth_code_point___is_fullwidth_code_point_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz";
+        sha1 = "f116f8064fe90b3f7844a38997c0b75051269f1d";
+      };
+    }
+    {
+      name = "is_glob___is_glob_3.1.0.tgz";
+      path = fetchurl {
+        name = "is_glob___is_glob_3.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz";
+        sha1 = "7ba5ae24217804ac70707b96922567486cc3e84a";
+      };
+    }
+    {
+      name = "is_glob___is_glob_4.0.1.tgz";
+      path = fetchurl {
+        name = "is_glob___is_glob_4.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz";
+        sha1 = "7567dbe9f2f5e2467bc77ab83c4a29482407a5dc";
+      };
+    }
+    {
+      name = "is_hexadecimal___is_hexadecimal_1.0.4.tgz";
+      path = fetchurl {
+        name = "is_hexadecimal___is_hexadecimal_1.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz";
+        sha1 = "cc35c97588da4bd49a8eedd6bc4082d44dcb23a7";
+      };
+    }
+    {
+      name = "is_number___is_number_3.0.0.tgz";
+      path = fetchurl {
+        name = "is_number___is_number_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz";
+        sha1 = "24fd6201a4782cf50561c810276afc7d12d71195";
+      };
+    }
+    {
+      name = "is_number___is_number_7.0.0.tgz";
+      path = fetchurl {
+        name = "is_number___is_number_7.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz";
+        sha1 = "7535345b896734d5f80c4d06c50955527a14f12b";
+      };
+    }
+    {
+      name = "is_path_cwd___is_path_cwd_2.2.0.tgz";
+      path = fetchurl {
+        name = "is_path_cwd___is_path_cwd_2.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz";
+        sha1 = "67d43b82664a7b5191fd9119127eb300048a9fdb";
+      };
+    }
+    {
+      name = "is_path_in_cwd___is_path_in_cwd_2.1.0.tgz";
+      path = fetchurl {
+        name = "is_path_in_cwd___is_path_in_cwd_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz";
+        sha1 = "bfe2dca26c69f397265a4009963602935a053acb";
+      };
+    }
+    {
+      name = "is_path_inside___is_path_inside_2.1.0.tgz";
+      path = fetchurl {
+        name = "is_path_inside___is_path_inside_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-2.1.0.tgz";
+        sha1 = "7c9810587d659a40d27bcdb4d5616eab059494b2";
+      };
+    }
+    {
+      name = "is_plain_obj___is_plain_obj_1.1.0.tgz";
+      path = fetchurl {
+        name = "is_plain_obj___is_plain_obj_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz";
+        sha1 = "71a50c8429dfca773c92a390a4a03b39fcd51d3e";
+      };
+    }
+    {
+      name = "is_plain_obj___is_plain_obj_2.1.0.tgz";
+      path = fetchurl {
+        name = "is_plain_obj___is_plain_obj_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz";
+        sha1 = "45e42e37fccf1f40da8e5f76ee21515840c09287";
+      };
+    }
+    {
+      name = "is_plain_object___is_plain_object_2.0.4.tgz";
+      path = fetchurl {
+        name = "is_plain_object___is_plain_object_2.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz";
+        sha1 = "2c163b3fafb1b606d9d17928f05c2a1c38e07677";
+      };
+    }
+    {
+      name = "is_regex___is_regex_1.0.5.tgz";
+      path = fetchurl {
+        name = "is_regex___is_regex_1.0.5.tgz";
+        url  = "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz";
+        sha1 = "39d589a358bf18967f726967120b8fc1aed74eae";
+      };
+    }
+    {
+      name = "is_regex___is_regex_1.1.0.tgz";
+      path = fetchurl {
+        name = "is_regex___is_regex_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.0.tgz";
+        sha1 = "ece38e389e490df0dc21caea2bd596f987f767ff";
+      };
+    }
+    {
+      name = "is_regexp___is_regexp_2.1.0.tgz";
+      path = fetchurl {
+        name = "is_regexp___is_regexp_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-regexp/-/is-regexp-2.1.0.tgz";
+        sha1 = "cd734a56864e23b956bf4e7c66c396a4c0b22c2d";
+      };
+    }
+    {
+      name = "is_resolvable___is_resolvable_1.1.0.tgz";
+      path = fetchurl {
+        name = "is_resolvable___is_resolvable_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz";
+        sha1 = "fb18f87ce1feb925169c9a407c19318a3206ed88";
+      };
+    }
+    {
+      name = "is_string___is_string_1.0.5.tgz";
+      path = fetchurl {
+        name = "is_string___is_string_1.0.5.tgz";
+        url  = "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz";
+        sha1 = "40493ed198ef3ff477b8c7f92f644ec82a5cd3a6";
+      };
+    }
+    {
+      name = "is_symbol___is_symbol_1.0.3.tgz";
+      path = fetchurl {
+        name = "is_symbol___is_symbol_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz";
+        sha1 = "38e1014b9e6329be0de9d24a414fd7441ec61937";
+      };
+    }
+    {
+      name = "is_typedarray___is_typedarray_1.0.0.tgz";
+      path = fetchurl {
+        name = "is_typedarray___is_typedarray_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz";
+        sha1 = "e479c80858df0c1b11ddda6940f96011fcda4a9a";
+      };
+    }
+    {
+      name = "is_unicode_supported___is_unicode_supported_0.1.0.tgz";
+      path = fetchurl {
+        name = "is_unicode_supported___is_unicode_supported_0.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz";
+        sha1 = "3f26c76a809593b52bfa2ecb5710ed2779b522a7";
+      };
+    }
+    {
+      name = "is_windows___is_windows_1.0.2.tgz";
+      path = fetchurl {
+        name = "is_windows___is_windows_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz";
+        sha1 = "d1850eb9791ecd18e6182ce12a30f396634bb19d";
+      };
+    }
+    {
+      name = "is_wsl___is_wsl_1.1.0.tgz";
+      path = fetchurl {
+        name = "is_wsl___is_wsl_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz";
+        sha1 = "1f16e4aa22b04d1336b66188a66af3c600c3a66d";
+      };
+    }
+    {
+      name = "isarray___isarray_0.0.1.tgz";
+      path = fetchurl {
+        name = "isarray___isarray_0.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz";
+        sha1 = "8a18acfca9a8f4177e09abfc6038939b05d1eedf";
+      };
+    }
+    {
+      name = "isarray___isarray_1.0.0.tgz";
+      path = fetchurl {
+        name = "isarray___isarray_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz";
+        sha1 = "bb935d48582cba168c06834957a54a3e07124f11";
+      };
+    }
+    {
+      name = "isexe___isexe_2.0.0.tgz";
+      path = fetchurl {
+        name = "isexe___isexe_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz";
+        sha1 = "e8fbf374dc556ff8947a10dcb0572d633f2cfa10";
+      };
+    }
+    {
+      name = "isobject___isobject_2.1.0.tgz";
+      path = fetchurl {
+        name = "isobject___isobject_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz";
+        sha1 = "f065561096a3f1da2ef46272f815c840d87e0c89";
+      };
+    }
+    {
+      name = "isobject___isobject_3.0.1.tgz";
+      path = fetchurl {
+        name = "isobject___isobject_3.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz";
+        sha1 = "4e431e92b11a9731636aa1f9c8d1ccbcfdab78df";
+      };
+    }
+    {
+      name = "jquery___jquery_3.4.1.tgz";
+      path = fetchurl {
+        name = "jquery___jquery_3.4.1.tgz";
+        url  = "https://registry.yarnpkg.com/jquery/-/jquery-3.4.1.tgz";
+        sha1 = "714f1f8d9dde4bdfa55764ba37ef214630d80ef2";
+      };
+    }
+    {
+      name = "js_tokens___js_tokens_4.0.0.tgz";
+      path = fetchurl {
+        name = "js_tokens___js_tokens_4.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz";
+        sha1 = "19203fb59991df98e3a287050d4647cdeaf32499";
+      };
+    }
+    {
+      name = "js_tokens___js_tokens_3.0.2.tgz";
+      path = fetchurl {
+        name = "js_tokens___js_tokens_3.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz";
+        sha1 = "9866df395102130e38f7f996bceb65443209c25b";
+      };
+    }
+    {
+      name = "js_yaml___js_yaml_3.14.0.tgz";
+      path = fetchurl {
+        name = "js_yaml___js_yaml_3.14.0.tgz";
+        url  = "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz";
+        sha1 = "a7a34170f26a21bb162424d8adacb4113a69e482";
+      };
+    }
+    {
+      name = "jsesc___jsesc_1.3.0.tgz";
+      path = fetchurl {
+        name = "jsesc___jsesc_1.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz";
+        sha1 = "46c3fec8c1892b12b0833db9bc7622176dbab34b";
+      };
+    }
+    {
+      name = "jsesc___jsesc_2.5.2.tgz";
+      path = fetchurl {
+        name = "jsesc___jsesc_2.5.2.tgz";
+        url  = "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz";
+        sha1 = "80564d2e483dacf6e8ef209650a67df3f0c283a4";
+      };
+    }
+    {
+      name = "jsesc___jsesc_0.5.0.tgz";
+      path = fetchurl {
+        name = "jsesc___jsesc_0.5.0.tgz";
+        url  = "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz";
+        sha1 = "e7dee66e35d6fc16f710fe91d5cf69f70f08911d";
+      };
+    }
+    {
+      name = "jshint___jshint_2.12.0.tgz";
+      path = fetchurl {
+        name = "jshint___jshint_2.12.0.tgz";
+        url  = "https://registry.yarnpkg.com/jshint/-/jshint-2.12.0.tgz";
+        sha1 = "52e75bd058d587ef81a0e2f95e5cf18eb5dc5c37";
+      };
+    }
+    {
+      name = "json_parse_better_errors___json_parse_better_errors_1.0.2.tgz";
+      path = fetchurl {
+        name = "json_parse_better_errors___json_parse_better_errors_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz";
+        sha1 = "bb867cfb3450e69107c131d1c514bab3dc8bcaa9";
+      };
+    }
+    {
+      name = "json_parse_even_better_errors___json_parse_even_better_errors_2.3.1.tgz";
+      path = fetchurl {
+        name = "json_parse_even_better_errors___json_parse_even_better_errors_2.3.1.tgz";
+        url  = "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz";
+        sha1 = "7c47805a94319928e05777405dc12e1f7a4ee02d";
+      };
+    }
+    {
+      name = "json_pointer___json_pointer_0.6.0.tgz";
+      path = fetchurl {
+        name = "json_pointer___json_pointer_0.6.0.tgz";
+        url  = "https://registry.yarnpkg.com/json-pointer/-/json-pointer-0.6.0.tgz";
+        sha1 = "8e500550a6aac5464a473377da57aa6cc22828d7";
+      };
+    }
+    {
+      name = "json_schema_ref_parser___json_schema_ref_parser_6.1.0.tgz";
+      path = fetchurl {
+        name = "json_schema_ref_parser___json_schema_ref_parser_6.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/json-schema-ref-parser/-/json-schema-ref-parser-6.1.0.tgz";
+        sha1 = "30af34aeab5bee0431da805dac0eb21b574bf63d";
+      };
+    }
+    {
+      name = "json_schema_traverse___json_schema_traverse_0.3.1.tgz";
+      path = fetchurl {
+        name = "json_schema_traverse___json_schema_traverse_0.3.1.tgz";
+        url  = "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz";
+        sha1 = "349a6d44c53a51de89b40805c5d5e59b417d3340";
+      };
+    }
+    {
+      name = "json_schema_traverse___json_schema_traverse_0.4.1.tgz";
+      path = fetchurl {
+        name = "json_schema_traverse___json_schema_traverse_0.4.1.tgz";
+        url  = "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz";
+        sha1 = "69f6a87d9513ab8bb8fe63bdb0979c448e684660";
+      };
+    }
+    {
+      name = "json_schema_traverse___json_schema_traverse_1.0.0.tgz";
+      path = fetchurl {
+        name = "json_schema_traverse___json_schema_traverse_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz";
+        sha1 = "ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2";
+      };
+    }
+    {
+      name = "json_stable_stringify_without_jsonify___json_stable_stringify_without_jsonify_1.0.1.tgz";
+      path = fetchurl {
+        name = "json_stable_stringify_without_jsonify___json_stable_stringify_without_jsonify_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz";
+        sha1 = "9db7b59496ad3f3cfef30a75142d2d930ad72651";
+      };
+    }
+    {
+      name = "json_to_ast___json_to_ast_2.1.0.tgz";
+      path = fetchurl {
+        name = "json_to_ast___json_to_ast_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/json-to-ast/-/json-to-ast-2.1.0.tgz";
+        sha1 = "041a9fcd03c0845036acb670d29f425cea4faaf9";
+      };
+    }
+    {
+      name = "json5___json5_0.5.1.tgz";
+      path = fetchurl {
+        name = "json5___json5_0.5.1.tgz";
+        url  = "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz";
+        sha1 = "1eade7acc012034ad84e2396767ead9fa5495821";
+      };
+    }
+    {
+      name = "json5___json5_1.0.1.tgz";
+      path = fetchurl {
+        name = "json5___json5_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz";
+        sha1 = "779fb0018604fa854eacbf6252180d83543e3dbe";
+      };
+    }
+    {
+      name = "json5___json5_2.2.0.tgz";
+      path = fetchurl {
+        name = "json5___json5_2.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz";
+        sha1 = "2dfefe720c6ba525d9ebd909950f0515316c89a3";
+      };
+    }
+    {
+      name = "jsonfile___jsonfile_4.0.0.tgz";
+      path = fetchurl {
+        name = "jsonfile___jsonfile_4.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz";
+        sha1 = "8771aae0799b64076b76640fca058f9c10e33ecb";
+      };
+    }
+    {
+      name = "jsonpointer___jsonpointer_4.1.0.tgz";
+      path = fetchurl {
+        name = "jsonpointer___jsonpointer_4.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.1.0.tgz";
+        sha1 = "501fb89986a2389765ba09e6053299ceb4f2c2cc";
+      };
+    }
+    {
+      name = "kind_of___kind_of_3.2.2.tgz";
+      path = fetchurl {
+        name = "kind_of___kind_of_3.2.2.tgz";
+        url  = "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz";
+        sha1 = "31ea21a734bab9bbb0f32466d893aea51e4a3c64";
+      };
+    }
+    {
+      name = "kind_of___kind_of_4.0.0.tgz";
+      path = fetchurl {
+        name = "kind_of___kind_of_4.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz";
+        sha1 = "20813df3d712928b207378691a45066fae72dd57";
+      };
+    }
+    {
+      name = "kind_of___kind_of_5.1.0.tgz";
+      path = fetchurl {
+        name = "kind_of___kind_of_5.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz";
+        sha1 = "729c91e2d857b7a419a1f9aa65685c4c33f5845d";
+      };
+    }
+    {
+      name = "kind_of___kind_of_6.0.3.tgz";
+      path = fetchurl {
+        name = "kind_of___kind_of_6.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz";
+        sha1 = "07c05034a6c349fa06e24fa35aa76db4580ce4dd";
+      };
+    }
+    {
+      name = "known_css_properties___known_css_properties_0.21.0.tgz";
+      path = fetchurl {
+        name = "known_css_properties___known_css_properties_0.21.0.tgz";
+        url  = "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.21.0.tgz";
+        sha1 = "15fbd0bbb83447f3ce09d8af247ed47c68ede80d";
+      };
+    }
+    {
+      name = "last_call_webpack_plugin___last_call_webpack_plugin_3.0.0.tgz";
+      path = fetchurl {
+        name = "last_call_webpack_plugin___last_call_webpack_plugin_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz";
+        sha1 = "9742df0e10e3cf46e5c0381c2de90d3a7a2d7555";
+      };
+    }
+    {
+      name = "leven___leven_3.1.0.tgz";
+      path = fetchurl {
+        name = "leven___leven_3.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz";
+        sha1 = "77891de834064cccba82ae7842bb6b14a13ed7f2";
+      };
+    }
+    {
+      name = "levn___levn_0.4.1.tgz";
+      path = fetchurl {
+        name = "levn___levn_0.4.1.tgz";
+        url  = "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz";
+        sha1 = "ae4562c007473b932a6200d403268dd2fffc6ade";
+      };
+    }
+    {
+      name = "lines_and_columns___lines_and_columns_1.1.6.tgz";
+      path = fetchurl {
+        name = "lines_and_columns___lines_and_columns_1.1.6.tgz";
+        url  = "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz";
+        sha1 = "1c00c743b433cd0a4e80758f7b64a57440d9ff00";
+      };
+    }
+    {
+      name = "load_json_file___load_json_file_2.0.0.tgz";
+      path = fetchurl {
+        name = "load_json_file___load_json_file_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz";
+        sha1 = "7947e42149af80d696cbf797bcaabcfe1fe29ca8";
+      };
+    }
+    {
+      name = "loader_runner___loader_runner_2.4.0.tgz";
+      path = fetchurl {
+        name = "loader_runner___loader_runner_2.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz";
+        sha1 = "ed47066bfe534d7e84c4c7b9998c2a75607d9357";
+      };
+    }
+    {
+      name = "loader_utils___loader_utils_0.2.17.tgz";
+      path = fetchurl {
+        name = "loader_utils___loader_utils_0.2.17.tgz";
+        url  = "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz";
+        sha1 = "f86e6374d43205a6e6c60e9196f17c0299bfb348";
+      };
+    }
+    {
+      name = "loader_utils___loader_utils_1.4.0.tgz";
+      path = fetchurl {
+        name = "loader_utils___loader_utils_1.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz";
+        sha1 = "c579b5e34cb34b1a74edc6c1fb36bfa371d5a613";
+      };
+    }
+    {
+      name = "loader_utils___loader_utils_2.0.0.tgz";
+      path = fetchurl {
+        name = "loader_utils___loader_utils_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz";
+        sha1 = "e4cace5b816d425a166b5f097e10cd12b36064b0";
+      };
+    }
+    {
+      name = "locate_path___locate_path_2.0.0.tgz";
+      path = fetchurl {
+        name = "locate_path___locate_path_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz";
+        sha1 = "2b568b265eec944c6d9c0de9c3dbbbca0354cd8e";
+      };
+    }
+    {
+      name = "locate_path___locate_path_3.0.0.tgz";
+      path = fetchurl {
+        name = "locate_path___locate_path_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz";
+        sha1 = "dbec3b3ab759758071b58fe59fc41871af21400e";
+      };
+    }
+    {
+      name = "locate_path___locate_path_5.0.0.tgz";
+      path = fetchurl {
+        name = "locate_path___locate_path_5.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz";
+        sha1 = "1afba396afd676a6d42504d0a67a3a7eb9f62aa0";
+      };
+    }
+    {
+      name = "lodash.clonedeep___lodash.clonedeep_4.5.0.tgz";
+      path = fetchurl {
+        name = "lodash.clonedeep___lodash.clonedeep_4.5.0.tgz";
+        url  = "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz";
+        sha1 = "e23f3f9c4f8fbdde872529c1071857a086e5ccef";
+      };
+    }
+    {
+      name = "lodash.difference___lodash.difference_4.5.0.tgz";
+      path = fetchurl {
+        name = "lodash.difference___lodash.difference_4.5.0.tgz";
+        url  = "https://registry.yarnpkg.com/lodash.difference/-/lodash.difference-4.5.0.tgz";
+        sha1 = "9ccb4e505d486b91651345772885a2df27fd017c";
+      };
+    }
+    {
+      name = "lodash.memoize___lodash.memoize_4.1.2.tgz";
+      path = fetchurl {
+        name = "lodash.memoize___lodash.memoize_4.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz";
+        sha1 = "bcc6c49a42a2840ed997f323eada5ecd182e0bfe";
+      };
+    }
+    {
+      name = "lodash.truncate___lodash.truncate_4.4.2.tgz";
+      path = fetchurl {
+        name = "lodash.truncate___lodash.truncate_4.4.2.tgz";
+        url  = "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz";
+        sha1 = "5a350da0b1113b837ecfffd5812cbe58d6eae193";
+      };
+    }
+    {
+      name = "lodash.uniq___lodash.uniq_4.5.0.tgz";
+      path = fetchurl {
+        name = "lodash.uniq___lodash.uniq_4.5.0.tgz";
+        url  = "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz";
+        sha1 = "d0225373aeb652adc1bc82e4945339a842754773";
+      };
+    }
+    {
+      name = "lodash___lodash_4.17.21.tgz";
+      path = fetchurl {
+        name = "lodash___lodash_4.17.21.tgz";
+        url  = "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz";
+        sha1 = "679591c564c3bffaae8454cf0b3df370c3d6911c";
+      };
+    }
+    {
+      name = "log_symbols___log_symbols_4.1.0.tgz";
+      path = fetchurl {
+        name = "log_symbols___log_symbols_4.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz";
+        sha1 = "3fbdbb95b4683ac9fc785111e792e558d4abd503";
+      };
+    }
+    {
+      name = "longest_streak___longest_streak_2.0.4.tgz";
+      path = fetchurl {
+        name = "longest_streak___longest_streak_2.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/longest-streak/-/longest-streak-2.0.4.tgz";
+        sha1 = "b8599957da5b5dab64dee3fe316fa774597d90e4";
+      };
+    }
+    {
+      name = "loose_envify___loose_envify_1.4.0.tgz";
+      path = fetchurl {
+        name = "loose_envify___loose_envify_1.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz";
+        sha1 = "71ee51fa7be4caec1a63839f7e682d8132d30caf";
+      };
+    }
+    {
+      name = "lru_cache___lru_cache_5.1.1.tgz";
+      path = fetchurl {
+        name = "lru_cache___lru_cache_5.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz";
+        sha1 = "1da27e6710271947695daf6848e847f01d84b920";
+      };
+    }
+    {
+      name = "lru_cache___lru_cache_6.0.0.tgz";
+      path = fetchurl {
+        name = "lru_cache___lru_cache_6.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz";
+        sha1 = "6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94";
+      };
+    }
+    {
+      name = "lunr___lunr_2.3.8.tgz";
+      path = fetchurl {
+        name = "lunr___lunr_2.3.8.tgz";
+        url  = "https://registry.yarnpkg.com/lunr/-/lunr-2.3.8.tgz";
+        sha1 = "a8b89c31f30b5a044b97d2d28e2da191b6ba2072";
+      };
+    }
+    {
+      name = "make_dir___make_dir_2.1.0.tgz";
+      path = fetchurl {
+        name = "make_dir___make_dir_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz";
+        sha1 = "5f0310e18b8be898cc07009295a30ae41e91e6f5";
+      };
+    }
+    {
+      name = "make_dir___make_dir_3.1.0.tgz";
+      path = fetchurl {
+        name = "make_dir___make_dir_3.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz";
+        sha1 = "415e967046b3a7f1d185277d84aa58203726a13f";
+      };
+    }
+    {
+      name = "map_cache___map_cache_0.2.2.tgz";
+      path = fetchurl {
+        name = "map_cache___map_cache_0.2.2.tgz";
+        url  = "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz";
+        sha1 = "c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf";
+      };
+    }
+    {
+      name = "map_obj___map_obj_1.0.1.tgz";
+      path = fetchurl {
+        name = "map_obj___map_obj_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz";
+        sha1 = "d933ceb9205d82bdcf4886f6742bdc2b4dea146d";
+      };
+    }
+    {
+      name = "map_obj___map_obj_4.2.1.tgz";
+      path = fetchurl {
+        name = "map_obj___map_obj_4.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/map-obj/-/map-obj-4.2.1.tgz";
+        sha1 = "e4ea399dbc979ae735c83c863dd31bdf364277b7";
+      };
+    }
+    {
+      name = "map_visit___map_visit_1.0.0.tgz";
+      path = fetchurl {
+        name = "map_visit___map_visit_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz";
+        sha1 = "ecdca8f13144e660f1b5bd41f12f3479d98dfb8f";
+      };
+    }
+    {
+      name = "mark.js___mark.js_8.11.1.tgz";
+      path = fetchurl {
+        name = "mark.js___mark.js_8.11.1.tgz";
+        url  = "https://registry.yarnpkg.com/mark.js/-/mark.js-8.11.1.tgz";
+        sha1 = "180f1f9ebef8b0e638e4166ad52db879beb2ffc5";
+      };
+    }
+    {
+      name = "marked___marked_0.7.0.tgz";
+      path = fetchurl {
+        name = "marked___marked_0.7.0.tgz";
+        url  = "https://registry.yarnpkg.com/marked/-/marked-0.7.0.tgz";
+        sha1 = "b64201f051d271b1edc10a04d1ae9b74bb8e5c0e";
+      };
+    }
+    {
+      name = "mathml_tag_names___mathml_tag_names_2.1.3.tgz";
+      path = fetchurl {
+        name = "mathml_tag_names___mathml_tag_names_2.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz";
+        sha1 = "4ddadd67308e780cf16a47685878ee27b736a0a3";
+      };
+    }
+    {
+      name = "md5.js___md5.js_1.3.5.tgz";
+      path = fetchurl {
+        name = "md5.js___md5.js_1.3.5.tgz";
+        url  = "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz";
+        sha1 = "b5d07b8e3216e3e27cd728d72f70d1e6a342005f";
+      };
+    }
+    {
+      name = "mdast_util_from_markdown___mdast_util_from_markdown_0.8.5.tgz";
+      path = fetchurl {
+        name = "mdast_util_from_markdown___mdast_util_from_markdown_0.8.5.tgz";
+        url  = "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz";
+        sha1 = "d1ef2ca42bc377ecb0463a987910dae89bd9a28c";
+      };
+    }
+    {
+      name = "mdast_util_to_markdown___mdast_util_to_markdown_0.6.5.tgz";
+      path = fetchurl {
+        name = "mdast_util_to_markdown___mdast_util_to_markdown_0.6.5.tgz";
+        url  = "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz";
+        sha1 = "b33f67ca820d69e6cc527a93d4039249b504bebe";
+      };
+    }
+    {
+      name = "mdast_util_to_string___mdast_util_to_string_2.0.0.tgz";
+      path = fetchurl {
+        name = "mdast_util_to_string___mdast_util_to_string_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz";
+        sha1 = "b8cfe6a713e1091cb5b728fc48885a4767f8b97b";
+      };
+    }
+    {
+      name = "mdn_data___mdn_data_2.0.14.tgz";
+      path = fetchurl {
+        name = "mdn_data___mdn_data_2.0.14.tgz";
+        url  = "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz";
+        sha1 = "7113fc4281917d63ce29b43446f701e68c25ba50";
+      };
+    }
+    {
+      name = "memoize_one___memoize_one_5.1.1.tgz";
+      path = fetchurl {
+        name = "memoize_one___memoize_one_5.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.1.1.tgz";
+        sha1 = "047b6e3199b508eaec03504de71229b8eb1d75c0";
+      };
+    }
+    {
+      name = "memory_fs___memory_fs_0.4.1.tgz";
+      path = fetchurl {
+        name = "memory_fs___memory_fs_0.4.1.tgz";
+        url  = "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz";
+        sha1 = "3a9a20b8462523e447cfbc7e8bb80ed667bfc552";
+      };
+    }
+    {
+      name = "memory_fs___memory_fs_0.5.0.tgz";
+      path = fetchurl {
+        name = "memory_fs___memory_fs_0.5.0.tgz";
+        url  = "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz";
+        sha1 = "324c01288b88652966d161db77838720845a8e3c";
+      };
+    }
+    {
+      name = "meow___meow_9.0.0.tgz";
+      path = fetchurl {
+        name = "meow___meow_9.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/meow/-/meow-9.0.0.tgz";
+        sha1 = "cd9510bc5cac9dee7d03c73ee1f9ad959f4ea364";
+      };
+    }
+    {
+      name = "merge2___merge2_1.4.1.tgz";
+      path = fetchurl {
+        name = "merge2___merge2_1.4.1.tgz";
+        url  = "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz";
+        sha1 = "4368892f885e907455a6fd7dc55c0c9d404990ae";
+      };
+    }
+    {
+      name = "micromark___micromark_2.11.4.tgz";
+      path = fetchurl {
+        name = "micromark___micromark_2.11.4.tgz";
+        url  = "https://registry.yarnpkg.com/micromark/-/micromark-2.11.4.tgz";
+        sha1 = "d13436138eea826383e822449c9a5c50ee44665a";
+      };
+    }
+    {
+      name = "micromatch___micromatch_3.1.10.tgz";
+      path = fetchurl {
+        name = "micromatch___micromatch_3.1.10.tgz";
+        url  = "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz";
+        sha1 = "70859bc95c9840952f359a068a3fc49f9ecfac23";
+      };
+    }
+    {
+      name = "micromatch___micromatch_4.0.4.tgz";
+      path = fetchurl {
+        name = "micromatch___micromatch_4.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz";
+        sha1 = "896d519dfe9db25fce94ceb7a500919bf881ebf9";
+      };
+    }
+    {
+      name = "miller_rabin___miller_rabin_4.0.1.tgz";
+      path = fetchurl {
+        name = "miller_rabin___miller_rabin_4.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz";
+        sha1 = "f080351c865b0dc562a8462966daa53543c78a4d";
+      };
+    }
+    {
+      name = "mime_db___mime_db_1.44.0.tgz";
+      path = fetchurl {
+        name = "mime_db___mime_db_1.44.0.tgz";
+        url  = "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz";
+        sha1 = "fa11c5eb0aca1334b4233cb4d52f10c5a6272f92";
+      };
+    }
+    {
+      name = "mime_types___mime_types_2.1.27.tgz";
+      path = fetchurl {
+        name = "mime_types___mime_types_2.1.27.tgz";
+        url  = "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz";
+        sha1 = "47949f98e279ea53119f5722e0f34e529bec009f";
+      };
+    }
+    {
+      name = "min_indent___min_indent_1.0.1.tgz";
+      path = fetchurl {
+        name = "min_indent___min_indent_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz";
+        sha1 = "a63f681673b30571fbe8bc25686ae746eefa9869";
+      };
+    }
+    {
+      name = "mini_css_extract_plugin___mini_css_extract_plugin_1.6.0.tgz";
+      path = fetchurl {
+        name = "mini_css_extract_plugin___mini_css_extract_plugin_1.6.0.tgz";
+        url  = "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-1.6.0.tgz";
+        sha1 = "b4db2525af2624899ed64a23b0016e0036411893";
+      };
+    }
+    {
+      name = "minimalistic_assert___minimalistic_assert_1.0.1.tgz";
+      path = fetchurl {
+        name = "minimalistic_assert___minimalistic_assert_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz";
+        sha1 = "2e194de044626d4a10e7f7fbc00ce73e83e4d5c7";
+      };
+    }
+    {
+      name = "minimalistic_crypto_utils___minimalistic_crypto_utils_1.0.1.tgz";
+      path = fetchurl {
+        name = "minimalistic_crypto_utils___minimalistic_crypto_utils_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz";
+        sha1 = "f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a";
+      };
+    }
+    {
+      name = "minimatch___minimatch_3.0.4.tgz";
+      path = fetchurl {
+        name = "minimatch___minimatch_3.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz";
+        sha1 = "5166e286457f03306064be5497e8dbb0c3d32083";
+      };
+    }
+    {
+      name = "minimist_options___minimist_options_4.1.0.tgz";
+      path = fetchurl {
+        name = "minimist_options___minimist_options_4.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz";
+        sha1 = "c0655713c53a8a2ebd77ffa247d342c40f010619";
+      };
+    }
+    {
+      name = "minimist___minimist_1.2.5.tgz";
+      path = fetchurl {
+        name = "minimist___minimist_1.2.5.tgz";
+        url  = "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz";
+        sha1 = "67d66014b66a6a8aaa0c083c5fd58df4e4e97602";
+      };
+    }
+    {
+      name = "minipass_collect___minipass_collect_1.0.2.tgz";
+      path = fetchurl {
+        name = "minipass_collect___minipass_collect_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz";
+        sha1 = "22b813bf745dc6edba2576b940022ad6edc8c617";
+      };
+    }
+    {
+      name = "minipass_flush___minipass_flush_1.0.5.tgz";
+      path = fetchurl {
+        name = "minipass_flush___minipass_flush_1.0.5.tgz";
+        url  = "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz";
+        sha1 = "82e7135d7e89a50ffe64610a787953c4c4cbb373";
+      };
+    }
+    {
+      name = "minipass_pipeline___minipass_pipeline_1.2.3.tgz";
+      path = fetchurl {
+        name = "minipass_pipeline___minipass_pipeline_1.2.3.tgz";
+        url  = "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.3.tgz";
+        sha1 = "55f7839307d74859d6e8ada9c3ebe72cec216a34";
+      };
+    }
+    {
+      name = "minipass___minipass_3.1.3.tgz";
+      path = fetchurl {
+        name = "minipass___minipass_3.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/minipass/-/minipass-3.1.3.tgz";
+        sha1 = "7d42ff1f39635482e15f9cdb53184deebd5815fd";
+      };
+    }
+    {
+      name = "minizlib___minizlib_2.1.0.tgz";
+      path = fetchurl {
+        name = "minizlib___minizlib_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.0.tgz";
+        sha1 = "fd52c645301ef09a63a2c209697c294c6ce02cf3";
+      };
+    }
+    {
+      name = "mississippi___mississippi_3.0.0.tgz";
+      path = fetchurl {
+        name = "mississippi___mississippi_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz";
+        sha1 = "ea0a3291f97e0b5e8776b363d5f0a12d94c67022";
+      };
+    }
+    {
+      name = "mixin_deep___mixin_deep_1.3.2.tgz";
+      path = fetchurl {
+        name = "mixin_deep___mixin_deep_1.3.2.tgz";
+        url  = "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz";
+        sha1 = "1120b43dc359a785dce65b55b82e257ccf479566";
+      };
+    }
+    {
+      name = "mkdirp___mkdirp_0.5.5.tgz";
+      path = fetchurl {
+        name = "mkdirp___mkdirp_0.5.5.tgz";
+        url  = "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz";
+        sha1 = "d91cefd62d1436ca0f41620e251288d420099def";
+      };
+    }
+    {
+      name = "mkdirp___mkdirp_1.0.4.tgz";
+      path = fetchurl {
+        name = "mkdirp___mkdirp_1.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz";
+        sha1 = "3eb5ed62622756d79a5f0e2a221dfebad75c2f7e";
+      };
+    }
+    {
+      name = "mobx_react_lite___mobx_react_lite_3.2.0.tgz";
+      path = fetchurl {
+        name = "mobx_react_lite___mobx_react_lite_3.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/mobx-react-lite/-/mobx-react-lite-3.2.0.tgz";
+        sha1 = "331d7365a6b053378dfe9c087315b4e41c5df69f";
+      };
+    }
+    {
+      name = "mobx_react___mobx_react_7.1.0.tgz";
+      path = fetchurl {
+        name = "mobx_react___mobx_react_7.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/mobx-react/-/mobx-react-7.1.0.tgz";
+        sha1 = "d947cada3cfad294b4b6f692e969c242b9c16eaf";
+      };
+    }
+    {
+      name = "moment_locales_webpack_plugin___moment_locales_webpack_plugin_1.2.0.tgz";
+      path = fetchurl {
+        name = "moment_locales_webpack_plugin___moment_locales_webpack_plugin_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/moment-locales-webpack-plugin/-/moment-locales-webpack-plugin-1.2.0.tgz";
+        sha1 = "9af83876a44053706b868ceece5119584d10d7aa";
+      };
+    }
+    {
+      name = "moment_timezone___moment_timezone_0.4.1.tgz";
+      path = fetchurl {
+        name = "moment_timezone___moment_timezone_0.4.1.tgz";
+        url  = "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.4.1.tgz";
+        sha1 = "81f598c3ad5e22cdad796b67ecd8d88d0f5baa06";
+      };
+    }
+    {
+      name = "moment_timezone___moment_timezone_0.5.28.tgz";
+      path = fetchurl {
+        name = "moment_timezone___moment_timezone_0.5.28.tgz";
+        url  = "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.28.tgz";
+        sha1 = "f093d789d091ed7b055d82aa81a82467f72e4338";
+      };
+    }
+    {
+      name = "moment___moment_2.24.0.tgz";
+      path = fetchurl {
+        name = "moment___moment_2.24.0.tgz";
+        url  = "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz";
+        sha1 = "0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b";
+      };
+    }
+    {
+      name = "move_concurrently___move_concurrently_1.0.1.tgz";
+      path = fetchurl {
+        name = "move_concurrently___move_concurrently_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz";
+        sha1 = "be2c005fda32e0b29af1f05d7c4b33214c701f92";
+      };
+    }
+    {
+      name = "ms___ms_2.0.0.tgz";
+      path = fetchurl {
+        name = "ms___ms_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz";
+        sha1 = "5608aeadfc00be6c2901df5f9861788de0d597c8";
+      };
+    }
+    {
+      name = "ms___ms_2.1.2.tgz";
+      path = fetchurl {
+        name = "ms___ms_2.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz";
+        sha1 = "d09d1f357b443f493382a8eb3ccd183872ae6009";
+      };
+    }
+    {
+      name = "ms___ms_2.1.3.tgz";
+      path = fetchurl {
+        name = "ms___ms_2.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz";
+        sha1 = "574c8138ce1d2b5861f0b44579dbadd60c6615b2";
+      };
+    }
+    {
+      name = "nan___nan_2.14.1.tgz";
+      path = fetchurl {
+        name = "nan___nan_2.14.1.tgz";
+        url  = "https://registry.yarnpkg.com/nan/-/nan-2.14.1.tgz";
+        sha1 = "d7be34dfa3105b91494c3147089315eff8874b01";
+      };
+    }
+    {
+      name = "nanoid___nanoid_3.1.23.tgz";
+      path = fetchurl {
+        name = "nanoid___nanoid_3.1.23.tgz";
+        url  = "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.23.tgz";
+        sha1 = "f744086ce7c2bc47ee0a8472574d5c78e4183a81";
+      };
+    }
+    {
+      name = "nanomatch___nanomatch_1.2.13.tgz";
+      path = fetchurl {
+        name = "nanomatch___nanomatch_1.2.13.tgz";
+        url  = "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz";
+        sha1 = "b87a8aa4fc0de8fe6be88895b38983ff265bd119";
+      };
+    }
+    {
+      name = "natural_compare___natural_compare_1.4.0.tgz";
+      path = fetchurl {
+        name = "natural_compare___natural_compare_1.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz";
+        sha1 = "4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7";
+      };
+    }
+    {
+      name = "neo_async___neo_async_2.6.2.tgz";
+      path = fetchurl {
+        name = "neo_async___neo_async_2.6.2.tgz";
+        url  = "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz";
+        sha1 = "b4aafb93e3aeb2d8174ca53cf163ab7d7308305f";
+      };
+    }
+    {
+      name = "nice_try___nice_try_1.0.5.tgz";
+      path = fetchurl {
+        name = "nice_try___nice_try_1.0.5.tgz";
+        url  = "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz";
+        sha1 = "a3378a7696ce7d223e88fc9b764bd7ef1089e366";
+      };
+    }
+    {
+      name = "node_fetch_h2___node_fetch_h2_2.3.0.tgz";
+      path = fetchurl {
+        name = "node_fetch_h2___node_fetch_h2_2.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/node-fetch-h2/-/node-fetch-h2-2.3.0.tgz";
+        sha1 = "c6188325f9bd3d834020bf0f2d6dc17ced2241ac";
+      };
+    }
+    {
+      name = "node_libs_browser___node_libs_browser_2.2.1.tgz";
+      path = fetchurl {
+        name = "node_libs_browser___node_libs_browser_2.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz";
+        sha1 = "b64f513d18338625f90346d27b0d235e631f6425";
+      };
+    }
+    {
+      name = "node_readfiles___node_readfiles_0.2.0.tgz";
+      path = fetchurl {
+        name = "node_readfiles___node_readfiles_0.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/node-readfiles/-/node-readfiles-0.2.0.tgz";
+        sha1 = "dbbd4af12134e2e635c245ef93ffcf6f60673a5d";
+      };
+    }
+    {
+      name = "node_releases___node_releases_1.1.63.tgz";
+      path = fetchurl {
+        name = "node_releases___node_releases_1.1.63.tgz";
+        url  = "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.63.tgz";
+        sha1 = "db6dbb388544c31e888216304e8fd170efee3ff5";
+      };
+    }
+    {
+      name = "node_releases___node_releases_1.1.71.tgz";
+      path = fetchurl {
+        name = "node_releases___node_releases_1.1.71.tgz";
+        url  = "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.71.tgz";
+        sha1 = "cb1334b179896b1c89ecfdd4b725fb7bbdfc7dbb";
+      };
+    }
+    {
+      name = "normalize_package_data___normalize_package_data_2.5.0.tgz";
+      path = fetchurl {
+        name = "normalize_package_data___normalize_package_data_2.5.0.tgz";
+        url  = "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz";
+        sha1 = "e66db1838b200c1dfc233225d12cb36520e234a8";
+      };
+    }
+    {
+      name = "normalize_package_data___normalize_package_data_3.0.2.tgz";
+      path = fetchurl {
+        name = "normalize_package_data___normalize_package_data_3.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-3.0.2.tgz";
+        sha1 = "cae5c410ae2434f9a6c1baa65d5bc3b9366c8699";
+      };
+    }
+    {
+      name = "normalize_path___normalize_path_2.1.1.tgz";
+      path = fetchurl {
+        name = "normalize_path___normalize_path_2.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz";
+        sha1 = "1ab28b556e198363a8c1a6f7e6fa20137fe6aed9";
+      };
+    }
+    {
+      name = "normalize_path___normalize_path_3.0.0.tgz";
+      path = fetchurl {
+        name = "normalize_path___normalize_path_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz";
+        sha1 = "0dcd69ff23a1c9b11fd0978316644a0388216a65";
+      };
+    }
+    {
+      name = "normalize_range___normalize_range_0.1.2.tgz";
+      path = fetchurl {
+        name = "normalize_range___normalize_range_0.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz";
+        sha1 = "2d10c06bdfd312ea9777695a4d28439456b75942";
+      };
+    }
+    {
+      name = "normalize_selector___normalize_selector_0.2.0.tgz";
+      path = fetchurl {
+        name = "normalize_selector___normalize_selector_0.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/normalize-selector/-/normalize-selector-0.2.0.tgz";
+        sha1 = "d0b145eb691189c63a78d201dc4fdb1293ef0c03";
+      };
+    }
+    {
+      name = "normalize_url___normalize_url_6.0.1.tgz";
+      path = fetchurl {
+        name = "normalize_url___normalize_url_6.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.0.1.tgz";
+        sha1 = "a4f27f58cf8c7b287b440b8a8201f42d0b00d256";
+      };
+    }
+    {
+      name = "nth_check___nth_check_2.0.0.tgz";
+      path = fetchurl {
+        name = "nth_check___nth_check_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/nth-check/-/nth-check-2.0.0.tgz";
+        sha1 = "1bb4f6dac70072fc313e8c9cd1417b5074c0a125";
+      };
+    }
+    {
+      name = "num2fraction___num2fraction_1.2.2.tgz";
+      path = fetchurl {
+        name = "num2fraction___num2fraction_1.2.2.tgz";
+        url  = "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz";
+        sha1 = "6f682b6a027a4e9ddfa4564cd2589d1d4e669ede";
+      };
+    }
+    {
+      name = "number_is_nan___number_is_nan_1.0.1.tgz";
+      path = fetchurl {
+        name = "number_is_nan___number_is_nan_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz";
+        sha1 = "097b602b53422a522c1afb8790318336941a011d";
+      };
+    }
+    {
+      name = "nvd3___nvd3_1.8.6.tgz";
+      path = fetchurl {
+        name = "nvd3___nvd3_1.8.6.tgz";
+        url  = "https://registry.yarnpkg.com/nvd3/-/nvd3-1.8.6.tgz";
+        sha1 = "2d3eba74bf33363b5101ebf1d093c59a53ae73c4";
+      };
+    }
+    {
+      name = "oas_kit_common___oas_kit_common_1.0.8.tgz";
+      path = fetchurl {
+        name = "oas_kit_common___oas_kit_common_1.0.8.tgz";
+        url  = "https://registry.yarnpkg.com/oas-kit-common/-/oas-kit-common-1.0.8.tgz";
+        sha1 = "6d8cacf6e9097967a4c7ea8bcbcbd77018e1f535";
+      };
+    }
+    {
+      name = "oas_linter___oas_linter_3.2.1.tgz";
+      path = fetchurl {
+        name = "oas_linter___oas_linter_3.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/oas-linter/-/oas-linter-3.2.1.tgz";
+        sha1 = "1a6d9117d146805b58e56df479861de0293b6e5b";
+      };
+    }
+    {
+      name = "oas_resolver___oas_resolver_2.5.4.tgz";
+      path = fetchurl {
+        name = "oas_resolver___oas_resolver_2.5.4.tgz";
+        url  = "https://registry.yarnpkg.com/oas-resolver/-/oas-resolver-2.5.4.tgz";
+        sha1 = "81fa1aaa7e2387ab2dba1045827e9d7b79822326";
+      };
+    }
+    {
+      name = "oas_schema_walker___oas_schema_walker_1.1.5.tgz";
+      path = fetchurl {
+        name = "oas_schema_walker___oas_schema_walker_1.1.5.tgz";
+        url  = "https://registry.yarnpkg.com/oas-schema-walker/-/oas-schema-walker-1.1.5.tgz";
+        sha1 = "74c3cd47b70ff8e0b19adada14455b5d3ac38a22";
+      };
+    }
+    {
+      name = "oas_validator___oas_validator_4.0.8.tgz";
+      path = fetchurl {
+        name = "oas_validator___oas_validator_4.0.8.tgz";
+        url  = "https://registry.yarnpkg.com/oas-validator/-/oas-validator-4.0.8.tgz";
+        sha1 = "4f1a4d6bd9e030ad07db03fd7a7bc3a91aabcc7d";
+      };
+    }
+    {
+      name = "object_assign___object_assign_4.1.1.tgz";
+      path = fetchurl {
+        name = "object_assign___object_assign_4.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz";
+        sha1 = "2109adc7965887cfc05cbbd442cac8bfbb360863";
+      };
+    }
+    {
+      name = "object_copy___object_copy_0.1.0.tgz";
+      path = fetchurl {
+        name = "object_copy___object_copy_0.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz";
+        sha1 = "7e7d858b781bd7c991a41ba975ed3812754e998c";
+      };
+    }
+    {
+      name = "object_inspect___object_inspect_1.7.0.tgz";
+      path = fetchurl {
+        name = "object_inspect___object_inspect_1.7.0.tgz";
+        url  = "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz";
+        sha1 = "f4f6bd181ad77f006b5ece60bd0b6f398ff74a67";
+      };
+    }
+    {
+      name = "object_keys___object_keys_1.1.1.tgz";
+      path = fetchurl {
+        name = "object_keys___object_keys_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz";
+        sha1 = "1c47f272df277f3b1daf061677d9c82e2322c60e";
+      };
+    }
+    {
+      name = "object_visit___object_visit_1.0.1.tgz";
+      path = fetchurl {
+        name = "object_visit___object_visit_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz";
+        sha1 = "f79c4493af0c5377b59fe39d395e41042dd045bb";
+      };
+    }
+    {
+      name = "object.assign___object.assign_4.1.0.tgz";
+      path = fetchurl {
+        name = "object.assign___object.assign_4.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz";
+        sha1 = "968bf1100d7956bb3ca086f006f846b3bc4008da";
+      };
+    }
+    {
+      name = "object.entries___object.entries_1.1.1.tgz";
+      path = fetchurl {
+        name = "object.entries___object.entries_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.1.tgz";
+        sha1 = "ee1cf04153de02bb093fec33683900f57ce5399b";
+      };
+    }
+    {
+      name = "object.entries___object.entries_1.1.2.tgz";
+      path = fetchurl {
+        name = "object.entries___object.entries_1.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.2.tgz";
+        sha1 = "bc73f00acb6b6bb16c203434b10f9a7e797d3add";
+      };
+    }
+    {
+      name = "object.pick___object.pick_1.3.0.tgz";
+      path = fetchurl {
+        name = "object.pick___object.pick_1.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz";
+        sha1 = "87a10ac4c1694bd2e1cbf53591a66141fb5dd747";
+      };
+    }
+    {
+      name = "object.values___object.values_1.1.1.tgz";
+      path = fetchurl {
+        name = "object.values___object.values_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz";
+        sha1 = "68a99ecde356b7e9295a3c5e0ce31dc8c953de5e";
+      };
+    }
+    {
+      name = "once___once_1.4.0.tgz";
+      path = fetchurl {
+        name = "once___once_1.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz";
+        sha1 = "583b1aa775961d4b113ac17d9c50baef9dd76bd1";
+      };
+    }
+    {
+      name = "ono___ono_4.0.11.tgz";
+      path = fetchurl {
+        name = "ono___ono_4.0.11.tgz";
+        url  = "https://registry.yarnpkg.com/ono/-/ono-4.0.11.tgz";
+        sha1 = "c7f4209b3e396e8a44ef43b9cedc7f5d791d221d";
+      };
+    }
+    {
+      name = "openapi_sampler___openapi_sampler_1.0.0_beta.18.tgz";
+      path = fetchurl {
+        name = "openapi_sampler___openapi_sampler_1.0.0_beta.18.tgz";
+        url  = "https://registry.yarnpkg.com/openapi-sampler/-/openapi-sampler-1.0.0-beta.18.tgz";
+        sha1 = "9e0845616a669e048860625ea5c10d0f554f1b53";
+      };
+    }
+    {
+      name = "optimize_css_assets_webpack_plugin___optimize_css_assets_webpack_plugin_6.0.0.tgz";
+      path = fetchurl {
+        name = "optimize_css_assets_webpack_plugin___optimize_css_assets_webpack_plugin_6.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-6.0.0.tgz";
+        sha1 = "00acd99d420715ad96ed3d8ad65a8a4df1be233b";
+      };
+    }
+    {
+      name = "optionator___optionator_0.9.1.tgz";
+      path = fetchurl {
+        name = "optionator___optionator_0.9.1.tgz";
+        url  = "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz";
+        sha1 = "4f236a6373dae0566a6d43e1326674f50c291499";
+      };
+    }
+    {
+      name = "os_browserify___os_browserify_0.3.0.tgz";
+      path = fetchurl {
+        name = "os_browserify___os_browserify_0.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz";
+        sha1 = "854373c7f5c2315914fc9bfc6bd8238fdda1ec27";
+      };
+    }
+    {
+      name = "os_homedir___os_homedir_1.0.2.tgz";
+      path = fetchurl {
+        name = "os_homedir___os_homedir_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz";
+        sha1 = "ffbc4988336e0e833de0c168c7ef152121aa7fb3";
+      };
+    }
+    {
+      name = "os_tmpdir___os_tmpdir_1.0.2.tgz";
+      path = fetchurl {
+        name = "os_tmpdir___os_tmpdir_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz";
+        sha1 = "bbe67406c79aa85c5cfec766fe5734555dfa1274";
+      };
+    }
+    {
+      name = "p_limit___p_limit_1.3.0.tgz";
+      path = fetchurl {
+        name = "p_limit___p_limit_1.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz";
+        sha1 = "b86bd5f0c25690911c7590fcbfc2010d54b3ccb8";
+      };
+    }
+    {
+      name = "p_limit___p_limit_2.3.0.tgz";
+      path = fetchurl {
+        name = "p_limit___p_limit_2.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz";
+        sha1 = "3dd33c647a214fdfffd835933eb086da0dc21db1";
+      };
+    }
+    {
+      name = "p_limit___p_limit_3.0.2.tgz";
+      path = fetchurl {
+        name = "p_limit___p_limit_3.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/p-limit/-/p-limit-3.0.2.tgz";
+        sha1 = "1664e010af3cadc681baafd3e2a437be7b0fb5fe";
+      };
+    }
+    {
+      name = "p_locate___p_locate_2.0.0.tgz";
+      path = fetchurl {
+        name = "p_locate___p_locate_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz";
+        sha1 = "20a0103b222a70c8fd39cc2e580680f3dde5ec43";
+      };
+    }
+    {
+      name = "p_locate___p_locate_3.0.0.tgz";
+      path = fetchurl {
+        name = "p_locate___p_locate_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz";
+        sha1 = "322d69a05c0264b25997d9f40cd8a891ab0064a4";
+      };
+    }
+    {
+      name = "p_locate___p_locate_4.1.0.tgz";
+      path = fetchurl {
+        name = "p_locate___p_locate_4.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz";
+        sha1 = "a3428bb7088b3a60292f66919278b7c297ad4f07";
+      };
+    }
+    {
+      name = "p_map___p_map_2.1.0.tgz";
+      path = fetchurl {
+        name = "p_map___p_map_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz";
+        sha1 = "310928feef9c9ecc65b68b17693018a665cea175";
+      };
+    }
+    {
+      name = "p_map___p_map_4.0.0.tgz";
+      path = fetchurl {
+        name = "p_map___p_map_4.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz";
+        sha1 = "bb2f95a5eda2ec168ec9274e06a747c3e2904d2b";
+      };
+    }
+    {
+      name = "p_try___p_try_1.0.0.tgz";
+      path = fetchurl {
+        name = "p_try___p_try_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz";
+        sha1 = "cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3";
+      };
+    }
+    {
+      name = "p_try___p_try_2.2.0.tgz";
+      path = fetchurl {
+        name = "p_try___p_try_2.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz";
+        sha1 = "cb2868540e313d61de58fafbe35ce9004d5540e6";
+      };
+    }
+    {
+      name = "pako___pako_1.0.11.tgz";
+      path = fetchurl {
+        name = "pako___pako_1.0.11.tgz";
+        url  = "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz";
+        sha1 = "6c9599d340d54dfd3946380252a35705a6b992bf";
+      };
+    }
+    {
+      name = "parallel_transform___parallel_transform_1.2.0.tgz";
+      path = fetchurl {
+        name = "parallel_transform___parallel_transform_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz";
+        sha1 = "9049ca37d6cb2182c3b1d2c720be94d14a5814fc";
+      };
+    }
+    {
+      name = "parent_module___parent_module_1.0.1.tgz";
+      path = fetchurl {
+        name = "parent_module___parent_module_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz";
+        sha1 = "691d2709e78c79fae3a156622452d00762caaaa2";
+      };
+    }
+    {
+      name = "parse_asn1___parse_asn1_5.1.5.tgz";
+      path = fetchurl {
+        name = "parse_asn1___parse_asn1_5.1.5.tgz";
+        url  = "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.5.tgz";
+        sha1 = "003271343da58dc94cace494faef3d2147ecea0e";
+      };
+    }
+    {
+      name = "parse_entities___parse_entities_2.0.0.tgz";
+      path = fetchurl {
+        name = "parse_entities___parse_entities_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz";
+        sha1 = "53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8";
+      };
+    }
+    {
+      name = "parse_json___parse_json_2.2.0.tgz";
+      path = fetchurl {
+        name = "parse_json___parse_json_2.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz";
+        sha1 = "f480f40434ef80741f8469099f8dea18f55a4dc9";
+      };
+    }
+    {
+      name = "parse_json___parse_json_5.2.0.tgz";
+      path = fetchurl {
+        name = "parse_json___parse_json_5.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz";
+        sha1 = "c76fc66dee54231c962b22bcc8a72cf2f99753cd";
+      };
+    }
+    {
+      name = "parse_passwd___parse_passwd_1.0.0.tgz";
+      path = fetchurl {
+        name = "parse_passwd___parse_passwd_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz";
+        sha1 = "6d5b934a456993b23d37f40a382d6f1666a8e5c6";
+      };
+    }
+    {
+      name = "pascalcase___pascalcase_0.1.1.tgz";
+      path = fetchurl {
+        name = "pascalcase___pascalcase_0.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz";
+        sha1 = "b363e55e8006ca6fe21784d2db22bd15d7917f14";
+      };
+    }
+    {
+      name = "path_browserify___path_browserify_0.0.1.tgz";
+      path = fetchurl {
+        name = "path_browserify___path_browserify_0.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz";
+        sha1 = "e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a";
+      };
+    }
+    {
+      name = "path_dirname___path_dirname_1.0.2.tgz";
+      path = fetchurl {
+        name = "path_dirname___path_dirname_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz";
+        sha1 = "cc33d24d525e099a5388c0336c6e32b9160609e0";
+      };
+    }
+    {
+      name = "path_exists___path_exists_3.0.0.tgz";
+      path = fetchurl {
+        name = "path_exists___path_exists_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz";
+        sha1 = "ce0ebeaa5f78cb18925ea7d810d7b59b010fd515";
+      };
+    }
+    {
+      name = "path_exists___path_exists_4.0.0.tgz";
+      path = fetchurl {
+        name = "path_exists___path_exists_4.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz";
+        sha1 = "513bdbe2d3b95d7762e8c1137efa195c6c61b5b3";
+      };
+    }
+    {
+      name = "path_is_absolute___path_is_absolute_1.0.1.tgz";
+      path = fetchurl {
+        name = "path_is_absolute___path_is_absolute_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz";
+        sha1 = "174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f";
+      };
+    }
+    {
+      name = "path_is_inside___path_is_inside_1.0.2.tgz";
+      path = fetchurl {
+        name = "path_is_inside___path_is_inside_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz";
+        sha1 = "365417dede44430d1c11af61027facf074bdfc53";
+      };
+    }
+    {
+      name = "path_key___path_key_2.0.1.tgz";
+      path = fetchurl {
+        name = "path_key___path_key_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz";
+        sha1 = "411cadb574c5a140d3a4b1910d40d80cc9f40b40";
+      };
+    }
+    {
+      name = "path_key___path_key_3.1.1.tgz";
+      path = fetchurl {
+        name = "path_key___path_key_3.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz";
+        sha1 = "581f6ade658cbba65a0d3380de7753295054f375";
+      };
+    }
+    {
+      name = "path_parse___path_parse_1.0.6.tgz";
+      path = fetchurl {
+        name = "path_parse___path_parse_1.0.6.tgz";
+        url  = "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz";
+        sha1 = "d62dbb5679405d72c4737ec58600e9ddcf06d24c";
+      };
+    }
+    {
+      name = "path_type___path_type_2.0.0.tgz";
+      path = fetchurl {
+        name = "path_type___path_type_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz";
+        sha1 = "f012ccb8415b7096fc2daa1054c3d72389594c73";
+      };
+    }
+    {
+      name = "path_type___path_type_4.0.0.tgz";
+      path = fetchurl {
+        name = "path_type___path_type_4.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz";
+        sha1 = "84ed01c0a7ba380afe09d90a8c180dcd9d03043b";
+      };
+    }
+    {
+      name = "pbkdf2___pbkdf2_3.1.1.tgz";
+      path = fetchurl {
+        name = "pbkdf2___pbkdf2_3.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.1.tgz";
+        sha1 = "cb8724b0fada984596856d1a6ebafd3584654b94";
+      };
+    }
+    {
+      name = "perfect_scrollbar___perfect_scrollbar_1.5.0.tgz";
+      path = fetchurl {
+        name = "perfect_scrollbar___perfect_scrollbar_1.5.0.tgz";
+        url  = "https://registry.yarnpkg.com/perfect-scrollbar/-/perfect-scrollbar-1.5.0.tgz";
+        sha1 = "821d224ed8ff61990c23f26db63048cdc75b6b83";
+      };
+    }
+    {
+      name = "picomatch___picomatch_2.2.2.tgz";
+      path = fetchurl {
+        name = "picomatch___picomatch_2.2.2.tgz";
+        url  = "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz";
+        sha1 = "21f333e9b6b8eaff02468f5146ea406d345f4dad";
+      };
+    }
+    {
+      name = "picomatch___picomatch_2.2.3.tgz";
+      path = fetchurl {
+        name = "picomatch___picomatch_2.2.3.tgz";
+        url  = "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.3.tgz";
+        sha1 = "465547f359ccc206d3c48e46a1bcb89bf7ee619d";
+      };
+    }
+    {
+      name = "pify___pify_2.3.0.tgz";
+      path = fetchurl {
+        name = "pify___pify_2.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz";
+        sha1 = "ed141a6ac043a849ea588498e7dca8b15330e90c";
+      };
+    }
+    {
+      name = "pify___pify_4.0.1.tgz";
+      path = fetchurl {
+        name = "pify___pify_4.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz";
+        sha1 = "4b2cd25c50d598735c50292224fd8c6df41e3231";
+      };
+    }
+    {
+      name = "pinkie_promise___pinkie_promise_2.0.1.tgz";
+      path = fetchurl {
+        name = "pinkie_promise___pinkie_promise_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz";
+        sha1 = "2135d6dfa7a358c069ac9b178776288228450ffa";
+      };
+    }
+    {
+      name = "pinkie___pinkie_2.0.4.tgz";
+      path = fetchurl {
+        name = "pinkie___pinkie_2.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz";
+        sha1 = "72556b80cfa0d48a974e80e77248e80ed4f7f870";
+      };
+    }
+    {
+      name = "pkg_dir___pkg_dir_2.0.0.tgz";
+      path = fetchurl {
+        name = "pkg_dir___pkg_dir_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz";
+        sha1 = "f6d5d1109e19d63edf428e0bd57e12777615334b";
+      };
+    }
+    {
+      name = "pkg_dir___pkg_dir_3.0.0.tgz";
+      path = fetchurl {
+        name = "pkg_dir___pkg_dir_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz";
+        sha1 = "2749020f239ed990881b1f71210d51eb6523bea3";
+      };
+    }
+    {
+      name = "pkg_dir___pkg_dir_4.2.0.tgz";
+      path = fetchurl {
+        name = "pkg_dir___pkg_dir_4.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz";
+        sha1 = "f099133df7ede422e81d1d8448270eeb3e4261f3";
+      };
+    }
+    {
+      name = "polished___polished_3.7.1.tgz";
+      path = fetchurl {
+        name = "polished___polished_3.7.1.tgz";
+        url  = "https://registry.yarnpkg.com/polished/-/polished-3.7.1.tgz";
+        sha1 = "d1addc87ee16eb5b413c6165eda37600cccb9c11";
+      };
+    }
+    {
+      name = "posix_character_classes___posix_character_classes_0.1.1.tgz";
+      path = fetchurl {
+        name = "posix_character_classes___posix_character_classes_0.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz";
+        sha1 = "01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab";
+      };
+    }
+    {
+      name = "postcss_calc___postcss_calc_8.0.0.tgz";
+      path = fetchurl {
+        name = "postcss_calc___postcss_calc_8.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-8.0.0.tgz";
+        sha1 = "a05b87aacd132740a5db09462a3612453e5df90a";
+      };
+    }
+    {
+      name = "postcss_colormin___postcss_colormin_5.2.0.tgz";
+      path = fetchurl {
+        name = "postcss_colormin___postcss_colormin_5.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-5.2.0.tgz";
+        sha1 = "2b620b88c0ff19683f3349f4cf9e24ebdafb2c88";
+      };
+    }
+    {
+      name = "postcss_convert_values___postcss_convert_values_5.0.1.tgz";
+      path = fetchurl {
+        name = "postcss_convert_values___postcss_convert_values_5.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-5.0.1.tgz";
+        sha1 = "4ec19d6016534e30e3102fdf414e753398645232";
+      };
+    }
+    {
+      name = "postcss_discard_comments___postcss_discard_comments_5.0.1.tgz";
+      path = fetchurl {
+        name = "postcss_discard_comments___postcss_discard_comments_5.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-5.0.1.tgz";
+        sha1 = "9eae4b747cf760d31f2447c27f0619d5718901fe";
+      };
+    }
+    {
+      name = "postcss_discard_duplicates___postcss_discard_duplicates_5.0.1.tgz";
+      path = fetchurl {
+        name = "postcss_discard_duplicates___postcss_discard_duplicates_5.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-5.0.1.tgz";
+        sha1 = "68f7cc6458fe6bab2e46c9f55ae52869f680e66d";
+      };
+    }
+    {
+      name = "postcss_discard_empty___postcss_discard_empty_5.0.1.tgz";
+      path = fetchurl {
+        name = "postcss_discard_empty___postcss_discard_empty_5.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-5.0.1.tgz";
+        sha1 = "ee136c39e27d5d2ed4da0ee5ed02bc8a9f8bf6d8";
+      };
+    }
+    {
+      name = "postcss_discard_overridden___postcss_discard_overridden_5.0.1.tgz";
+      path = fetchurl {
+        name = "postcss_discard_overridden___postcss_discard_overridden_5.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-5.0.1.tgz";
+        sha1 = "454b41f707300b98109a75005ca4ab0ff2743ac6";
+      };
+    }
+    {
+      name = "postcss_html___postcss_html_0.36.0.tgz";
+      path = fetchurl {
+        name = "postcss_html___postcss_html_0.36.0.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-html/-/postcss-html-0.36.0.tgz";
+        sha1 = "b40913f94eaacc2453fd30a1327ad6ee1f88b204";
+      };
+    }
+    {
+      name = "postcss_less___postcss_less_3.1.4.tgz";
+      path = fetchurl {
+        name = "postcss_less___postcss_less_3.1.4.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-less/-/postcss-less-3.1.4.tgz";
+        sha1 = "369f58642b5928ef898ffbc1a6e93c958304c5ad";
+      };
+    }
+    {
+      name = "postcss_media_query_parser___postcss_media_query_parser_0.2.3.tgz";
+      path = fetchurl {
+        name = "postcss_media_query_parser___postcss_media_query_parser_0.2.3.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz";
+        sha1 = "27b39c6f4d94f81b1a73b8f76351c609e5cef244";
+      };
+    }
+    {
+      name = "postcss_merge_longhand___postcss_merge_longhand_5.0.2.tgz";
+      path = fetchurl {
+        name = "postcss_merge_longhand___postcss_merge_longhand_5.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-5.0.2.tgz";
+        sha1 = "277ada51d9a7958e8ef8cf263103c9384b322a41";
+      };
+    }
+    {
+      name = "postcss_merge_rules___postcss_merge_rules_5.0.2.tgz";
+      path = fetchurl {
+        name = "postcss_merge_rules___postcss_merge_rules_5.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-5.0.2.tgz";
+        sha1 = "d6e4d65018badbdb7dcc789c4f39b941305d410a";
+      };
+    }
+    {
+      name = "postcss_minify_font_values___postcss_minify_font_values_5.0.1.tgz";
+      path = fetchurl {
+        name = "postcss_minify_font_values___postcss_minify_font_values_5.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-5.0.1.tgz";
+        sha1 = "a90cefbfdaa075bd3dbaa1b33588bb4dc268addf";
+      };
+    }
+    {
+      name = "postcss_minify_gradients___postcss_minify_gradients_5.0.1.tgz";
+      path = fetchurl {
+        name = "postcss_minify_gradients___postcss_minify_gradients_5.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-5.0.1.tgz";
+        sha1 = "2dc79fd1a1afcb72a9e727bc549ce860f93565d2";
+      };
+    }
+    {
+      name = "postcss_minify_params___postcss_minify_params_5.0.1.tgz";
+      path = fetchurl {
+        name = "postcss_minify_params___postcss_minify_params_5.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-5.0.1.tgz";
+        sha1 = "371153ba164b9d8562842fdcd929c98abd9e5b6c";
+      };
+    }
+    {
+      name = "postcss_minify_selectors___postcss_minify_selectors_5.1.0.tgz";
+      path = fetchurl {
+        name = "postcss_minify_selectors___postcss_minify_selectors_5.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-5.1.0.tgz";
+        sha1 = "4385c845d3979ff160291774523ffa54eafd5a54";
+      };
+    }
+    {
+      name = "postcss_modules_extract_imports___postcss_modules_extract_imports_1.2.1.tgz";
+      path = fetchurl {
+        name = "postcss_modules_extract_imports___postcss_modules_extract_imports_1.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.1.tgz";
+        sha1 = "dc87e34148ec7eab5f791f7cd5849833375b741a";
+      };
+    }
+    {
+      name = "postcss_modules_extract_imports___postcss_modules_extract_imports_2.0.0.tgz";
+      path = fetchurl {
+        name = "postcss_modules_extract_imports___postcss_modules_extract_imports_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz";
+        sha1 = "818719a1ae1da325f9832446b01136eeb493cd7e";
+      };
+    }
+    {
+      name = "postcss_modules_local_by_default___postcss_modules_local_by_default_1.2.0.tgz";
+      path = fetchurl {
+        name = "postcss_modules_local_by_default___postcss_modules_local_by_default_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz";
+        sha1 = "f7d80c398c5a393fa7964466bd19500a7d61c069";
+      };
+    }
+    {
+      name = "postcss_modules_local_by_default___postcss_modules_local_by_default_3.0.2.tgz";
+      path = fetchurl {
+        name = "postcss_modules_local_by_default___postcss_modules_local_by_default_3.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.2.tgz";
+        sha1 = "e8a6561be914aaf3c052876377524ca90dbb7915";
+      };
+    }
+    {
+      name = "postcss_modules_resolve_imports___postcss_modules_resolve_imports_1.3.0.tgz";
+      path = fetchurl {
+        name = "postcss_modules_resolve_imports___postcss_modules_resolve_imports_1.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-modules-resolve-imports/-/postcss-modules-resolve-imports-1.3.0.tgz";
+        sha1 = "398d3000b95ae969420cdf4cd83fa8067f1c5eae";
+      };
+    }
+    {
+      name = "postcss_modules_scope___postcss_modules_scope_1.1.0.tgz";
+      path = fetchurl {
+        name = "postcss_modules_scope___postcss_modules_scope_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz";
+        sha1 = "d6ea64994c79f97b62a72b426fbe6056a194bb90";
+      };
+    }
+    {
+      name = "postcss_modules_scope___postcss_modules_scope_2.2.0.tgz";
+      path = fetchurl {
+        name = "postcss_modules_scope___postcss_modules_scope_2.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz";
+        sha1 = "385cae013cc7743f5a7d7602d1073a89eaae62ee";
+      };
+    }
+    {
+      name = "postcss_modules_values___postcss_modules_values_1.3.0.tgz";
+      path = fetchurl {
+        name = "postcss_modules_values___postcss_modules_values_1.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz";
+        sha1 = "ecffa9d7e192518389f42ad0e83f72aec456ea20";
+      };
+    }
+    {
+      name = "postcss_modules_values___postcss_modules_values_3.0.0.tgz";
+      path = fetchurl {
+        name = "postcss_modules_values___postcss_modules_values_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz";
+        sha1 = "5b5000d6ebae29b4255301b4a3a54574423e7f10";
+      };
+    }
+    {
+      name = "postcss_normalize_charset___postcss_normalize_charset_5.0.1.tgz";
+      path = fetchurl {
+        name = "postcss_normalize_charset___postcss_normalize_charset_5.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-5.0.1.tgz";
+        sha1 = "121559d1bebc55ac8d24af37f67bd4da9efd91d0";
+      };
+    }
+    {
+      name = "postcss_normalize_display_values___postcss_normalize_display_values_5.0.1.tgz";
+      path = fetchurl {
+        name = "postcss_normalize_display_values___postcss_normalize_display_values_5.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-5.0.1.tgz";
+        sha1 = "62650b965981a955dffee83363453db82f6ad1fd";
+      };
+    }
+    {
+      name = "postcss_normalize_positions___postcss_normalize_positions_5.0.1.tgz";
+      path = fetchurl {
+        name = "postcss_normalize_positions___postcss_normalize_positions_5.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-5.0.1.tgz";
+        sha1 = "868f6af1795fdfa86fbbe960dceb47e5f9492fe5";
+      };
+    }
+    {
+      name = "postcss_normalize_repeat_style___postcss_normalize_repeat_style_5.0.1.tgz";
+      path = fetchurl {
+        name = "postcss_normalize_repeat_style___postcss_normalize_repeat_style_5.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.0.1.tgz";
+        sha1 = "cbc0de1383b57f5bb61ddd6a84653b5e8665b2b5";
+      };
+    }
+    {
+      name = "postcss_normalize_string___postcss_normalize_string_5.0.1.tgz";
+      path = fetchurl {
+        name = "postcss_normalize_string___postcss_normalize_string_5.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-5.0.1.tgz";
+        sha1 = "d9eafaa4df78c7a3b973ae346ef0e47c554985b0";
+      };
+    }
+    {
+      name = "postcss_normalize_timing_functions___postcss_normalize_timing_functions_5.0.1.tgz";
+      path = fetchurl {
+        name = "postcss_normalize_timing_functions___postcss_normalize_timing_functions_5.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.0.1.tgz";
+        sha1 = "8ee41103b9130429c6cbba736932b75c5e2cb08c";
+      };
+    }
+    {
+      name = "postcss_normalize_unicode___postcss_normalize_unicode_5.0.1.tgz";
+      path = fetchurl {
+        name = "postcss_normalize_unicode___postcss_normalize_unicode_5.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-5.0.1.tgz";
+        sha1 = "82d672d648a411814aa5bf3ae565379ccd9f5e37";
+      };
+    }
+    {
+      name = "postcss_normalize_url___postcss_normalize_url_5.0.2.tgz";
+      path = fetchurl {
+        name = "postcss_normalize_url___postcss_normalize_url_5.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-5.0.2.tgz";
+        sha1 = "ddcdfb7cede1270740cf3e4dfc6008bd96abc763";
+      };
+    }
+    {
+      name = "postcss_normalize_whitespace___postcss_normalize_whitespace_5.0.1.tgz";
+      path = fetchurl {
+        name = "postcss_normalize_whitespace___postcss_normalize_whitespace_5.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.0.1.tgz";
+        sha1 = "b0b40b5bcac83585ff07ead2daf2dcfbeeef8e9a";
+      };
+    }
+    {
+      name = "postcss_ordered_values___postcss_ordered_values_5.0.2.tgz";
+      path = fetchurl {
+        name = "postcss_ordered_values___postcss_ordered_values_5.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-5.0.2.tgz";
+        sha1 = "1f351426977be00e0f765b3164ad753dac8ed044";
+      };
+    }
+    {
+      name = "postcss_reduce_initial___postcss_reduce_initial_5.0.1.tgz";
+      path = fetchurl {
+        name = "postcss_reduce_initial___postcss_reduce_initial_5.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-5.0.1.tgz";
+        sha1 = "9d6369865b0f6f6f6b165a0ef5dc1a4856c7e946";
+      };
+    }
+    {
+      name = "postcss_reduce_transforms___postcss_reduce_transforms_5.0.1.tgz";
+      path = fetchurl {
+        name = "postcss_reduce_transforms___postcss_reduce_transforms_5.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-5.0.1.tgz";
+        sha1 = "93c12f6a159474aa711d5269923e2383cedcf640";
+      };
+    }
+    {
+      name = "postcss_resolve_nested_selector___postcss_resolve_nested_selector_0.1.1.tgz";
+      path = fetchurl {
+        name = "postcss_resolve_nested_selector___postcss_resolve_nested_selector_0.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz";
+        sha1 = "29ccbc7c37dedfac304e9fff0bf1596b3f6a0e4e";
+      };
+    }
+    {
+      name = "postcss_safe_parser___postcss_safe_parser_4.0.2.tgz";
+      path = fetchurl {
+        name = "postcss_safe_parser___postcss_safe_parser_4.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-safe-parser/-/postcss-safe-parser-4.0.2.tgz";
+        sha1 = "a6d4e48f0f37d9f7c11b2a581bf00f8ba4870b96";
+      };
+    }
+    {
+      name = "postcss_sass___postcss_sass_0.4.4.tgz";
+      path = fetchurl {
+        name = "postcss_sass___postcss_sass_0.4.4.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-sass/-/postcss-sass-0.4.4.tgz";
+        sha1 = "91f0f3447b45ce373227a98b61f8d8f0785285a3";
+      };
+    }
+    {
+      name = "postcss_scss___postcss_scss_2.1.1.tgz";
+      path = fetchurl {
+        name = "postcss_scss___postcss_scss_2.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-scss/-/postcss-scss-2.1.1.tgz";
+        sha1 = "ec3a75fa29a55e016b90bf3269026c53c1d2b383";
+      };
+    }
+    {
+      name = "postcss_selector_parser___postcss_selector_parser_6.0.2.tgz";
+      path = fetchurl {
+        name = "postcss_selector_parser___postcss_selector_parser_6.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz";
+        sha1 = "934cf799d016c83411859e09dcecade01286ec5c";
+      };
+    }
+    {
+      name = "postcss_selector_parser___postcss_selector_parser_6.0.6.tgz";
+      path = fetchurl {
+        name = "postcss_selector_parser___postcss_selector_parser_6.0.6.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz";
+        sha1 = "2c5bba8174ac2f6981ab631a42ab0ee54af332ea";
+      };
+    }
+    {
+      name = "postcss_svgo___postcss_svgo_5.0.2.tgz";
+      path = fetchurl {
+        name = "postcss_svgo___postcss_svgo_5.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-5.0.2.tgz";
+        sha1 = "bc73c4ea4c5a80fbd4b45e29042c34ceffb9257f";
+      };
+    }
+    {
+      name = "postcss_syntax___postcss_syntax_0.36.2.tgz";
+      path = fetchurl {
+        name = "postcss_syntax___postcss_syntax_0.36.2.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-syntax/-/postcss-syntax-0.36.2.tgz";
+        sha1 = "f08578c7d95834574e5593a82dfbfa8afae3b51c";
+      };
+    }
+    {
+      name = "postcss_unique_selectors___postcss_unique_selectors_5.0.1.tgz";
+      path = fetchurl {
+        name = "postcss_unique_selectors___postcss_unique_selectors_5.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-5.0.1.tgz";
+        sha1 = "3be5c1d7363352eff838bd62b0b07a0abad43bfc";
+      };
+    }
+    {
+      name = "postcss_value_parser___postcss_value_parser_4.1.0.tgz";
+      path = fetchurl {
+        name = "postcss_value_parser___postcss_value_parser_4.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz";
+        sha1 = "443f6a20ced6481a2bda4fa8532a6e55d789a2cb";
+      };
+    }
+    {
+      name = "postcss___postcss_6.0.23.tgz";
+      path = fetchurl {
+        name = "postcss___postcss_6.0.23.tgz";
+        url  = "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz";
+        sha1 = "61c82cc328ac60e677645f979054eb98bc0e3324";
+      };
+    }
+    {
+      name = "postcss___postcss_7.0.35.tgz";
+      path = fetchurl {
+        name = "postcss___postcss_7.0.35.tgz";
+        url  = "https://registry.yarnpkg.com/postcss/-/postcss-7.0.35.tgz";
+        sha1 = "d2be00b998f7f211d8a276974079f2e92b970e24";
+      };
+    }
+    {
+      name = "postcss___postcss_7.0.32.tgz";
+      path = fetchurl {
+        name = "postcss___postcss_7.0.32.tgz";
+        url  = "https://registry.yarnpkg.com/postcss/-/postcss-7.0.32.tgz";
+        sha1 = "4310d6ee347053da3433db2be492883d62cec59d";
+      };
+    }
+    {
+      name = "postcss___postcss_8.3.1.tgz";
+      path = fetchurl {
+        name = "postcss___postcss_8.3.1.tgz";
+        url  = "https://registry.yarnpkg.com/postcss/-/postcss-8.3.1.tgz";
+        sha1 = "71f380151c227f83b898294a46481f689f86b70a";
+      };
+    }
+    {
+      name = "prelude_ls___prelude_ls_1.2.1.tgz";
+      path = fetchurl {
+        name = "prelude_ls___prelude_ls_1.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz";
+        sha1 = "debc6489d7a6e6b0e7611888cec880337d316396";
+      };
+    }
+    {
+      name = "prismjs___prismjs_1.23.0.tgz";
+      path = fetchurl {
+        name = "prismjs___prismjs_1.23.0.tgz";
+        url  = "https://registry.yarnpkg.com/prismjs/-/prismjs-1.23.0.tgz";
+        sha1 = "d3b3967f7d72440690497652a9d40ff046067f33";
+      };
+    }
+    {
+      name = "private___private_0.1.8.tgz";
+      path = fetchurl {
+        name = "private___private_0.1.8.tgz";
+        url  = "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz";
+        sha1 = "2381edb3689f7a53d653190060fcf822d2f368ff";
+      };
+    }
+    {
+      name = "process_nextick_args___process_nextick_args_2.0.1.tgz";
+      path = fetchurl {
+        name = "process_nextick_args___process_nextick_args_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz";
+        sha1 = "7820d9b16120cc55ca9ae7792680ae7dba6d7fe2";
+      };
+    }
+    {
+      name = "process___process_0.11.10.tgz";
+      path = fetchurl {
+        name = "process___process_0.11.10.tgz";
+        url  = "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz";
+        sha1 = "7332300e840161bda3e69a1d1d91a7d4bc16f182";
+      };
+    }
+    {
+      name = "progress___progress_2.0.3.tgz";
+      path = fetchurl {
+        name = "progress___progress_2.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz";
+        sha1 = "7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8";
+      };
+    }
+    {
+      name = "promise_inflight___promise_inflight_1.0.1.tgz";
+      path = fetchurl {
+        name = "promise_inflight___promise_inflight_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz";
+        sha1 = "98472870bf228132fcbdd868129bad12c3c029e3";
+      };
+    }
+    {
+      name = "prop_types___prop_types_15.7.2.tgz";
+      path = fetchurl {
+        name = "prop_types___prop_types_15.7.2.tgz";
+        url  = "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz";
+        sha1 = "52c41e75b8c87e72b9d9360e0206b99dcbffa6c5";
+      };
+    }
+    {
+      name = "prr___prr_1.0.1.tgz";
+      path = fetchurl {
+        name = "prr___prr_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz";
+        sha1 = "d3fc114ba06995a45ec6893f484ceb1d78f5f476";
+      };
+    }
+    {
+      name = "public_encrypt___public_encrypt_4.0.3.tgz";
+      path = fetchurl {
+        name = "public_encrypt___public_encrypt_4.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz";
+        sha1 = "4fcc9d77a07e48ba7527e7cbe0de33d0701331e0";
+      };
+    }
+    {
+      name = "pump___pump_2.0.1.tgz";
+      path = fetchurl {
+        name = "pump___pump_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz";
+        sha1 = "12399add6e4cf7526d973cbc8b5ce2e2908b3909";
+      };
+    }
+    {
+      name = "pump___pump_3.0.0.tgz";
+      path = fetchurl {
+        name = "pump___pump_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz";
+        sha1 = "b4a2116815bde2f4e1ea602354e8c75565107a64";
+      };
+    }
+    {
+      name = "pumpify___pumpify_1.5.1.tgz";
+      path = fetchurl {
+        name = "pumpify___pumpify_1.5.1.tgz";
+        url  = "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz";
+        sha1 = "36513be246ab27570b1a374a5ce278bfd74370ce";
+      };
+    }
+    {
+      name = "punycode___punycode_1.3.2.tgz";
+      path = fetchurl {
+        name = "punycode___punycode_1.3.2.tgz";
+        url  = "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz";
+        sha1 = "9653a036fb7c1ee42342f2325cceefea3926c48d";
+      };
+    }
+    {
+      name = "punycode___punycode_1.4.1.tgz";
+      path = fetchurl {
+        name = "punycode___punycode_1.4.1.tgz";
+        url  = "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz";
+        sha1 = "c0d5a63b2718800ad8e1eb0fa5269c84dd41845e";
+      };
+    }
+    {
+      name = "punycode___punycode_2.1.1.tgz";
+      path = fetchurl {
+        name = "punycode___punycode_2.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz";
+        sha1 = "b58b010ac40c22c5657616c8d2c2c02c7bf479ec";
+      };
+    }
+    {
+      name = "querystring_es3___querystring_es3_0.2.1.tgz";
+      path = fetchurl {
+        name = "querystring_es3___querystring_es3_0.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz";
+        sha1 = "9ec61f79049875707d69414596fd907a4d711e73";
+      };
+    }
+    {
+      name = "querystring___querystring_0.2.0.tgz";
+      path = fetchurl {
+        name = "querystring___querystring_0.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz";
+        sha1 = "b209849203bb25df820da756e747005878521620";
+      };
+    }
+    {
+      name = "queue_microtask___queue_microtask_1.2.3.tgz";
+      path = fetchurl {
+        name = "queue_microtask___queue_microtask_1.2.3.tgz";
+        url  = "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz";
+        sha1 = "4929228bbc724dfac43e0efb058caf7b6cfb6243";
+      };
+    }
+    {
+      name = "quick_lru___quick_lru_4.0.1.tgz";
+      path = fetchurl {
+        name = "quick_lru___quick_lru_4.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz";
+        sha1 = "5b8878f113a58217848c6482026c73e1ba57727f";
+      };
+    }
+    {
+      name = "randombytes___randombytes_2.1.0.tgz";
+      path = fetchurl {
+        name = "randombytes___randombytes_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz";
+        sha1 = "df6f84372f0270dc65cdf6291349ab7a473d4f2a";
+      };
+    }
+    {
+      name = "randomfill___randomfill_1.0.4.tgz";
+      path = fetchurl {
+        name = "randomfill___randomfill_1.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz";
+        sha1 = "c92196fc86ab42be983f1bf31778224931d61458";
+      };
+    }
+    {
+      name = "react_is___react_is_16.13.1.tgz";
+      path = fetchurl {
+        name = "react_is___react_is_16.13.1.tgz";
+        url  = "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz";
+        sha1 = "789729a4dc36de2999dc156dd6c1d9c18cea56a4";
+      };
+    }
+    {
+      name = "react_tabs___react_tabs_3.2.0.tgz";
+      path = fetchurl {
+        name = "react_tabs___react_tabs_3.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/react-tabs/-/react-tabs-3.2.0.tgz";
+        sha1 = "0fd8d595ef26d3684da876c27a3cc90392dffb40";
+      };
+    }
+    {
+      name = "read_pkg_up___read_pkg_up_2.0.0.tgz";
+      path = fetchurl {
+        name = "read_pkg_up___read_pkg_up_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz";
+        sha1 = "6b72a8048984e0c41e79510fd5e9fa99b3b549be";
+      };
+    }
+    {
+      name = "read_pkg_up___read_pkg_up_7.0.1.tgz";
+      path = fetchurl {
+        name = "read_pkg_up___read_pkg_up_7.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz";
+        sha1 = "f3a6135758459733ae2b95638056e1854e7ef507";
+      };
+    }
+    {
+      name = "read_pkg___read_pkg_2.0.0.tgz";
+      path = fetchurl {
+        name = "read_pkg___read_pkg_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz";
+        sha1 = "8ef1c0623c6a6db0dc6713c4bfac46332b2368f8";
+      };
+    }
+    {
+      name = "read_pkg___read_pkg_5.2.0.tgz";
+      path = fetchurl {
+        name = "read_pkg___read_pkg_5.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz";
+        sha1 = "7bf295438ca5a33e56cd30e053b34ee7250c93cc";
+      };
+    }
+    {
+      name = "readable_stream___readable_stream_2.3.7.tgz";
+      path = fetchurl {
+        name = "readable_stream___readable_stream_2.3.7.tgz";
+        url  = "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz";
+        sha1 = "1eca1cf711aef814c04f62252a36a62f6cb23b57";
+      };
+    }
+    {
+      name = "readable_stream___readable_stream_1.1.13.tgz";
+      path = fetchurl {
+        name = "readable_stream___readable_stream_1.1.13.tgz";
+        url  = "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.13.tgz";
+        sha1 = "f6eef764f514c89e2b9e23146a75ba106756d23e";
+      };
+    }
+    {
+      name = "readable_stream___readable_stream_3.6.0.tgz";
+      path = fetchurl {
+        name = "readable_stream___readable_stream_3.6.0.tgz";
+        url  = "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz";
+        sha1 = "337bbda3adc0706bd3e024426a286d4b4b2c9198";
+      };
+    }
+    {
+      name = "readdirp___readdirp_2.2.1.tgz";
+      path = fetchurl {
+        name = "readdirp___readdirp_2.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz";
+        sha1 = "0e87622a3325aa33e892285caf8b4e846529a525";
+      };
+    }
+    {
+      name = "readdirp___readdirp_3.4.0.tgz";
+      path = fetchurl {
+        name = "readdirp___readdirp_3.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/readdirp/-/readdirp-3.4.0.tgz";
+        sha1 = "9fdccdf9e9155805449221ac645e8303ab5b9ada";
+      };
+    }
+    {
+      name = "redent___redent_3.0.0.tgz";
+      path = fetchurl {
+        name = "redent___redent_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz";
+        sha1 = "e557b7998316bb53c9f1f56fa626352c6963059f";
+      };
+    }
+    {
+      name = "redoc___redoc_2.0.0_rc.48.tgz";
+      path = fetchurl {
+        name = "redoc___redoc_2.0.0_rc.48.tgz";
+        url  = "https://registry.yarnpkg.com/redoc/-/redoc-2.0.0-rc.48.tgz";
+        sha1 = "5303cff67af5cba8a2b48dc1347a9854d45be835";
+      };
+    }
+    {
+      name = "reftools___reftools_1.1.8.tgz";
+      path = fetchurl {
+        name = "reftools___reftools_1.1.8.tgz";
+        url  = "https://registry.yarnpkg.com/reftools/-/reftools-1.1.8.tgz";
+        sha1 = "cc08fd67eb913d779fd330657d010cc080c7d643";
+      };
+    }
+    {
+      name = "regenerate___regenerate_1.4.0.tgz";
+      path = fetchurl {
+        name = "regenerate___regenerate_1.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz";
+        sha1 = "4a856ec4b56e4077c557589cae85e7a4c8869a11";
+      };
+    }
+    {
+      name = "regenerator_runtime___regenerator_runtime_0.10.5.tgz";
+      path = fetchurl {
+        name = "regenerator_runtime___regenerator_runtime_0.10.5.tgz";
+        url  = "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz";
+        sha1 = "336c3efc1220adcedda2c9fab67b5a7955a33658";
+      };
+    }
+    {
+      name = "regenerator_runtime___regenerator_runtime_0.11.1.tgz";
+      path = fetchurl {
+        name = "regenerator_runtime___regenerator_runtime_0.11.1.tgz";
+        url  = "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz";
+        sha1 = "be05ad7f9bf7d22e056f9726cee5017fbf19e2e9";
+      };
+    }
+    {
+      name = "regenerator_runtime___regenerator_runtime_0.13.7.tgz";
+      path = fetchurl {
+        name = "regenerator_runtime___regenerator_runtime_0.13.7.tgz";
+        url  = "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz";
+        sha1 = "cac2dacc8a1ea675feaabaeb8ae833898ae46f55";
+      };
+    }
+    {
+      name = "regex_not___regex_not_1.0.2.tgz";
+      path = fetchurl {
+        name = "regex_not___regex_not_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz";
+        sha1 = "1f4ece27e00b0b65e0247a6810e6a85d83a5752c";
+      };
+    }
+    {
+      name = "regexpp___regexpp_3.1.0.tgz";
+      path = fetchurl {
+        name = "regexpp___regexpp_3.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz";
+        sha1 = "206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2";
+      };
+    }
+    {
+      name = "regexpu_core___regexpu_core_1.0.0.tgz";
+      path = fetchurl {
+        name = "regexpu_core___regexpu_core_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-1.0.0.tgz";
+        sha1 = "86a763f58ee4d7c2f6b102e4764050de7ed90c6b";
+      };
+    }
+    {
+      name = "regjsgen___regjsgen_0.2.0.tgz";
+      path = fetchurl {
+        name = "regjsgen___regjsgen_0.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz";
+        sha1 = "6c016adeac554f75823fe37ac05b92d5a4edb1f7";
+      };
+    }
+    {
+      name = "regjsparser___regjsparser_0.1.5.tgz";
+      path = fetchurl {
+        name = "regjsparser___regjsparser_0.1.5.tgz";
+        url  = "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz";
+        sha1 = "7ee8f84dc6fa792d3fd0ae228d24bd949ead205c";
+      };
+    }
+    {
+      name = "remark_parse___remark_parse_9.0.0.tgz";
+      path = fetchurl {
+        name = "remark_parse___remark_parse_9.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/remark-parse/-/remark-parse-9.0.0.tgz";
+        sha1 = "4d20a299665880e4f4af5d90b7c7b8a935853640";
+      };
+    }
+    {
+      name = "remark_stringify___remark_stringify_9.0.1.tgz";
+      path = fetchurl {
+        name = "remark_stringify___remark_stringify_9.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/remark-stringify/-/remark-stringify-9.0.1.tgz";
+        sha1 = "576d06e910548b0a7191a71f27b33f1218862894";
+      };
+    }
+    {
+      name = "remark___remark_13.0.0.tgz";
+      path = fetchurl {
+        name = "remark___remark_13.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/remark/-/remark-13.0.0.tgz";
+        sha1 = "d15d9bf71a402f40287ebe36067b66d54868e425";
+      };
+    }
+    {
+      name = "remove_trailing_separator___remove_trailing_separator_1.1.0.tgz";
+      path = fetchurl {
+        name = "remove_trailing_separator___remove_trailing_separator_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz";
+        sha1 = "c24bce2a283adad5bc3f58e0d48249b92379d8ef";
+      };
+    }
+    {
+      name = "repeat_element___repeat_element_1.1.3.tgz";
+      path = fetchurl {
+        name = "repeat_element___repeat_element_1.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz";
+        sha1 = "782e0d825c0c5a3bb39731f84efee6b742e6b1ce";
+      };
+    }
+    {
+      name = "repeat_string___repeat_string_1.6.1.tgz";
+      path = fetchurl {
+        name = "repeat_string___repeat_string_1.6.1.tgz";
+        url  = "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz";
+        sha1 = "8dcae470e1c88abc2d600fff4a776286da75e637";
+      };
+    }
+    {
+      name = "repeating___repeating_2.0.1.tgz";
+      path = fetchurl {
+        name = "repeating___repeating_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz";
+        sha1 = "5214c53a926d3552707527fbab415dbc08d06dda";
+      };
+    }
+    {
+      name = "require_directory___require_directory_2.1.1.tgz";
+      path = fetchurl {
+        name = "require_directory___require_directory_2.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz";
+        sha1 = "8c64ad5fd30dab1c976e2344ffe7f792a6a6df42";
+      };
+    }
+    {
+      name = "require_from_string___require_from_string_2.0.2.tgz";
+      path = fetchurl {
+        name = "require_from_string___require_from_string_2.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz";
+        sha1 = "89a7fdd938261267318eafe14f9c32e598c36909";
+      };
+    }
+    {
+      name = "require_main_filename___require_main_filename_2.0.0.tgz";
+      path = fetchurl {
+        name = "require_main_filename___require_main_filename_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz";
+        sha1 = "d0b329ecc7cc0f61649f62215be69af54aa8989b";
+      };
+    }
+    {
+      name = "resolve_cwd___resolve_cwd_2.0.0.tgz";
+      path = fetchurl {
+        name = "resolve_cwd___resolve_cwd_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz";
+        sha1 = "00a9f7387556e27038eae232caa372a6a59b665a";
+      };
+    }
+    {
+      name = "resolve_dir___resolve_dir_1.0.1.tgz";
+      path = fetchurl {
+        name = "resolve_dir___resolve_dir_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz";
+        sha1 = "79a40644c362be82f26effe739c9bb5382046f43";
+      };
+    }
+    {
+      name = "resolve_from___resolve_from_3.0.0.tgz";
+      path = fetchurl {
+        name = "resolve_from___resolve_from_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz";
+        sha1 = "b22c7af7d9d6881bc8b6e653335eebcb0a188748";
+      };
+    }
+    {
+      name = "resolve_from___resolve_from_4.0.0.tgz";
+      path = fetchurl {
+        name = "resolve_from___resolve_from_4.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz";
+        sha1 = "4abcd852ad32dd7baabfe9b40e00a36db5f392e6";
+      };
+    }
+    {
+      name = "resolve_from___resolve_from_5.0.0.tgz";
+      path = fetchurl {
+        name = "resolve_from___resolve_from_5.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz";
+        sha1 = "c35225843df8f776df21c57557bc087e9dfdfc69";
+      };
+    }
+    {
+      name = "resolve_url___resolve_url_0.2.1.tgz";
+      path = fetchurl {
+        name = "resolve_url___resolve_url_0.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz";
+        sha1 = "2c637fe77c893afd2a663fe21aa9080068e2052a";
+      };
+    }
+    {
+      name = "resolve___resolve_1.20.0.tgz";
+      path = fetchurl {
+        name = "resolve___resolve_1.20.0.tgz";
+        url  = "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz";
+        sha1 = "629a013fb3f70755d6f0b7935cc1c2c5378b1975";
+      };
+    }
+    {
+      name = "resolve___resolve_1.17.0.tgz";
+      path = fetchurl {
+        name = "resolve___resolve_1.17.0.tgz";
+        url  = "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz";
+        sha1 = "b25941b54968231cc2d1bb76a79cb7f2c0bf8444";
+      };
+    }
+    {
+      name = "resolve___resolve_1.14.0.tgz";
+      path = fetchurl {
+        name = "resolve___resolve_1.14.0.tgz";
+        url  = "https://registry.yarnpkg.com/resolve/-/resolve-1.14.0.tgz";
+        sha1 = "6d14c6f9db9f8002071332b600039abf82053f64";
+      };
+    }
+    {
+      name = "ret___ret_0.1.15.tgz";
+      path = fetchurl {
+        name = "ret___ret_0.1.15.tgz";
+        url  = "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz";
+        sha1 = "b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc";
+      };
+    }
+    {
+      name = "reusify___reusify_1.0.4.tgz";
+      path = fetchurl {
+        name = "reusify___reusify_1.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz";
+        sha1 = "90da382b1e126efc02146e90845a88db12925d76";
+      };
+    }
+    {
+      name = "rgb_regex___rgb_regex_1.0.1.tgz";
+      path = fetchurl {
+        name = "rgb_regex___rgb_regex_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz";
+        sha1 = "c0e0d6882df0e23be254a475e8edd41915feaeb1";
+      };
+    }
+    {
+      name = "rgba_regex___rgba_regex_1.0.0.tgz";
+      path = fetchurl {
+        name = "rgba_regex___rgba_regex_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz";
+        sha1 = "43374e2e2ca0968b0ef1523460b7d730ff22eeb3";
+      };
+    }
+    {
+      name = "rimraf___rimraf_2.6.3.tgz";
+      path = fetchurl {
+        name = "rimraf___rimraf_2.6.3.tgz";
+        url  = "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz";
+        sha1 = "b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab";
+      };
+    }
+    {
+      name = "rimraf___rimraf_2.7.1.tgz";
+      path = fetchurl {
+        name = "rimraf___rimraf_2.7.1.tgz";
+        url  = "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz";
+        sha1 = "35797f13a7fdadc566142c29d4f07ccad483e3ec";
+      };
+    }
+    {
+      name = "rimraf___rimraf_3.0.2.tgz";
+      path = fetchurl {
+        name = "rimraf___rimraf_3.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz";
+        sha1 = "f1a5402ba6220ad52cc1282bac1ae3aa49fd061a";
+      };
+    }
+    {
+      name = "ripemd160___ripemd160_2.0.2.tgz";
+      path = fetchurl {
+        name = "ripemd160___ripemd160_2.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz";
+        sha1 = "a1c1a6f624751577ba5d07914cbc92850585890c";
+      };
+    }
+    {
+      name = "run_parallel___run_parallel_1.2.0.tgz";
+      path = fetchurl {
+        name = "run_parallel___run_parallel_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz";
+        sha1 = "66d1368da7bdf921eb9d95bd1a9229e7f21a43ee";
+      };
+    }
+    {
+      name = "run_queue___run_queue_1.0.3.tgz";
+      path = fetchurl {
+        name = "run_queue___run_queue_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz";
+        sha1 = "e848396f057d223f24386924618e25694161ec47";
+      };
+    }
+    {
+      name = "rw___rw_1.3.3.tgz";
+      path = fetchurl {
+        name = "rw___rw_1.3.3.tgz";
+        url  = "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz";
+        sha1 = "3f862dfa91ab766b14885ef4d01124bfda074fb4";
+      };
+    }
+    {
+      name = "safe_buffer___safe_buffer_5.2.1.tgz";
+      path = fetchurl {
+        name = "safe_buffer___safe_buffer_5.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz";
+        sha1 = "1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6";
+      };
+    }
+    {
+      name = "safe_buffer___safe_buffer_5.1.2.tgz";
+      path = fetchurl {
+        name = "safe_buffer___safe_buffer_5.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz";
+        sha1 = "991ec69d296e0313747d59bdfd2b745c35f8828d";
+      };
+    }
+    {
+      name = "safe_regex___safe_regex_1.1.0.tgz";
+      path = fetchurl {
+        name = "safe_regex___safe_regex_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz";
+        sha1 = "40a3669f3b077d1e943d44629e157dd48023bf2e";
+      };
+    }
+    {
+      name = "safer_buffer___safer_buffer_2.1.2.tgz";
+      path = fetchurl {
+        name = "safer_buffer___safer_buffer_2.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz";
+        sha1 = "44fa161b0187b9549dd84bb91802f9bd8385cd6a";
+      };
+    }
+    {
+      name = "schema_utils___schema_utils_1.0.0.tgz";
+      path = fetchurl {
+        name = "schema_utils___schema_utils_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz";
+        sha1 = "0b79a93204d7b600d4b2850d1f66c2a34951c770";
+      };
+    }
+    {
+      name = "schema_utils___schema_utils_2.7.0.tgz";
+      path = fetchurl {
+        name = "schema_utils___schema_utils_2.7.0.tgz";
+        url  = "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.0.tgz";
+        sha1 = "17151f76d8eae67fbbf77960c33c676ad9f4efc7";
+      };
+    }
+    {
+      name = "schema_utils___schema_utils_3.0.0.tgz";
+      path = fetchurl {
+        name = "schema_utils___schema_utils_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.0.0.tgz";
+        sha1 = "67502f6aa2b66a2d4032b4279a2944978a0913ef";
+      };
+    }
+    {
+      name = "seekout___seekout_1.0.2.tgz";
+      path = fetchurl {
+        name = "seekout___seekout_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/seekout/-/seekout-1.0.2.tgz";
+        sha1 = "09ba9f1bd5b46fbb134718eb19a68382cbb1b9c9";
+      };
+    }
+    {
+      name = "select___select_1.1.2.tgz";
+      path = fetchurl {
+        name = "select___select_1.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/select/-/select-1.1.2.tgz";
+        sha1 = "0e7350acdec80b1108528786ec1d4418d11b396d";
+      };
+    }
+    {
+      name = "semver___semver_5.7.1.tgz";
+      path = fetchurl {
+        name = "semver___semver_5.7.1.tgz";
+        url  = "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz";
+        sha1 = "a954f931aeba508d307bbf069eff0c01c96116f7";
+      };
+    }
+    {
+      name = "semver___semver_6.3.0.tgz";
+      path = fetchurl {
+        name = "semver___semver_6.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz";
+        sha1 = "ee0a64c8af5e8ceea67687b133761e1becbd1d3d";
+      };
+    }
+    {
+      name = "semver___semver_7.3.2.tgz";
+      path = fetchurl {
+        name = "semver___semver_7.3.2.tgz";
+        url  = "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz";
+        sha1 = "604962b052b81ed0786aae84389ffba70ffd3938";
+      };
+    }
+    {
+      name = "semver___semver_7.3.5.tgz";
+      path = fetchurl {
+        name = "semver___semver_7.3.5.tgz";
+        url  = "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz";
+        sha1 = "0b621c879348d8998e4b0e4be94b3f12e6018ef7";
+      };
+    }
+    {
+      name = "serialize_javascript___serialize_javascript_3.1.0.tgz";
+      path = fetchurl {
+        name = "serialize_javascript___serialize_javascript_3.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-3.1.0.tgz";
+        sha1 = "8bf3a9170712664ef2561b44b691eafe399214ea";
+      };
+    }
+    {
+      name = "serialize_javascript___serialize_javascript_4.0.0.tgz";
+      path = fetchurl {
+        name = "serialize_javascript___serialize_javascript_4.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz";
+        sha1 = "b525e1238489a5ecfc42afacc3fe99e666f4b1aa";
+      };
+    }
+    {
+      name = "set_blocking___set_blocking_2.0.0.tgz";
+      path = fetchurl {
+        name = "set_blocking___set_blocking_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz";
+        sha1 = "045f9782d011ae9a6803ddd382b24392b3d890f7";
+      };
+    }
+    {
+      name = "set_value___set_value_2.0.1.tgz";
+      path = fetchurl {
+        name = "set_value___set_value_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz";
+        sha1 = "a18d40530e6f07de4228c7defe4227af8cad005b";
+      };
+    }
+    {
+      name = "setimmediate___setimmediate_1.0.5.tgz";
+      path = fetchurl {
+        name = "setimmediate___setimmediate_1.0.5.tgz";
+        url  = "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz";
+        sha1 = "290cbb232e306942d7d7ea9b83732ab7856f8285";
+      };
+    }
+    {
+      name = "sha.js___sha.js_2.4.11.tgz";
+      path = fetchurl {
+        name = "sha.js___sha.js_2.4.11.tgz";
+        url  = "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz";
+        sha1 = "37a5cf0b81ecbc6943de109ba2960d1b26584ae7";
+      };
+    }
+    {
+      name = "shebang_command___shebang_command_1.2.0.tgz";
+      path = fetchurl {
+        name = "shebang_command___shebang_command_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz";
+        sha1 = "44aac65b695b03398968c39f363fee5deafdf1ea";
+      };
+    }
+    {
+      name = "shebang_command___shebang_command_2.0.0.tgz";
+      path = fetchurl {
+        name = "shebang_command___shebang_command_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz";
+        sha1 = "ccd0af4f8835fbdc265b82461aaf0c36663f34ea";
+      };
+    }
+    {
+      name = "shebang_regex___shebang_regex_1.0.0.tgz";
+      path = fetchurl {
+        name = "shebang_regex___shebang_regex_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz";
+        sha1 = "da42f49740c0b42db2ca9728571cb190c98efea3";
+      };
+    }
+    {
+      name = "shebang_regex___shebang_regex_3.0.0.tgz";
+      path = fetchurl {
+        name = "shebang_regex___shebang_regex_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz";
+        sha1 = "ae16f1644d873ecad843b0307b143362d4c42172";
+      };
+    }
+    {
+      name = "shelljs___shelljs_0.3.0.tgz";
+      path = fetchurl {
+        name = "shelljs___shelljs_0.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/shelljs/-/shelljs-0.3.0.tgz";
+        sha1 = "3596e6307a781544f591f37da618360f31db57b1";
+      };
+    }
+    {
+      name = "should_equal___should_equal_2.0.0.tgz";
+      path = fetchurl {
+        name = "should_equal___should_equal_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/should-equal/-/should-equal-2.0.0.tgz";
+        sha1 = "6072cf83047360867e68e98b09d71143d04ee0c3";
+      };
+    }
+    {
+      name = "should_format___should_format_3.0.3.tgz";
+      path = fetchurl {
+        name = "should_format___should_format_3.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/should-format/-/should-format-3.0.3.tgz";
+        sha1 = "9bfc8f74fa39205c53d38c34d717303e277124f1";
+      };
+    }
+    {
+      name = "should_type_adaptors___should_type_adaptors_1.1.0.tgz";
+      path = fetchurl {
+        name = "should_type_adaptors___should_type_adaptors_1.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz";
+        sha1 = "401e7f33b5533033944d5cd8bf2b65027792e27a";
+      };
+    }
+    {
+      name = "should_type___should_type_1.4.0.tgz";
+      path = fetchurl {
+        name = "should_type___should_type_1.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/should-type/-/should-type-1.4.0.tgz";
+        sha1 = "0756d8ce846dfd09843a6947719dfa0d4cff5cf3";
+      };
+    }
+    {
+      name = "should_util___should_util_1.0.1.tgz";
+      path = fetchurl {
+        name = "should_util___should_util_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/should-util/-/should-util-1.0.1.tgz";
+        sha1 = "fb0d71338f532a3a149213639e2d32cbea8bcb28";
+      };
+    }
+    {
+      name = "should___should_13.2.3.tgz";
+      path = fetchurl {
+        name = "should___should_13.2.3.tgz";
+        url  = "https://registry.yarnpkg.com/should/-/should-13.2.3.tgz";
+        sha1 = "96d8e5acf3e97b49d89b51feaa5ae8d07ef58f10";
+      };
+    }
+    {
+      name = "signal_exit___signal_exit_3.0.3.tgz";
+      path = fetchurl {
+        name = "signal_exit___signal_exit_3.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz";
+        sha1 = "a1410c2edd8f077b08b4e253c8eacfcaf057461c";
+      };
+    }
+    {
+      name = "slash___slash_1.0.0.tgz";
+      path = fetchurl {
+        name = "slash___slash_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz";
+        sha1 = "c41f2f6c39fc16d1cd17ad4b5d896114ae470d55";
+      };
+    }
+    {
+      name = "slash___slash_3.0.0.tgz";
+      path = fetchurl {
+        name = "slash___slash_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz";
+        sha1 = "6539be870c165adbd5240220dbe361f1bc4d4634";
+      };
+    }
+    {
+      name = "slice_ansi___slice_ansi_2.1.0.tgz";
+      path = fetchurl {
+        name = "slice_ansi___slice_ansi_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz";
+        sha1 = "cacd7693461a637a5788d92a7dd4fba068e81636";
+      };
+    }
+    {
+      name = "slice_ansi___slice_ansi_4.0.0.tgz";
+      path = fetchurl {
+        name = "slice_ansi___slice_ansi_4.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz";
+        sha1 = "500e8dd0fd55b05815086255b3195adf2a45fe6b";
+      };
+    }
+    {
+      name = "slugify___slugify_1.4.7.tgz";
+      path = fetchurl {
+        name = "slugify___slugify_1.4.7.tgz";
+        url  = "https://registry.yarnpkg.com/slugify/-/slugify-1.4.7.tgz";
+        sha1 = "e42359d505afd84a44513280868e31202a79a628";
+      };
+    }
+    {
+      name = "snapdragon_node___snapdragon_node_2.1.1.tgz";
+      path = fetchurl {
+        name = "snapdragon_node___snapdragon_node_2.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz";
+        sha1 = "6c175f86ff14bdb0724563e8f3c1b021a286853b";
+      };
+    }
+    {
+      name = "snapdragon_util___snapdragon_util_3.0.1.tgz";
+      path = fetchurl {
+        name = "snapdragon_util___snapdragon_util_3.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz";
+        sha1 = "f956479486f2acd79700693f6f7b805e45ab56e2";
+      };
+    }
+    {
+      name = "snapdragon___snapdragon_0.8.2.tgz";
+      path = fetchurl {
+        name = "snapdragon___snapdragon_0.8.2.tgz";
+        url  = "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz";
+        sha1 = "64922e7c565b0e14204ba1aa7d6964278d25182d";
+      };
+    }
+    {
+      name = "source_list_map___source_list_map_2.0.1.tgz";
+      path = fetchurl {
+        name = "source_list_map___source_list_map_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz";
+        sha1 = "3993bd873bfc48479cca9ea3a547835c7c154b34";
+      };
+    }
+    {
+      name = "source_map_js___source_map_js_0.6.2.tgz";
+      path = fetchurl {
+        name = "source_map_js___source_map_js_0.6.2.tgz";
+        url  = "https://registry.yarnpkg.com/source-map-js/-/source-map-js-0.6.2.tgz";
+        sha1 = "0bb5de631b41cfbda6cfba8bd05a80efdfd2385e";
+      };
+    }
+    {
+      name = "source_map_resolve___source_map_resolve_0.5.3.tgz";
+      path = fetchurl {
+        name = "source_map_resolve___source_map_resolve_0.5.3.tgz";
+        url  = "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz";
+        sha1 = "190866bece7553e1f8f267a2ee82c606b5509a1a";
+      };
+    }
+    {
+      name = "source_map_support___source_map_support_0.4.18.tgz";
+      path = fetchurl {
+        name = "source_map_support___source_map_support_0.4.18.tgz";
+        url  = "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz";
+        sha1 = "0286a6de8be42641338594e97ccea75f0a2c585f";
+      };
+    }
+    {
+      name = "source_map_support___source_map_support_0.5.19.tgz";
+      path = fetchurl {
+        name = "source_map_support___source_map_support_0.5.19.tgz";
+        url  = "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz";
+        sha1 = "a98b62f86dcaf4f67399648c085291ab9e8fed61";
+      };
+    }
+    {
+      name = "source_map_url___source_map_url_0.4.0.tgz";
+      path = fetchurl {
+        name = "source_map_url___source_map_url_0.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz";
+        sha1 = "3e935d7ddd73631b97659956d55128e87b5084a3";
+      };
+    }
+    {
+      name = "source_map___source_map_0.5.7.tgz";
+      path = fetchurl {
+        name = "source_map___source_map_0.5.7.tgz";
+        url  = "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz";
+        sha1 = "8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc";
+      };
+    }
+    {
+      name = "source_map___source_map_0.6.1.tgz";
+      path = fetchurl {
+        name = "source_map___source_map_0.6.1.tgz";
+        url  = "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz";
+        sha1 = "74722af32e9614e9c287a8d0bbde48b5e2f1a263";
+      };
+    }
+    {
+      name = "source_map___source_map_0.7.3.tgz";
+      path = fetchurl {
+        name = "source_map___source_map_0.7.3.tgz";
+        url  = "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz";
+        sha1 = "5302f8169031735226544092e64981f751750383";
+      };
+    }
+    {
+      name = "spdx_correct___spdx_correct_3.1.1.tgz";
+      path = fetchurl {
+        name = "spdx_correct___spdx_correct_3.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz";
+        sha1 = "dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9";
+      };
+    }
+    {
+      name = "spdx_exceptions___spdx_exceptions_2.3.0.tgz";
+      path = fetchurl {
+        name = "spdx_exceptions___spdx_exceptions_2.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz";
+        sha1 = "3f28ce1a77a00372683eade4a433183527a2163d";
+      };
+    }
+    {
+      name = "spdx_expression_parse___spdx_expression_parse_3.0.1.tgz";
+      path = fetchurl {
+        name = "spdx_expression_parse___spdx_expression_parse_3.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz";
+        sha1 = "cf70f50482eefdc98e3ce0a6833e4a53ceeba679";
+      };
+    }
+    {
+      name = "spdx_license_ids___spdx_license_ids_3.0.7.tgz";
+      path = fetchurl {
+        name = "spdx_license_ids___spdx_license_ids_3.0.7.tgz";
+        url  = "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz";
+        sha1 = "e9c18a410e5ed7e12442a549fbd8afa767038d65";
+      };
+    }
+    {
+      name = "specificity___specificity_0.4.1.tgz";
+      path = fetchurl {
+        name = "specificity___specificity_0.4.1.tgz";
+        url  = "https://registry.yarnpkg.com/specificity/-/specificity-0.4.1.tgz";
+        sha1 = "aab5e645012db08ba182e151165738d00887b019";
+      };
+    }
+    {
+      name = "split_string___split_string_3.1.0.tgz";
+      path = fetchurl {
+        name = "split_string___split_string_3.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz";
+        sha1 = "7cb09dda3a86585705c64b39a6466038682e8fe2";
+      };
+    }
+    {
+      name = "sprintf_js___sprintf_js_1.0.3.tgz";
+      path = fetchurl {
+        name = "sprintf_js___sprintf_js_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz";
+        sha1 = "04e6926f662895354f3dd015203633b857297e2c";
+      };
+    }
+    {
+      name = "ssri___ssri_6.0.2.tgz";
+      path = fetchurl {
+        name = "ssri___ssri_6.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/ssri/-/ssri-6.0.2.tgz";
+        sha1 = "157939134f20464e7301ddba3e90ffa8f7728ac5";
+      };
+    }
+    {
+      name = "ssri___ssri_8.0.0.tgz";
+      path = fetchurl {
+        name = "ssri___ssri_8.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/ssri/-/ssri-8.0.0.tgz";
+        sha1 = "79ca74e21f8ceaeddfcb4b90143c458b8d988808";
+      };
+    }
+    {
+      name = "stable___stable_0.1.8.tgz";
+      path = fetchurl {
+        name = "stable___stable_0.1.8.tgz";
+        url  = "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz";
+        sha1 = "836eb3c8382fe2936feaf544631017ce7d47a3cf";
+      };
+    }
+    {
+      name = "static_extend___static_extend_0.1.2.tgz";
+      path = fetchurl {
+        name = "static_extend___static_extend_0.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz";
+        sha1 = "60809c39cbff55337226fd5e0b520f341f1fb5c6";
+      };
+    }
+    {
+      name = "stickyfill___stickyfill_1.1.1.tgz";
+      path = fetchurl {
+        name = "stickyfill___stickyfill_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/stickyfill/-/stickyfill-1.1.1.tgz";
+        sha1 = "39413fee9d025c74a7e59ceecb23784cc0f17f02";
+      };
+    }
+    {
+      name = "stream_browserify___stream_browserify_2.0.2.tgz";
+      path = fetchurl {
+        name = "stream_browserify___stream_browserify_2.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz";
+        sha1 = "87521d38a44aa7ee91ce1cd2a47df0cb49dd660b";
+      };
+    }
+    {
+      name = "stream_each___stream_each_1.2.3.tgz";
+      path = fetchurl {
+        name = "stream_each___stream_each_1.2.3.tgz";
+        url  = "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz";
+        sha1 = "ebe27a0c389b04fbcc233642952e10731afa9bae";
+      };
+    }
+    {
+      name = "stream_http___stream_http_2.8.3.tgz";
+      path = fetchurl {
+        name = "stream_http___stream_http_2.8.3.tgz";
+        url  = "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz";
+        sha1 = "b2d242469288a5a27ec4fe8933acf623de6514fc";
+      };
+    }
+    {
+      name = "stream_shift___stream_shift_1.0.1.tgz";
+      path = fetchurl {
+        name = "stream_shift___stream_shift_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz";
+        sha1 = "d7088281559ab2778424279b0877da3c392d5a3d";
+      };
+    }
+    {
+      name = "string_width___string_width_3.1.0.tgz";
+      path = fetchurl {
+        name = "string_width___string_width_3.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz";
+        sha1 = "22767be21b62af1081574306f69ac51b62203961";
+      };
+    }
+    {
+      name = "string_width___string_width_4.2.0.tgz";
+      path = fetchurl {
+        name = "string_width___string_width_4.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz";
+        sha1 = "952182c46cc7b2c313d1596e623992bd163b72b5";
+      };
+    }
+    {
+      name = "string_width___string_width_4.2.2.tgz";
+      path = fetchurl {
+        name = "string_width___string_width_4.2.2.tgz";
+        url  = "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz";
+        sha1 = "dafd4f9559a7585cfba529c6a0a4f73488ebd4c5";
+      };
+    }
+    {
+      name = "string.prototype.trimend___string.prototype.trimend_1.0.1.tgz";
+      path = fetchurl {
+        name = "string.prototype.trimend___string.prototype.trimend_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz";
+        sha1 = "85812a6b847ac002270f5808146064c995fb6913";
+      };
+    }
+    {
+      name = "string.prototype.trimleft___string.prototype.trimleft_2.1.0.tgz";
+      path = fetchurl {
+        name = "string.prototype.trimleft___string.prototype.trimleft_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz";
+        sha1 = "6cc47f0d7eb8d62b0f3701611715a3954591d634";
+      };
+    }
+    {
+      name = "string.prototype.trimright___string.prototype.trimright_2.1.0.tgz";
+      path = fetchurl {
+        name = "string.prototype.trimright___string.prototype.trimright_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz";
+        sha1 = "669d164be9df9b6f7559fa8e89945b168a5a6c58";
+      };
+    }
+    {
+      name = "string.prototype.trimstart___string.prototype.trimstart_1.0.1.tgz";
+      path = fetchurl {
+        name = "string.prototype.trimstart___string.prototype.trimstart_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz";
+        sha1 = "14af6d9f34b053f7cfc89b72f8f2ee14b9039a54";
+      };
+    }
+    {
+      name = "string_decoder___string_decoder_1.3.0.tgz";
+      path = fetchurl {
+        name = "string_decoder___string_decoder_1.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz";
+        sha1 = "42f114594a46cf1a8e30b0a84f56c78c3edac21e";
+      };
+    }
+    {
+      name = "string_decoder___string_decoder_0.10.31.tgz";
+      path = fetchurl {
+        name = "string_decoder___string_decoder_0.10.31.tgz";
+        url  = "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz";
+        sha1 = "62e203bc41766c6c28c9fc84301dab1c5310fa94";
+      };
+    }
+    {
+      name = "string_decoder___string_decoder_1.1.1.tgz";
+      path = fetchurl {
+        name = "string_decoder___string_decoder_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz";
+        sha1 = "9cf1611ba62685d7030ae9e4ba34149c3af03fc8";
+      };
+    }
+    {
+      name = "strip_ansi___strip_ansi_3.0.1.tgz";
+      path = fetchurl {
+        name = "strip_ansi___strip_ansi_3.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz";
+        sha1 = "6a385fb8853d952d5ff05d0e8aaf94278dc63dcf";
+      };
+    }
+    {
+      name = "strip_ansi___strip_ansi_5.2.0.tgz";
+      path = fetchurl {
+        name = "strip_ansi___strip_ansi_5.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz";
+        sha1 = "8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae";
+      };
+    }
+    {
+      name = "strip_ansi___strip_ansi_6.0.0.tgz";
+      path = fetchurl {
+        name = "strip_ansi___strip_ansi_6.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz";
+        sha1 = "0b1571dd7669ccd4f3e06e14ef1eed26225ae532";
+      };
+    }
+    {
+      name = "strip_bom___strip_bom_3.0.0.tgz";
+      path = fetchurl {
+        name = "strip_bom___strip_bom_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz";
+        sha1 = "2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3";
+      };
+    }
+    {
+      name = "strip_comments___strip_comments_2.0.1.tgz";
+      path = fetchurl {
+        name = "strip_comments___strip_comments_2.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/strip-comments/-/strip-comments-2.0.1.tgz";
+        sha1 = "4ad11c3fbcac177a67a40ac224ca339ca1c1ba9b";
+      };
+    }
+    {
+      name = "strip_indent___strip_indent_3.0.0.tgz";
+      path = fetchurl {
+        name = "strip_indent___strip_indent_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz";
+        sha1 = "c32e1cee940b6b3432c771bc2c54bcce73cd3001";
+      };
+    }
+    {
+      name = "strip_json_comments___strip_json_comments_1.0.4.tgz";
+      path = fetchurl {
+        name = "strip_json_comments___strip_json_comments_1.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz";
+        sha1 = "1e15fbcac97d3ee99bf2d73b4c656b082bbafb91";
+      };
+    }
+    {
+      name = "strip_json_comments___strip_json_comments_3.1.1.tgz";
+      path = fetchurl {
+        name = "strip_json_comments___strip_json_comments_3.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz";
+        sha1 = "31f1281b3832630434831c310c01cccda8cbe006";
+      };
+    }
+    {
+      name = "style_loader___style_loader_1.2.1.tgz";
+      path = fetchurl {
+        name = "style_loader___style_loader_1.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/style-loader/-/style-loader-1.2.1.tgz";
+        sha1 = "c5cbbfbf1170d076cfdd86e0109c5bba114baa1a";
+      };
+    }
+    {
+      name = "style_search___style_search_0.1.0.tgz";
+      path = fetchurl {
+        name = "style_search___style_search_0.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/style-search/-/style-search-0.1.0.tgz";
+        sha1 = "7958c793e47e32e07d2b5cafe5c0bf8e12e77902";
+      };
+    }
+    {
+      name = "stylehacks___stylehacks_5.0.1.tgz";
+      path = fetchurl {
+        name = "stylehacks___stylehacks_5.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/stylehacks/-/stylehacks-5.0.1.tgz";
+        sha1 = "323ec554198520986806388c7fdaebc38d2c06fb";
+      };
+    }
+    {
+      name = "stylelint_config_recommended___stylelint_config_recommended_3.0.0.tgz";
+      path = fetchurl {
+        name = "stylelint_config_recommended___stylelint_config_recommended_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/stylelint-config-recommended/-/stylelint-config-recommended-3.0.0.tgz";
+        sha1 = "e0e547434016c5539fe2650afd58049a2fd1d657";
+      };
+    }
+    {
+      name = "stylelint_config_standard___stylelint_config_standard_20.0.0.tgz";
+      path = fetchurl {
+        name = "stylelint_config_standard___stylelint_config_standard_20.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/stylelint-config-standard/-/stylelint-config-standard-20.0.0.tgz";
+        sha1 = "06135090c9e064befee3d594289f50e295b5e20d";
+      };
+    }
+    {
+      name = "stylelint___stylelint_13.13.1.tgz";
+      path = fetchurl {
+        name = "stylelint___stylelint_13.13.1.tgz";
+        url  = "https://registry.yarnpkg.com/stylelint/-/stylelint-13.13.1.tgz";
+        sha1 = "fca9c9f5de7990ab26a00f167b8978f083a18f3c";
+      };
+    }
+    {
+      name = "sugarss___sugarss_2.0.0.tgz";
+      path = fetchurl {
+        name = "sugarss___sugarss_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/sugarss/-/sugarss-2.0.0.tgz";
+        sha1 = "ddd76e0124b297d40bf3cca31c8b22ecb43bc61d";
+      };
+    }
+    {
+      name = "supports_color___supports_color_2.0.0.tgz";
+      path = fetchurl {
+        name = "supports_color___supports_color_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz";
+        sha1 = "535d045ce6b6363fa40117084629995e9df324c7";
+      };
+    }
+    {
+      name = "supports_color___supports_color_5.5.0.tgz";
+      path = fetchurl {
+        name = "supports_color___supports_color_5.5.0.tgz";
+        url  = "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz";
+        sha1 = "e2e69a44ac8772f78a1ec0b35b689df6530efc8f";
+      };
+    }
+    {
+      name = "supports_color___supports_color_6.1.0.tgz";
+      path = fetchurl {
+        name = "supports_color___supports_color_6.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz";
+        sha1 = "0764abc69c63d5ac842dd4867e8d025e880df8f3";
+      };
+    }
+    {
+      name = "supports_color___supports_color_7.2.0.tgz";
+      path = fetchurl {
+        name = "supports_color___supports_color_7.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz";
+        sha1 = "1b7dcdcb32b8138801b3e478ba6a51caa89648da";
+      };
+    }
+    {
+      name = "svg_tags___svg_tags_1.0.0.tgz";
+      path = fetchurl {
+        name = "svg_tags___svg_tags_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/svg-tags/-/svg-tags-1.0.0.tgz";
+        sha1 = "58f71cee3bd519b59d4b2a843b6c7de64ac04764";
+      };
+    }
+    {
+      name = "svgo___svgo_2.3.0.tgz";
+      path = fetchurl {
+        name = "svgo___svgo_2.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/svgo/-/svgo-2.3.0.tgz";
+        sha1 = "6b3af81d0cbd1e19c83f5f63cec2cb98c70b5373";
+      };
+    }
+    {
+      name = "swagger2openapi___swagger2openapi_6.2.3.tgz";
+      path = fetchurl {
+        name = "swagger2openapi___swagger2openapi_6.2.3.tgz";
+        url  = "https://registry.yarnpkg.com/swagger2openapi/-/swagger2openapi-6.2.3.tgz";
+        sha1 = "4a8059f89d851aee4c9ab178f9b7190debd904e2";
+      };
+    }
+    {
+      name = "table___table_5.4.6.tgz";
+      path = fetchurl {
+        name = "table___table_5.4.6.tgz";
+        url  = "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz";
+        sha1 = "1292d19500ce3f86053b05f0e8e7e4a3bb21079e";
+      };
+    }
+    {
+      name = "table___table_6.7.0.tgz";
+      path = fetchurl {
+        name = "table___table_6.7.0.tgz";
+        url  = "https://registry.yarnpkg.com/table/-/table-6.7.0.tgz";
+        sha1 = "26274751f0ee099c547f6cb91d3eff0d61d155b2";
+      };
+    }
+    {
+      name = "tapable___tapable_1.1.3.tgz";
+      path = fetchurl {
+        name = "tapable___tapable_1.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz";
+        sha1 = "a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2";
+      };
+    }
+    {
+      name = "tar___tar_6.0.2.tgz";
+      path = fetchurl {
+        name = "tar___tar_6.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/tar/-/tar-6.0.2.tgz";
+        sha1 = "5df17813468a6264ff14f766886c622b84ae2f39";
+      };
+    }
+    {
+      name = "terser_webpack_plugin___terser_webpack_plugin_1.4.4.tgz";
+      path = fetchurl {
+        name = "terser_webpack_plugin___terser_webpack_plugin_1.4.4.tgz";
+        url  = "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.4.tgz";
+        sha1 = "2c63544347324baafa9a56baaddf1634c8abfc2f";
+      };
+    }
+    {
+      name = "terser___terser_4.8.0.tgz";
+      path = fetchurl {
+        name = "terser___terser_4.8.0.tgz";
+        url  = "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz";
+        sha1 = "63056343d7c70bb29f3af665865a46fe03a0df17";
+      };
+    }
+    {
+      name = "text_table___text_table_0.2.0.tgz";
+      path = fetchurl {
+        name = "text_table___text_table_0.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz";
+        sha1 = "7f5ee823ae805207c00af2df4a84ec3fcfa570b4";
+      };
+    }
+    {
+      name = "through2___through2_2.0.5.tgz";
+      path = fetchurl {
+        name = "through2___through2_2.0.5.tgz";
+        url  = "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz";
+        sha1 = "01c1e39eb31d07cb7d03a96a70823260b23132cd";
+      };
+    }
+    {
+      name = "timers_browserify___timers_browserify_2.0.11.tgz";
+      path = fetchurl {
+        name = "timers_browserify___timers_browserify_2.0.11.tgz";
+        url  = "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.11.tgz";
+        sha1 = "800b1f3eee272e5bc53ee465a04d0e804c31211f";
+      };
+    }
+    {
+      name = "timsort___timsort_0.3.0.tgz";
+      path = fetchurl {
+        name = "timsort___timsort_0.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz";
+        sha1 = "405411a8e7e6339fe64db9a234de11dc31e02bd4";
+      };
+    }
+    {
+      name = "tiny_emitter___tiny_emitter_2.1.0.tgz";
+      path = fetchurl {
+        name = "tiny_emitter___tiny_emitter_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz";
+        sha1 = "1d1a56edfc51c43e863cbb5382a72330e3555423";
+      };
+    }
+    {
+      name = "to_arraybuffer___to_arraybuffer_1.0.1.tgz";
+      path = fetchurl {
+        name = "to_arraybuffer___to_arraybuffer_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz";
+        sha1 = "7d229b1fcc637e466ca081180836a7aabff83f43";
+      };
+    }
+    {
+      name = "to_fast_properties___to_fast_properties_1.0.3.tgz";
+      path = fetchurl {
+        name = "to_fast_properties___to_fast_properties_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz";
+        sha1 = "b83571fa4d8c25b82e231b06e3a3055de4ca1a47";
+      };
+    }
+    {
+      name = "to_fast_properties___to_fast_properties_2.0.0.tgz";
+      path = fetchurl {
+        name = "to_fast_properties___to_fast_properties_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz";
+        sha1 = "dc5e698cbd079265bc73e0377681a4e4e83f616e";
+      };
+    }
+    {
+      name = "to_object_path___to_object_path_0.3.0.tgz";
+      path = fetchurl {
+        name = "to_object_path___to_object_path_0.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz";
+        sha1 = "297588b7b0e7e0ac08e04e672f85c1f4999e17af";
+      };
+    }
+    {
+      name = "to_regex_range___to_regex_range_2.1.1.tgz";
+      path = fetchurl {
+        name = "to_regex_range___to_regex_range_2.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz";
+        sha1 = "7c80c17b9dfebe599e27367e0d4dd5590141db38";
+      };
+    }
+    {
+      name = "to_regex_range___to_regex_range_5.0.1.tgz";
+      path = fetchurl {
+        name = "to_regex_range___to_regex_range_5.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz";
+        sha1 = "1648c44aae7c8d988a326018ed72f5b4dd0392e4";
+      };
+    }
+    {
+      name = "to_regex___to_regex_3.0.2.tgz";
+      path = fetchurl {
+        name = "to_regex___to_regex_3.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz";
+        sha1 = "13cfdd9b336552f30b51f33a8ae1b42a7a7599ce";
+      };
+    }
+    {
+      name = "trim_newlines___trim_newlines_3.0.0.tgz";
+      path = fetchurl {
+        name = "trim_newlines___trim_newlines_3.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.0.tgz";
+        sha1 = "79726304a6a898aa8373427298d54c2ee8b1cb30";
+      };
+    }
+    {
+      name = "trim_right___trim_right_1.0.1.tgz";
+      path = fetchurl {
+        name = "trim_right___trim_right_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz";
+        sha1 = "cb2e1203067e0c8de1f614094b9fe45704ea6003";
+      };
+    }
+    {
+      name = "trough___trough_1.0.5.tgz";
+      path = fetchurl {
+        name = "trough___trough_1.0.5.tgz";
+        url  = "https://registry.yarnpkg.com/trough/-/trough-1.0.5.tgz";
+        sha1 = "b8b639cefad7d0bb2abd37d433ff8293efa5f406";
+      };
+    }
+    {
+      name = "tsconfig_paths___tsconfig_paths_3.9.0.tgz";
+      path = fetchurl {
+        name = "tsconfig_paths___tsconfig_paths_3.9.0.tgz";
+        url  = "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz";
+        sha1 = "098547a6c4448807e8fcb8eae081064ee9a3c90b";
+      };
+    }
+    {
+      name = "tslib___tslib_1.13.0.tgz";
+      path = fetchurl {
+        name = "tslib___tslib_1.13.0.tgz";
+        url  = "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz";
+        sha1 = "c881e13cc7015894ed914862d276436fa9a47043";
+      };
+    }
+    {
+      name = "tslib___tslib_2.1.0.tgz";
+      path = fetchurl {
+        name = "tslib___tslib_2.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/tslib/-/tslib-2.1.0.tgz";
+        sha1 = "da60860f1c2ecaa5703ab7d39bc05b6bf988b97a";
+      };
+    }
+    {
+      name = "tty_browserify___tty_browserify_0.0.0.tgz";
+      path = fetchurl {
+        name = "tty_browserify___tty_browserify_0.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz";
+        sha1 = "a157ba402da24e9bf957f9aa69d524eed42901a6";
+      };
+    }
+    {
+      name = "type_check___type_check_0.4.0.tgz";
+      path = fetchurl {
+        name = "type_check___type_check_0.4.0.tgz";
+        url  = "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz";
+        sha1 = "07b8203bfa7056c0657050e3ccd2c37730bab8f1";
+      };
+    }
+    {
+      name = "type_fest___type_fest_0.18.1.tgz";
+      path = fetchurl {
+        name = "type_fest___type_fest_0.18.1.tgz";
+        url  = "https://registry.yarnpkg.com/type-fest/-/type-fest-0.18.1.tgz";
+        sha1 = "db4bc151a4a2cf4eebf9add5db75508db6cc841f";
+      };
+    }
+    {
+      name = "type_fest___type_fest_0.6.0.tgz";
+      path = fetchurl {
+        name = "type_fest___type_fest_0.6.0.tgz";
+        url  = "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz";
+        sha1 = "8d2a2370d3df886eb5c90ada1c5bf6188acf838b";
+      };
+    }
+    {
+      name = "type_fest___type_fest_0.8.1.tgz";
+      path = fetchurl {
+        name = "type_fest___type_fest_0.8.1.tgz";
+        url  = "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz";
+        sha1 = "09e249ebde851d3b1e48d27c105444667f17b83d";
+      };
+    }
+    {
+      name = "typedarray_to_buffer___typedarray_to_buffer_3.1.5.tgz";
+      path = fetchurl {
+        name = "typedarray_to_buffer___typedarray_to_buffer_3.1.5.tgz";
+        url  = "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz";
+        sha1 = "a97ee7a9ff42691b9f783ff1bc5112fe3fca9080";
+      };
+    }
+    {
+      name = "typedarray___typedarray_0.0.6.tgz";
+      path = fetchurl {
+        name = "typedarray___typedarray_0.0.6.tgz";
+        url  = "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz";
+        sha1 = "867ac74e3864187b1d3d47d996a78ec5c8830777";
+      };
+    }
+    {
+      name = "unified___unified_9.2.1.tgz";
+      path = fetchurl {
+        name = "unified___unified_9.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/unified/-/unified-9.2.1.tgz";
+        sha1 = "ae18d5674c114021bfdbdf73865ca60f410215a3";
+      };
+    }
+    {
+      name = "union_value___union_value_1.0.1.tgz";
+      path = fetchurl {
+        name = "union_value___union_value_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz";
+        sha1 = "0b6fe7b835aecda61c6ea4d4f02c14221e109847";
+      };
+    }
+    {
+      name = "uniq___uniq_1.0.1.tgz";
+      path = fetchurl {
+        name = "uniq___uniq_1.0.1.tgz";
+        url  = "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz";
+        sha1 = "b31c5ae8254844a3a8281541ce2b04b865a734ff";
+      };
+    }
+    {
+      name = "uniqs___uniqs_2.0.0.tgz";
+      path = fetchurl {
+        name = "uniqs___uniqs_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz";
+        sha1 = "ffede4b36b25290696e6e165d4a59edb998e6b02";
+      };
+    }
+    {
+      name = "unique_filename___unique_filename_1.1.1.tgz";
+      path = fetchurl {
+        name = "unique_filename___unique_filename_1.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz";
+        sha1 = "1d69769369ada0583103a1e6ae87681b56573230";
+      };
+    }
+    {
+      name = "unique_slug___unique_slug_2.0.2.tgz";
+      path = fetchurl {
+        name = "unique_slug___unique_slug_2.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz";
+        sha1 = "baabce91083fc64e945b0f3ad613e264f7cd4e6c";
+      };
+    }
+    {
+      name = "unist_util_find_all_after___unist_util_find_all_after_3.0.2.tgz";
+      path = fetchurl {
+        name = "unist_util_find_all_after___unist_util_find_all_after_3.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/unist-util-find-all-after/-/unist-util-find-all-after-3.0.2.tgz";
+        sha1 = "fdfecd14c5b7aea5e9ef38d5e0d5f774eeb561f6";
+      };
+    }
+    {
+      name = "unist_util_is___unist_util_is_4.1.0.tgz";
+      path = fetchurl {
+        name = "unist_util_is___unist_util_is_4.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.1.0.tgz";
+        sha1 = "976e5f462a7a5de73d94b706bac1b90671b57797";
+      };
+    }
+    {
+      name = "unist_util_stringify_position___unist_util_stringify_position_2.0.3.tgz";
+      path = fetchurl {
+        name = "unist_util_stringify_position___unist_util_stringify_position_2.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz";
+        sha1 = "cce3bfa1cdf85ba7375d1d5b17bdc4cada9bd9da";
+      };
+    }
+    {
+      name = "universalify___universalify_0.1.2.tgz";
+      path = fetchurl {
+        name = "universalify___universalify_0.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz";
+        sha1 = "b646f69be3942dabcecc9d6639c80dc105efaa66";
+      };
+    }
+    {
+      name = "unset_value___unset_value_1.0.0.tgz";
+      path = fetchurl {
+        name = "unset_value___unset_value_1.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz";
+        sha1 = "8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559";
+      };
+    }
+    {
+      name = "upath___upath_1.2.0.tgz";
+      path = fetchurl {
+        name = "upath___upath_1.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz";
+        sha1 = "8f66dbcd55a883acdae4408af8b035a5044c1894";
+      };
+    }
+    {
+      name = "uri_js___uri_js_4.4.1.tgz";
+      path = fetchurl {
+        name = "uri_js___uri_js_4.4.1.tgz";
+        url  = "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz";
+        sha1 = "9b1a52595225859e55f669d928f88c6c57f2a77e";
+      };
+    }
+    {
+      name = "urix___urix_0.1.0.tgz";
+      path = fetchurl {
+        name = "urix___urix_0.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz";
+        sha1 = "da937f7a62e21fec1fd18d49b35c2935067a6c72";
+      };
+    }
+    {
+      name = "url_loader___url_loader_4.1.0.tgz";
+      path = fetchurl {
+        name = "url_loader___url_loader_4.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/url-loader/-/url-loader-4.1.0.tgz";
+        sha1 = "c7d6b0d6b0fccd51ab3ffc58a78d32b8d89a7be2";
+      };
+    }
+    {
+      name = "url_search_params_polyfill___url_search_params_polyfill_8.1.0.tgz";
+      path = fetchurl {
+        name = "url_search_params_polyfill___url_search_params_polyfill_8.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/url-search-params-polyfill/-/url-search-params-polyfill-8.1.0.tgz";
+        sha1 = "5c15b69687165bfd4f6c7d8a161d70d85385885b";
+      };
+    }
+    {
+      name = "url_template___url_template_2.0.8.tgz";
+      path = fetchurl {
+        name = "url_template___url_template_2.0.8.tgz";
+        url  = "https://registry.yarnpkg.com/url-template/-/url-template-2.0.8.tgz";
+        sha1 = "fc565a3cccbff7730c775f5641f9555791439f21";
+      };
+    }
+    {
+      name = "url___url_0.11.0.tgz";
+      path = fetchurl {
+        name = "url___url_0.11.0.tgz";
+        url  = "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz";
+        sha1 = "3838e97cfc60521eb73c525a8e55bfdd9e2e28f1";
+      };
+    }
+    {
+      name = "use___use_3.1.1.tgz";
+      path = fetchurl {
+        name = "use___use_3.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz";
+        sha1 = "d50c8cac79a19fbc20f2911f56eb973f4e10070f";
+      };
+    }
+    {
+      name = "util_deprecate___util_deprecate_1.0.2.tgz";
+      path = fetchurl {
+        name = "util_deprecate___util_deprecate_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz";
+        sha1 = "450d4dc9fa70de732762fbd2d4a28981419a0ccf";
+      };
+    }
+    {
+      name = "util___util_0.10.3.tgz";
+      path = fetchurl {
+        name = "util___util_0.10.3.tgz";
+        url  = "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz";
+        sha1 = "7afb1afe50805246489e3db7fe0ed379336ac0f9";
+      };
+    }
+    {
+      name = "util___util_0.11.1.tgz";
+      path = fetchurl {
+        name = "util___util_0.11.1.tgz";
+        url  = "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz";
+        sha1 = "3236733720ec64bb27f6e26f421aaa2e1b588d61";
+      };
+    }
+    {
+      name = "v8_compile_cache___v8_compile_cache_2.1.1.tgz";
+      path = fetchurl {
+        name = "v8_compile_cache___v8_compile_cache_2.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz";
+        sha1 = "54bc3cdd43317bca91e35dcaf305b1a7237de745";
+      };
+    }
+    {
+      name = "v8_compile_cache___v8_compile_cache_2.3.0.tgz";
+      path = fetchurl {
+        name = "v8_compile_cache___v8_compile_cache_2.3.0.tgz";
+        url  = "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz";
+        sha1 = "2de19618c66dc247dcfb6f99338035d8245a2cee";
+      };
+    }
+    {
+      name = "validate_npm_package_license___validate_npm_package_license_3.0.4.tgz";
+      path = fetchurl {
+        name = "validate_npm_package_license___validate_npm_package_license_3.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz";
+        sha1 = "fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a";
+      };
+    }
+    {
+      name = "vendors___vendors_1.0.4.tgz";
+      path = fetchurl {
+        name = "vendors___vendors_1.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz";
+        sha1 = "e2b800a53e7a29b93506c3cf41100d16c4c4ad8e";
+      };
+    }
+    {
+      name = "vfile_message___vfile_message_2.0.4.tgz";
+      path = fetchurl {
+        name = "vfile_message___vfile_message_2.0.4.tgz";
+        url  = "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.4.tgz";
+        sha1 = "5b43b88171d409eae58477d13f23dd41d52c371a";
+      };
+    }
+    {
+      name = "vfile___vfile_4.2.1.tgz";
+      path = fetchurl {
+        name = "vfile___vfile_4.2.1.tgz";
+        url  = "https://registry.yarnpkg.com/vfile/-/vfile-4.2.1.tgz";
+        sha1 = "03f1dce28fc625c625bc6514350fbdb00fa9e624";
+      };
+    }
+    {
+      name = "vm_browserify___vm_browserify_1.1.2.tgz";
+      path = fetchurl {
+        name = "vm_browserify___vm_browserify_1.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz";
+        sha1 = "78641c488b8e6ca91a75f511e7a3b32a86e5dda0";
+      };
+    }
+    {
+      name = "watchpack_chokidar2___watchpack_chokidar2_2.0.0.tgz";
+      path = fetchurl {
+        name = "watchpack_chokidar2___watchpack_chokidar2_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz";
+        sha1 = "9948a1866cbbd6cb824dea13a7ed691f6c8ddff0";
+      };
+    }
+    {
+      name = "watchpack___watchpack_1.7.2.tgz";
+      path = fetchurl {
+        name = "watchpack___watchpack_1.7.2.tgz";
+        url  = "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.2.tgz";
+        sha1 = "c02e4d4d49913c3e7e122c3325365af9d331e9aa";
+      };
+    }
+    {
+      name = "webpack_cli___webpack_cli_3.3.12.tgz";
+      path = fetchurl {
+        name = "webpack_cli___webpack_cli_3.3.12.tgz";
+        url  = "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.3.12.tgz";
+        sha1 = "94e9ada081453cd0aa609c99e500012fd3ad2d4a";
+      };
+    }
+    {
+      name = "webpack_manifest_plugin___webpack_manifest_plugin_2.2.0.tgz";
+      path = fetchurl {
+        name = "webpack_manifest_plugin___webpack_manifest_plugin_2.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/webpack-manifest-plugin/-/webpack-manifest-plugin-2.2.0.tgz";
+        sha1 = "19ca69b435b0baec7e29fbe90fb4015de2de4f16";
+      };
+    }
+    {
+      name = "webpack_sources___webpack_sources_1.4.3.tgz";
+      path = fetchurl {
+        name = "webpack_sources___webpack_sources_1.4.3.tgz";
+        url  = "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz";
+        sha1 = "eedd8ec0b928fbf1cbfe994e22d2d890f330a933";
+      };
+    }
+    {
+      name = "webpack___webpack_4.43.0.tgz";
+      path = fetchurl {
+        name = "webpack___webpack_4.43.0.tgz";
+        url  = "https://registry.yarnpkg.com/webpack/-/webpack-4.43.0.tgz";
+        sha1 = "c48547b11d563224c561dad1172c8aa0b8a678e6";
+      };
+    }
+    {
+      name = "which_module___which_module_2.0.0.tgz";
+      path = fetchurl {
+        name = "which_module___which_module_2.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz";
+        sha1 = "d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a";
+      };
+    }
+    {
+      name = "which___which_1.3.1.tgz";
+      path = fetchurl {
+        name = "which___which_1.3.1.tgz";
+        url  = "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz";
+        sha1 = "a45043d54f5805316da8d62f9f50918d3da70b0a";
+      };
+    }
+    {
+      name = "which___which_2.0.2.tgz";
+      path = fetchurl {
+        name = "which___which_2.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz";
+        sha1 = "7c6a8dd0a636a0327e10b59c9286eee93f3f51b1";
+      };
+    }
+    {
+      name = "word_wrap___word_wrap_1.2.3.tgz";
+      path = fetchurl {
+        name = "word_wrap___word_wrap_1.2.3.tgz";
+        url  = "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz";
+        sha1 = "610636f6b1f703891bd34771ccb17fb93b47079c";
+      };
+    }
+    {
+      name = "worker_farm___worker_farm_1.7.0.tgz";
+      path = fetchurl {
+        name = "worker_farm___worker_farm_1.7.0.tgz";
+        url  = "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz";
+        sha1 = "26a94c5391bbca926152002f69b84a4bf772e5a8";
+      };
+    }
+    {
+      name = "wrap_ansi___wrap_ansi_5.1.0.tgz";
+      path = fetchurl {
+        name = "wrap_ansi___wrap_ansi_5.1.0.tgz";
+        url  = "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz";
+        sha1 = "1fd1f67235d5b6d0fee781056001bfb694c03b09";
+      };
+    }
+    {
+      name = "wrap_ansi___wrap_ansi_6.2.0.tgz";
+      path = fetchurl {
+        name = "wrap_ansi___wrap_ansi_6.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz";
+        sha1 = "e9393ba07102e6c91a3b221478f0257cd2856e53";
+      };
+    }
+    {
+      name = "wrap_ansi___wrap_ansi_7.0.0.tgz";
+      path = fetchurl {
+        name = "wrap_ansi___wrap_ansi_7.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz";
+        sha1 = "67e145cff510a6a6984bdf1152911d69d2eb9e43";
+      };
+    }
+    {
+      name = "wrappy___wrappy_1.0.2.tgz";
+      path = fetchurl {
+        name = "wrappy___wrappy_1.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz";
+        sha1 = "b5243d8f3ec1aa35f1364605bc0d1036e30ab69f";
+      };
+    }
+    {
+      name = "write_file_atomic___write_file_atomic_3.0.3.tgz";
+      path = fetchurl {
+        name = "write_file_atomic___write_file_atomic_3.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz";
+        sha1 = "56bd5c5a5c70481cd19c571bd39ab965a5de56e8";
+      };
+    }
+    {
+      name = "write___write_1.0.3.tgz";
+      path = fetchurl {
+        name = "write___write_1.0.3.tgz";
+        url  = "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz";
+        sha1 = "0800e14523b923a387e415123c865616aae0f5c3";
+      };
+    }
+    {
+      name = "xtend___xtend_4.0.2.tgz";
+      path = fetchurl {
+        name = "xtend___xtend_4.0.2.tgz";
+        url  = "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz";
+        sha1 = "bb72779f5fa465186b1f438f674fa347fdb5db54";
+      };
+    }
+    {
+      name = "y18n___y18n_4.0.0.tgz";
+      path = fetchurl {
+        name = "y18n___y18n_4.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz";
+        sha1 = "95ef94f85ecc81d007c264e190a120f0a3c8566b";
+      };
+    }
+    {
+      name = "y18n___y18n_5.0.5.tgz";
+      path = fetchurl {
+        name = "y18n___y18n_5.0.5.tgz";
+        url  = "https://registry.yarnpkg.com/y18n/-/y18n-5.0.5.tgz";
+        sha1 = "8769ec08d03b1ea2df2500acef561743bbb9ab18";
+      };
+    }
+    {
+      name = "yallist___yallist_3.1.1.tgz";
+      path = fetchurl {
+        name = "yallist___yallist_3.1.1.tgz";
+        url  = "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz";
+        sha1 = "dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd";
+      };
+    }
+    {
+      name = "yallist___yallist_4.0.0.tgz";
+      path = fetchurl {
+        name = "yallist___yallist_4.0.0.tgz";
+        url  = "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz";
+        sha1 = "9bb92790d9c0effec63be73519e11a35019a3a72";
+      };
+    }
+    {
+      name = "yaml___yaml_1.10.0.tgz";
+      path = fetchurl {
+        name = "yaml___yaml_1.10.0.tgz";
+        url  = "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz";
+        sha1 = "3b593add944876077d4d683fee01081bd9fff31e";
+      };
+    }
+    {
+      name = "yargs_parser___yargs_parser_13.1.2.tgz";
+      path = fetchurl {
+        name = "yargs_parser___yargs_parser_13.1.2.tgz";
+        url  = "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz";
+        sha1 = "130f09702ebaeef2650d54ce6e3e5706f7a4fb38";
+      };
+    }
+    {
+      name = "yargs_parser___yargs_parser_18.1.3.tgz";
+      path = fetchurl {
+        name = "yargs_parser___yargs_parser_18.1.3.tgz";
+        url  = "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz";
+        sha1 = "be68c4975c6b2abf469236b0c870362fab09a7b0";
+      };
+    }
+    {
+      name = "yargs_parser___yargs_parser_20.2.6.tgz";
+      path = fetchurl {
+        name = "yargs_parser___yargs_parser_20.2.6.tgz";
+        url  = "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.6.tgz";
+        sha1 = "69f920addf61aafc0b8b89002f5d66e28f2d8b20";
+      };
+    }
+    {
+      name = "yargs_parser___yargs_parser_20.2.7.tgz";
+      path = fetchurl {
+        name = "yargs_parser___yargs_parser_20.2.7.tgz";
+        url  = "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.7.tgz";
+        sha1 = "61df85c113edfb5a7a4e36eb8aa60ef423cbc90a";
+      };
+    }
+    {
+      name = "yargs___yargs_13.3.2.tgz";
+      path = fetchurl {
+        name = "yargs___yargs_13.3.2.tgz";
+        url  = "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz";
+        sha1 = "ad7ffefec1aa59565ac915f82dccb38a9c31a2dd";
+      };
+    }
+    {
+      name = "yargs___yargs_15.4.1.tgz";
+      path = fetchurl {
+        name = "yargs___yargs_15.4.1.tgz";
+        url  = "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz";
+        sha1 = "0d87a16de01aee9d8bec2bfbf74f67851730f4f8";
+      };
+    }
+    {
+      name = "yargs___yargs_16.2.0.tgz";
+      path = fetchurl {
+        name = "yargs___yargs_16.2.0.tgz";
+        url  = "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz";
+        sha1 = "1c82bf0f6b6a66eafce7ef30e376f49a12477f66";
+      };
+    }
+    {
+      name = "zwitch___zwitch_1.0.5.tgz";
+      path = fetchurl {
+        name = "zwitch___zwitch_1.0.5.tgz";
+        url  = "https://registry.yarnpkg.com/zwitch/-/zwitch-1.0.5.tgz";
+        sha1 = "d11d7381ffed16b742f6af7b3f223d5cd9fe9920";
+      };
+    }
+  ];
+}
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..508d6670c6d2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/apache-beam/default.nix
@@ -0,0 +1,169 @@
+{ buildPythonPackage
+, cloudpickle
+, crcmod
+, cython
+, dill
+, fastavro
+, fetchFromGitHub
+, freezegun
+, grpcio
+, grpcio-tools
+, hdfs
+, httplib2
+, lib
+, mock
+, mypy-protobuf
+, numpy
+, oauth2client
+, orjson
+, pandas
+, parameterized
+, proto-plus
+, protobuf
+, psycopg2
+, pyarrow
+, pydot
+, pyhamcrest
+, pymongo
+, pytestCheckHook
+, python
+, pythonAtLeast
+, python-dateutil
+, pytz
+, pyyaml
+, requests
+, requests-mock
+, setuptools
+, sqlalchemy
+, tenacity
+, typing-extensions
+, testcontainers
+, scikit-learn }:
+
+buildPythonPackage rec {
+  pname = "apache-beam";
+  version = "2.40.0";
+
+  src = fetchFromGitHub {
+    owner = "apache";
+    repo = "beam";
+    rev = "v${version}";
+    sha256 = "sha256-0S7Dj6PMSbZkEAY6ZLUpKVfe/tFxsq60TTAFj0Qhtv0=";
+  };
+
+  # See https://github.com/NixOS/nixpkgs/issues/156957.
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "dill>=0.3.1.1,<0.3.2" "dill" \
+      --replace "pyarrow>=0.15.1,<8.0.0" "pyarrow" \
+      --replace "numpy>=1.14.3,<1.23.0" "numpy" \
+      --replace "pymongo>=3.8.0,<4.0.0" "pymongo"
+  '';
+
+  sourceRoot = "source/sdks/python";
+
+  nativeBuildInputs = [
+    cython
+    grpcio-tools
+    mypy-protobuf
+  ];
+
+  propagatedBuildInputs = [
+    cloudpickle
+    crcmod
+    cython
+    dill
+    fastavro
+    grpcio
+    hdfs
+    httplib2
+    numpy
+    oauth2client
+    orjson
+    proto-plus
+    protobuf
+    pyarrow
+    pydot
+    pymongo
+    python-dateutil
+    pytz
+    requests
+    setuptools
+    typing-extensions
+  ];
+
+  enableParallelBuilding = true;
+
+  pythonImportsCheck = [
+    "apache_beam"
+  ];
+
+  checkInputs = [
+    freezegun
+    mock
+    pandas
+    parameterized
+    psycopg2
+    pyhamcrest
+    pytestCheckHook
+    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"
+  ];
+
+  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"
+  ];
+
+  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 ];
+  };
+}
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..4b1401d61e57
--- /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;
+    sha256 = "sha256-XLoNRh6MgXCfRtWD9NpVZSyroW6E9nRYw6Grxa+AQkc=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "setup_requires='pytest-runner'," ""
+  '';
+
+  pythonImportsCheck = [
+    "apcaccess"
+  ];
+
+  checkInputs = [
+    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..3179f9be6f3a
--- /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.1";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "pytest-dev";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-gf84SzfuKLGYfI88IzPRJCqMZWwowUR10FgIbwXjwuY=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    hatch-vcs
+    hatchling
+  ];
+
+  checkInputs = [
+    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/apispec/default.nix b/nixpkgs/pkgs/development/python-modules/apispec/default.nix
new file mode 100644
index 000000000000..9ad41715a231
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/apispec/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, marshmallow
+, mock
+, openapi-spec-validator
+, prance
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+}:
+
+buildPythonPackage rec {
+  pname = "apispec";
+  version = "5.2.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-bqZULh6//p/ZW6Ae8/UTUerGwgCpdFYsdHMFm5zSCqc=";
+  };
+
+  propagatedBuildInputs = [
+    pyyaml
+    prance
+  ];
+
+  checkInputs = [
+    openapi-spec-validator
+    marshmallow
+    mock
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "apispec"
+  ];
+
+  meta = with lib; {
+    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; [ costrouc ];
+  };
+}
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..47a1de3c0d8d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aplpy/default.nix
@@ -0,0 +1,70 @@
+{ lib
+, astropy
+, astropy-helpers
+, buildPythonPackage
+, cython
+, fetchpatch
+, fetchPypi
+, matplotlib
+, numpy
+, pillow
+, pyavm
+, pyregion
+, pytest-astropy
+, pytestCheckHook
+, pythonOlder
+, reproject
+, scikitimage
+, shapely
+}:
+
+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 = [
+    astropy-helpers
+  ];
+
+  propagatedBuildInputs = [
+    astropy
+    cython
+    matplotlib
+    numpy
+    pillow
+    pyavm
+    pyregion
+    reproject
+    scikitimage
+    shapely
+  ];
+
+  checkInputs = [
+    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/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/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..b83b1b54bb80
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/appnope/default.nix
@@ -0,0 +1,21 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "appnope";
+  version = "0.1.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-Ar2RxN6Gn7seHFCq/ECYgnp6VKsvOdncumyVR+2SDiQ=";
+  };
+
+  meta = {
+    description = "Disable App Nap on macOS";
+    homepage    = "https://pypi.python.org/pypi/appnope";
+    platforms   = lib.platforms.darwin;
+    license     = lib.licenses.bsd3;
+  };
+}
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..5c1b779b79e0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/apprise/default.nix
@@ -0,0 +1,75 @@
+{ lib
+, babel
+, buildPythonPackage
+, click
+, cryptography
+, fetchPypi
+, gntp
+, installShellFiles
+, markdown
+, mock
+, paho-mqtt
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, requests
+, requests-oauthlib
+, six
+, slixmpp
+}:
+
+buildPythonPackage rec {
+  pname = "apprise";
+  version = "1.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-llOQAzH4vR9O+pzaLCueJ7aar7Kt8UsrzmV5f3UzOss=";
+  };
+
+  nativeBuildInputs = [
+    babel
+    installShellFiles
+  ];
+
+  propagatedBuildInputs = [
+    click
+    cryptography
+    markdown
+    pyyaml
+    requests
+    requests-oauthlib
+    six
+  ];
+
+  checkInputs = [
+    gntp
+    mock
+    paho-mqtt
+    pytestCheckHook
+    slixmpp
+  ];
+
+  disabledTests = [
+    "test_apprise_cli_nux_env"
+    "test_plugin_mqtt_general"
+  ];
+
+  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";
+    license = licenses.mit;
+    maintainers = with maintainers; [ marsam ];
+  };
+}
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..55b3cb1cca78
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/approvaltests/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+
+# propagates
+, allpairspy
+, beautifulsoup4
+, empty-files
+, pyperclip
+, pytest
+
+# tests
+, numpy
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  version = "5.3.3";
+  pname = "approvaltests";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6.1";
+
+  # no tests included in PyPI tarball
+  src = fetchFromGitHub {
+    owner = "approvals";
+    repo = "ApprovalTests.Python";
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-lFGwwe8L9hXlzaxcd9pxXin5/NPhCpvM4vFRbeQxZ9U=";
+  };
+
+  propagatedBuildInputs = [
+    allpairspy
+    beautifulsoup4
+    empty-files
+    pyperclip
+    pytest
+  ];
+
+  checkInputs = [
+    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";
+    license = licenses.asl20;
+    maintainers = [ 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..47f667a4688d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/appthreat-vulnerability-db/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, requests
+, appdirs
+, tabulate
+, msgpack
+, orjson
+, semver
+, packageurl-python
+, pythonOlder
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "appthreat-vulnerability-db";
+  version = "2.0.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "AppThreat";
+    repo = "vulnerability-db";
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-ThUkDCoRKefAqTmOxCk9W9LZlCqUU+jxF0egjthH4JI=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    appdirs
+    tabulate
+    msgpack
+    orjson
+    semver
+    packageurl-python
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace pytest.ini \
+      --replace " --cov-append --cov-report term --cov vdb" ""
+  '';
+
+  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";
+    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..c2c14fba3735
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/apptools/default.nix
@@ -0,0 +1,74 @@
+{ lib
+, buildPythonPackage
+, configobj
+, fetchpatch
+, fetchPypi
+, importlib-resources
+, pandas
+, pytestCheckHook
+, pythonAtLeast
+, pythonOlder
+, tables
+, traits
+, traitsui
+}:
+
+buildPythonPackage rec {
+  pname = "apptools";
+  version = "5.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "12x5lcs1cllpybz7f0i1lcwvmqsaa5n818wb2165lj049wqxx4yh";
+  };
+
+  patches = [
+    # python310: Fix tests
+    # https://github.com/enthought/apptools/issues/303
+    (fetchpatch {
+      url = "https://github.com/enthought/apptools/commit/10fb73916124f7ae7edf6c6688a05ad95678488f.patch";
+      sha256 = "sha256-izAcP5RWobLvnk2PQx31SX/TUGkw+prbYbjamYVmtjY=";
+      name = "fix_python310_tests.patch";
+    })
+
+    # python39: importlib_resources -> importlib.resources. This patch will be included
+    # in the next release after 5.1.0.
+    (fetchpatch {
+      url = "https://github.com/enthought/apptools/commit/0ae4f52f19a8c0ca9d7926e17c7de949097f24b4.patch";
+      sha256 = "165aiwjisr5c3lasg7xblcha7y1y5bq23vi3g9gc80c24bzwcbsw";
+      name = "fix_importlib-resources_naming.patch";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    configobj
+    traits
+    traitsui
+  ] ++ lib.optionals (pythonOlder "3.9") [
+    importlib-resources
+  ];
+
+  checkInputs = [
+    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";
+    license = licenses.bsdOriginal;
+    maintainers = with maintainers; [ knedlsepp ];
+  };
+}
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..7c2fa222bd2c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aprslib/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, mox3
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "aprslib";
+  version = "0.7.1";
+
+  src = fetchFromGitHub {
+    owner = "rossengeorgiev";
+    repo = "aprs-python";
+    rev = "v${version}";
+    hash = "sha256-wWlzOFhWJ7hJeM3RWsPTEsLjRzN4SMXsb2Cd612HB4w=";
+  };
+
+  checkInputs = [
+    mox3
+    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/apsw/default.nix b/nixpkgs/pkgs/development/python-modules/apsw/default.nix
new file mode 100644
index 000000000000..e4b4a94bf832
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/apsw/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, sqlite
+, isPyPy
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "apsw";
+  version = "3.38.5-r1";
+  format = "setuptools";
+
+  disabled = isPyPy;
+
+  src = fetchFromGitHub {
+    owner = "rogerbinns";
+    repo = "apsw";
+    rev = "refs/tags/${version}";
+    hash = "sha256-pPviSrONGgWZUREMENPt34bpHggR00Kl6DrB40JWm+w=";
+  };
+
+  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..a3dd440d43b1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/apycula/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, setuptools-scm
+, numpy
+, pandas
+, pillow
+, crcmod
+, openpyxl
+}:
+
+buildPythonPackage rec {
+  pname = "apycula";
+  version = "0.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "Apycula";
+    hash = "sha256-+GVXmqoF9r/GPv2S7KP+PTS2WTeubhLBNaA9MXw5lRo=";
+  };
+
+  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";
+    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..fdecad826c12
--- /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=";
+  };
+
+  checkInputs = [
+    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..255248e8d924
--- /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.3";
+
+  src = fetchFromGitHub {
+    owner = "swilson";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-6YvkSUtBc3Nl/Ap3LjU0IKY2bE4k86XdSoLo+/c8dDs=";
+  };
+
+  propagatedBuildInputs = [
+    pyserial
+    websockets
+  ];
+
+  checkInputs = [
+    aiohttp
+    pytestCheckHook
+  ];
+
+  # With 3.3 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..88675337b4cd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/arabic-reshaper/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchPypi, future, configparser, isPy27 }:
+
+buildPythonPackage rec {
+  pname = "arabic_reshaper";
+  version = "2.1.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a236fc6e9dde2a61cc6a5ca962b522e42694e1bb2a2d86894ed7a4eba4ce1890";
+  };
+
+  propagatedBuildInputs = [ future ]
+    ++ lib.optionals isPy27 [ configparser ];
+
+  # Tests are not published on pypi
+  doCheck = false;
+
+  pythonImportsCheck = [ "arabic_reshaper" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/mpcabd/python-arabic-reshaper";
+    description = "Reconstruct Arabic sentences to be used in applications that don't support Arabic";
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ freezeboy ];
+  };
+}
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..755950f3a1e0
--- /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.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "manicmaniac";
+    repo = pname;
+    rev = version;
+    hash = "sha256-1VgPYLyBQkxyuUO7KZv5sqYIEieV1RkBtlLVkLUUO4w=";
+  };
+
+  checkInputs = [
+    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..a1f4892a245f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/arcam-fmj/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, aiohttp
+, attrs
+, defusedxml
+, pytest-aiohttp
+, pytest-mock
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "arcam-fmj";
+  version = "0.12.0";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "elupus";
+    repo = "arcam_fmj";
+    rev = version;
+    sha256 = "sha256-YkoABsOLEl1gSCRgZr0lLZGzicr3N5KRNLDjfuQhy2U=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    attrs
+    defusedxml
+  ];
+
+  checkInputs = [
+    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";
+    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..651404e7fedc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/archinfo/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, nose
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "archinfo";
+  version = "9.2.14";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "angr";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-kWZ5z9Tn0SAqrGP4gtGfPny+kj/2ibSdTwp+0RCx40s=";
+  };
+
+  checkInputs = [
+    nose
+    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..ea48798b6898
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/archspec/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, click
+, six
+, pytestCheckHook
+, jsonschema
+}:
+
+buildPythonPackage rec {
+  pname = "archspec";
+  version = "0.1.4";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "v${version}";
+    fetchSubmodules = true;
+    sha256 = "sha256-ScigEpYNArveqi5tlqiA7LwsVs2RkjT+GChxhSy/ndw=";
+  };
+
+  nativeBuildInputs = [ poetry-core ];
+  propagatedBuildInputs = [ click six ];
+  checkInputs = [ pytestCheckHook jsonschema ];
+
+  pythonImportsCheck = [ "archspec" ];
+
+  meta = with lib; {
+    description = "A library for detecting, labeling, and reasoning about microarchitectures";
+    homepage = "https://archspec.readthedocs.io/en/latest/";
+    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..7bb54f33d513
--- /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;
+    sha256 = "sha256-Ui9ZpWaVBfCbDlZH3EgHX32FIZtyTHnc/UXqtoEyFcw=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  buildInputs = [
+    pytest
+    pytest-asyncio
+  ];
+
+  checkInputs = [
+    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..0aa3e8c1b948
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/argcomplete/default.nix
@@ -0,0 +1,38 @@
+{ buildPythonPackage, fetchPypi, lib
+, dicttoxml
+, importlib-metadata
+, pexpect
+, prettytable
+, requests-toolbelt
+}:
+buildPythonPackage rec {
+  pname = "argcomplete";
+  version = "2.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "6372ad78c89d662035101418ae253668445b391755cfe94ea52f1b9d22425b20";
+  };
+
+  doCheck = false; # meant to be ran with interactive interpreter
+
+  # re-enable if we are able to make testing work
+  # checkInputs = [ bashInteractive coverage flake8 ];
+
+  propagatedBuildInputs = [
+    dicttoxml
+    importlib-metadata
+    pexpect
+    prettytable
+    requests-toolbelt
+  ];
+
+  pythonImportsCheck = [ "argcomplete" ];
+
+  meta = with lib; {
+    description = "Bash tab completion for argparse";
+    homepage = "https://kislyuk.github.io/argcomplete/";
+    maintainers = [ maintainers.womfoo ];
+    license = [ licenses.asl20 ];
+  };
+}
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..fd9ff184000f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/argh/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, iocapture
+, mock
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "argh";
+  version = "0.26.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "e9535b8c84dc9571a48999094fda7f33e63c3f1b74f3e5f3ac0105a58405bb65";
+  };
+
+  patches = [
+    # https://github.com/neithere/argh/issues/148
+    (fetchpatch {
+      name = "argh-0.26.2-fix-py3.9-msgs.patch";
+      url = "https://gitweb.gentoo.org/repo/gentoo.git/plain/dev-python/argh/files/argh-0.26.2-fix-py3.9-msgs.patch?id=6f194f12a2e30aad7da347848f7b0187e188f983";
+      sha256 = "nBmhF2PXVeS7cBNujzip6Bb601LRHrjmhlGKFr/++Oo=";
+    })
+  ];
+
+  checkInputs = [
+    iocapture
+    mock
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "argh" ];
+
+  meta = with lib; {
+    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/argon2-cffi-bindings/default.nix b/nixpkgs/pkgs/development/python-modules/argon2-cffi-bindings/default.nix
new file mode 100644
index 000000000000..3f1f3f86666c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/argon2-cffi-bindings/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, cffi
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "argon2-cffi-bindings";
+  version = "21.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "bb89ceffa6c791807d1305ceb77dbfacc5aa499891d2c55661c6459651fc39e3";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    cffi
+  ];
+
+  # 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..ed79243a6bd1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/argon2-cffi/default.nix
@@ -0,0 +1,45 @@
+{ cffi
+, six
+, enum34
+, hypothesis
+, pytest
+, wheel
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, lib
+, stdenv
+, argon2-cffi-bindings
+}:
+
+buildPythonPackage rec {
+  pname = "argon2-cffi";
+  version = "21.3.0";
+  format = "flit";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d384164d944190a7dd7ef22c6aa3ff197da12962bd04b17f64d4e93d934dba5b";
+  };
+
+  propagatedBuildInputs = [ cffi six argon2-cffi-bindings ]
+    ++ lib.optional (!isPy3k) enum34;
+
+  propagatedNativeBuildInputs = [
+    argon2-cffi-bindings
+    cffi
+  ];
+
+  ARGON2_CFFI_USE_SSE2 = lib.optionals (stdenv.hostPlatform != stdenv.buildPlatform) "0";
+
+  checkInputs = [ hypothesis pytest wheel ];
+  checkPhase = ''
+    pytest tests
+  '';
+
+  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/argparse-addons/default.nix b/nixpkgs/pkgs/development/python-modules/argparse-addons/default.nix
new file mode 100644
index 000000000000..1116ff3c3039
--- /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.8.0";
+
+  src = fetchPypi {
+    pname = "argparse_addons";
+    inherit version;
+    sha256 = "sha256-uwiBB5RNM56NLnCnYwXd41FUTixb3rrxwttWrS5tzeg=";
+  };
+
+  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/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..2a7e6cb0df95
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aria2p/default.nix
@@ -0,0 +1,43 @@
+{ lib, buildPythonPackage, fetchFromGitHub, pythonOlder
+, aria2, poetry, pytest, pytest-cov, pytest-xdist, responses
+, asciimatics, loguru, requests, setuptools, websocket-client
+}:
+
+buildPythonPackage rec {
+  pname = "aria2p";
+  version = "0.9.1";
+  format = "pyproject";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "pawamoy";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1s4kad6jnfz9p64gkqclkfq2x2bn8dbc0hyr86d1545bgn7pz672";
+  };
+
+  nativeBuildInputs = [ poetry ];
+
+  preBuild = ''
+    export HOME=$TMPDIR
+  '';
+
+  checkInputs = [ aria2 responses pytest pytest-cov pytest-xdist ];
+
+  # Tests are not all stable/deterministic,
+  # they rely on actually running an aria2c daemon and communicating with it,
+  # race conditions and deadlocks were observed,
+  # thus the corresponding tests are disabled
+  checkPhase = ''
+    pytest -nauto -k "not test_api and not test_cli and not test_interface"
+  '';
+
+  propagatedBuildInputs = [ asciimatics loguru requests setuptools websocket-client ];
+
+  meta = with lib; {
+    homepage = "https://github.com/pawamoy/aria2p";
+    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/arpeggio/default.nix b/nixpkgs/pkgs/development/python-modules/arpeggio/default.nix
new file mode 100644
index 000000000000..d3d320785293
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/arpeggio/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "arpeggio";
+  version = "2.0.0";
+
+  src = fetchPypi {
+    pname = "Arpeggio";
+    inherit version;
+    sha256 = "sha256-1rA4OQGbuKaHhfkpLuajaxlU64S5JbhKa4peHibT7T0=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "pytest-runner" ""
+  '';
+
+  checkInputs = [ 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; [ SuperSandro2000 ];
+  };
+}
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..fa4b7d0bffdf
--- /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.3.1";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a955df768e39d459de28c7ea10ee02f67b1c70996cfa229846ab98df77a6fb69";
+  };
+
+  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..9a883b2f68ee
--- /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;
+    sha256 = "sha256-C1o9HWWJ/G/7Pp6I0FbRmX2PQvUJx71L9wHRkUMtnL4=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  checkInputs = [
+    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..c09610c3be1f
--- /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.2";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-Bcrx/T2aEaETWytvCYh0IRU7lFWOXvTQkLVntHFzrCs=";
+  };
+
+  postPatch = ''
+    # no coverage reports
+    sed -i "/addopts/d" tox.ini
+  '';
+
+  propagatedBuildInputs = [ python-dateutil ]
+    ++ lib.optionals (pythonOlder "3.8") [ typing-extensions ];
+
+  checkInputs = [
+    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/arviz/default.nix b/nixpkgs/pkgs/development/python-modules/arviz/default.nix
new file mode 100644
index 000000000000..8cd1ae1b83da
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/arviz/default.nix
@@ -0,0 +1,105 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, bokeh
+, emcee
+, matplotlib
+, netcdf4
+, numba
+, numpy
+, pandas
+, pytest
+, setuptools
+, cloudpickle
+, pytestCheckHook
+, scipy
+, packaging
+, typing-extensions
+, pythonOlder
+, xarray
+, xarray-einstats
+, zarr
+, h5py
+, jaxlib
+, torchvision
+, jax
+  # , pymc3 (circular dependency)
+, pyro-ppl
+  #, pystan (not packaged)
+, numpyro
+}:
+
+buildPythonPackage rec {
+  pname = "arviz";
+  version = "0.12.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "arviz-devs";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-5P6EXXAAS1Q2eNQuj/5JrDg0lPHfA5K4WaYfKaaXm9s=";
+  };
+
+  propagatedBuildInputs = [
+    matplotlib
+    netcdf4
+    numpy
+    packaging
+    pandas
+    scipy
+    setuptools
+    xarray
+    xarray-einstats
+  ];
+
+  checkInputs = [
+    bokeh
+    cloudpickle
+    emcee
+    h5py
+    jax
+    jaxlib
+    numba
+    numpyro
+    # pymc3 (circular dependency)
+    pyro-ppl
+    # pystan (not packaged)
+    pytestCheckHook
+    torchvision
+    zarr
+  ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d);
+  '';
+
+  pytestFlagsArray = [
+    "arviz/tests/base_tests/"
+  ];
+
+  disabledTestPaths = [
+    # Remove tests as dependency creates a circular dependency
+    "arviz/tests/external_tests/test_data_pymc.py"
+  ];
+
+  disabledTests = [
+    # Tests require network access
+    "test_plot_separation"
+    "test_plot_trace_legend"
+    "test_cov"
+  ];
+
+  pythonImportsCheck = [
+    "arviz"
+  ];
+
+  meta = with lib; {
+    description = "Library for exploratory analysis of Bayesian models";
+    homepage = "https://arviz-devs.github.io/arviz/";
+    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..4dec50bbc67e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/arxiv2bib/default.nix
@@ -0,0 +1,27 @@
+{ buildPythonPackage, python, lib, fetchFromGitHub
+, mock
+}:
+
+buildPythonPackage rec {
+  pname = "arxiv2bib";
+  version = "1.0.8";
+
+  # Missing tests on Pypi
+  src = fetchFromGitHub {
+    owner = "nathangrigg";
+    repo = "arxiv2bib";
+    rev = version;
+    sha256 = "1kp2iyx20lpc9dv4qg5fgwf83a1wx6f7hj1ldqyncg0kn9xcrhbg";
+  };
+
+  checkInputs = [ mock ];
+
+  checkPhase = "${python.interpreter} -m unittest discover -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..09ff95885441
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/asana/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, requests
+, requests-oauthlib
+, responses
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "asana";
+  version = "1.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "asana";
+    repo = "python-asana";
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-SbYTLGBCfKbjhyzM5OnVX6kxEMnofwPIyzwuJvYORhw=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    requests-oauthlib
+    six
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    responses
+  ];
+
+  pythonImportsCheck = [
+    "asana"
+  ];
+
+  meta = with lib; {
+    description = "Python client library for Asana";
+    homepage = "https://github.com/asana/python-asana";
+    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..6a1b617c03ed
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ascii-magic/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, colorama
+, fetchPypi
+, pillow
+}:
+
+buildPythonPackage rec {
+  pname = "ascii-magic";
+  version = "1.6";
+
+  src = fetchPypi {
+    pname = "ascii_magic";
+    inherit version;
+    sha256 = "sha256-faVRj3No5z8R4hUaDAYIBKoUniZ7Npt+52U/vXsEalE=";
+  };
+
+  propagatedBuildInputs = [
+    colorama
+    pillow
+  ];
+
+  # Project is not tagging releases and tests are not shipped with PyPI source
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "ascii_magic"
+  ];
+
+  meta = with lib; {
+    description = "Python module to converts pictures into ASCII art";
+    homepage = "https://github.com/LeandroBarone/python-ascii_magic";
+    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..3854abed09f8
--- /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.14.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-FtIM5CIQtDTrBbpGns24KTrH7TwM4N1PcOMNctdgIic=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    pyfiglet
+    pillow
+    wcwidth
+    future
+  ];
+
+  checkInputs = [
+    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..814cf1a3d410
--- /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";
+  };
+
+  checkInputs = [
+    pytest
+  ];
+
+  checkPhase = ''
+    pytest
+  '';
+
+  meta = with lib; {
+    description = "Draws ASCII trees";
+    homepage = "https://github.com/mbr/asciitree";
+    license = licenses.mit;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..8333e25f01aa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/asdf-transform-schemas/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, asdf-standard
+, buildPythonPackage
+, fetchPypi
+, importlib-resources
+, pythonOlder
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "asdf-transform-schemas";
+  version = "0.2.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "asdf_transform_schemas";
+    inherit version;
+    hash = "sha256-9xqTCe0+vQmxk3roV8lM7JKIeHBEDrPphou77XJlaxU=";
+  };
+
+  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";
+    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..253ec1b71ce2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/asdf/default.nix
@@ -0,0 +1,71 @@
+{ lib
+, asdf-standard
+, asdf-transform-schemas
+, astropy
+, buildPythonPackage
+, fetchPypi
+, importlib-resources
+, jmespath
+, jsonschema
+, lz4
+, numpy
+, packaging
+, pytest-astropy
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, semantic-version
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "asdf";
+  version = "2.12.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-0qXRYWXKC17JiL1D+jjuGVoOGAJuGbJje7OZyd2k3o8=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    asdf-standard
+    asdf-transform-schemas
+    jmespath
+    jsonschema
+    numpy
+    packaging
+    pyyaml
+    semantic-version
+  ] ++ lib.optionals (pythonOlder "3.9") [
+    importlib-resources
+  ];
+
+  checkInputs = [
+    astropy
+    lz4
+    pytest-astropy
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    export PY_IGNORE_IMPORTMISMATCH=1
+  '';
+
+  pythonImportsCheck = [
+    "asdf"
+  ];
+
+  meta = with lib; {
+    description = "Python tools to handle ASDF files";
+    homepage = "https://github.com/asdf-format/asdf";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ costrouc ];
+  };
+}
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..c3ec514844c2
--- /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;
+    sha256 = "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; [ costrouc ];
+  };
+}
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..6e857499f651
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/asf-search/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, buildPythonPackage
+, dateparser
+, fetchFromGitHub
+, importlib-metadata
+, numpy
+, pytestCheckHook
+, python-dateutil
+, pythonOlder
+, pytz
+, requests
+, requests-mock
+, shapely
+, wktutils
+}:
+
+buildPythonPackage rec {
+  pname = "asf-search";
+  version = "5.0.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "asfadmin";
+    repo = "Discovery-asf_search";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-Jynks+c8OV0t1GoKAk4vP9jYQ0PclJHl3x8q78au5gk=";
+  };
+
+  propagatedBuildInputs = [
+    dateparser
+    importlib-metadata
+    numpy
+    python-dateutil
+    pytz
+    requests
+    shapely
+    wktutils
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    requests-mock
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "WKTUtils==" "WKTUtils>="
+  '';
+
+  pythonImportsCheck = [
+    "asf_search"
+  ];
+
+  meta = with lib; {
+    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..a11d1c703044
--- /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;
+    sha256 = "sha256-mmOsN2mW6eGtapq3xLqHK8hhSD0Gjzp3DsY5AGUlI8g=";
+  };
+
+  propagatedBuildInputs = [
+    itsdangerous
+    python-multipart
+  ];
+
+  checkInputs = [
+    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..3a1861bbd182
--- /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";
+  };
+
+  checkInputs = [
+    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..4ccbe3175cc8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/asgiref/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, stdenv
+, async-timeout
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  version = "3.5.2";
+  pname = "asgiref";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "django";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-56suF63ePRDprqODhVIPCEGiO8UGgWrpwg2wYEs6OOE=";
+  };
+
+  propagatedBuildInputs = [
+    async-timeout
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    pytest-asyncio
+  ];
+
+  disabledTests = lib.optionals stdenv.isDarwin [
+    "test_multiprocessing"
+  ];
+
+  pythonImportsCheck = [ "asgiref" ];
+
+  meta = with lib; {
+    description = "Reference ASGI adapters and channel layers";
+    homepage = "https://github.com/django/asgiref";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..c67841c03463
--- /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
+  ];
+
+  checkInputs = [
+    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..7e1b8834cd0e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/asn1/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, future
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "asn1";
+  version = "2.6.0";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "andrivet";
+    repo = "python-asn1";
+    rev = "v${version}";
+    sha256 = "sha256-oz9xZhFU4himXttVtfW6tTn7lfB0c7MlgxtbKxdJtUA=";
+  };
+
+  propagatedBuildInputs = [
+    future
+  ];
+
+  checkInputs = [
+    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";
+    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..0c071c4206b0
--- /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;
+    sha256 = "sha256-M8vASxhaJPgkiTrAckxz7gk/QHkrFlNz7fFbnLEBT+M=";
+  };
+
+  checkInputs = [
+    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..bba82425cc05
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/asn1tools/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, bitstruct
+, diskcache
+, prompt-toolkit
+, pyparsing
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "asn1tools";
+  version = "0.163.0";
+
+  src = fetchFromGitHub {
+    owner = "eerimoq";
+    repo = "asn1tools";
+    rev = "v${version}";
+    sha256 = "sha256-sbwwbwkhlZvCb2emuw1FTBj5pnv9SOtHpAcYPSQqIvM=";
+  };
+
+  propagatedBuildInputs = [
+    bitstruct
+    diskcache
+    prompt-toolkit
+    pyparsing
+  ];
+
+  checkPhase = ''
+    ${python.interpreter} setup.py test
+  '';
+
+  pythonImportsCheck = [ "asn1tools" ];
+
+  meta = with lib; {
+    description = "ASN.1 parsing, encoding and decoding";
+    homepage = "https://github.com/eerimoq/asn1tools";
+    license = licenses.mit;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..7c5c113dbd80
--- /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
+  ];
+
+  checkInputs = [
+    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; [ SuperSandro2000 ];
+  };
+}
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..cfe935e16e80
--- /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"
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  # fails on darwin due to case-insensitive file system
+  disabledTests = lib.optional 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/assertpy/default.nix b/nixpkgs/pkgs/development/python-modules/assertpy/default.nix
new file mode 100644
index 000000000000..5280808fb3cf
--- /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";
+  };
+
+  checkInputs = [
+    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..bddfa3c30d4e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/asteval/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "asteval";
+  version = "0.9.27";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "newville";
+    repo = pname;
+    rev = version;
+    hash = "sha256-FxWs4l9bqZoqdyhpVRys8Mo9Wdtn1fm5XonisPscWEs=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace " --cov=asteval --cov-report xml" ""
+  '';
+
+  pythonImportsCheck = [
+    "asteval"
+  ];
+
+  meta = with lib; {
+    description = "AST evaluator of Python expression using ast module";
+    homepage = "https://github.com/newville/asteval";
+    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..ab68c91d5d6b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/astor/default.nix
@@ -0,0 +1,29 @@
+{ lib, buildPythonPackage, fetchPypi, pytestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "astor";
+  version = "0.8.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0ppscdzzvxpznclkmhhj53iz314x3pfv4yc7c6gwxqgljgdgyvka";
+  };
+
+  # disable tests broken with python3.6: https://github.com/berkerpeksag/astor/issues/89
+  checkInputs = [ pytestCheckHook ];
+  disabledTests = [
+    "check_expressions"
+    "check_astunparse"
+    "convert_stdlib"
+    "codegen_as_submodule"
+    "positional_only_arguments"
+    "codegen_from_root"
+  ];
+
+  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..8c97ef6750f7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/astral/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27, pytz, requests, pytest, freezegun }:
+
+buildPythonPackage rec {
+  pname = "astral";
+  version = "2.2";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "e41d9967d5c48be421346552f0f4dedad43ff39a83574f5ff2ad32b6627b6fbe";
+  };
+
+  propagatedBuildInputs = [ pytz requests freezegun ];
+
+  checkInputs = [ pytest ];
+  checkPhase = ''
+    py.test -m "not webtest"
+  '';
+
+  meta = with lib; {
+    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..6cde2e755030
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/astroid/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonAtLeast
+, pythonOlder
+, isPyPy
+, lazy-object-proxy
+, setuptools
+, setuptools-scm
+, typing-extensions
+, typed-ast
+, pylint
+, pytestCheckHook
+, wrapt
+}:
+
+buildPythonPackage rec {
+  pname = "astroid";
+  version = "2.11.7"; # Check whether the version is compatible with pylint
+
+  disabled = pythonOlder "3.6.2";
+
+  src = fetchFromGitHub {
+    owner = "PyCQA";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-HpniGxKf+daMh/sxP9T9UriYRrUFWqk7kDa8r+EqtVI=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    lazy-object-proxy
+    setuptools
+    wrapt
+  ] ++ lib.optionals (pythonOlder "3.10") [
+    typing-extensions
+  ] ++ lib.optionals (!isPyPy && pythonOlder "3.8") [
+    typed-ast
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # AssertionError: Lists differ: ['ABC[16 chars]yBase', 'Final', 'Generic', 'MyProtocol', 'Protocol', 'object'] != ['ABC[16 chars]yBase', 'Final', 'Generic', 'MyProtocol', 'object']
+    "test_mro_typing_extensions"
+  ];
+
+  passthru.tests = {
+    inherit pylint;
+  };
+
+  meta = with lib; {
+    description = "An abstract syntax tree for Python with inference support";
+    homepage = "https://github.com/PyCQA/astroid";
+    license = licenses.lgpl21Plus;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..cb15acf88399
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/astropy-extension-helpers/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, findutils
+, pytestCheckHook
+, pythonOlder
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "extension-helpers";
+  version = "1.0.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ca1bfac67c79cf4a7a0c09286ce2a24eec31bf17715818d0726318dd0e5050e6";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  patches = [ ./permissions.patch ];
+
+  checkInputs = [
+    findutils
+    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-extension-helpers/permissions.patch b/nixpkgs/pkgs/development/python-modules/astropy-extension-helpers/permissions.patch
new file mode 100644
index 000000000000..cef74b336034
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/astropy-extension-helpers/permissions.patch
@@ -0,0 +1,20 @@
+diff --git a/extension_helpers/_setup_helpers.py b/extension_helpers/_setup_helpers.py
+index ec3e547..e2419f7 100644
+--- a/extension_helpers/_setup_helpers.py
++++ b/extension_helpers/_setup_helpers.py
+@@ -79,8 +79,13 @@ def get_extensions(srcdir='.'):
+     if len(ext_modules) > 0:
+         main_package_dir = min(packages, key=len)
+         src_path = os.path.join(os.path.dirname(__file__), 'src')
+-        shutil.copy(os.path.join(src_path, 'compiler.c'),
+-                    os.path.join(srcdir, main_package_dir, '_compiler.c'))
++        a = os.path.join(src_path, 'compiler.c')
++        b = os.path.join(srcdir, main_package_dir, '_compiler.c')
++        try:
++            os.unlink(b)
++        except OSError:
++            pass
++        shutil.copy(a, b)
+         ext = Extension(main_package_dir + '.compiler_version',
+                         [os.path.join(main_package_dir, '_compiler.c')])
+         ext_modules.append(ext)
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..80ef403b2cc0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/astropy-healpix/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, numpy
+, astropy
+, astropy-extension-helpers
+, setuptools-scm
+, pytestCheckHook
+, pytest-doctestplus
+, hypothesis
+}:
+
+buildPythonPackage rec {
+  pname = "astropy-healpix";
+  version = "0.6";
+
+  src = fetchPypi {
+    inherit version;
+    pname = lib.replaceStrings ["-"] ["_"] pname;
+    sha256 = "409a6621c383641456c074f0f0350a24a4a58e910eaeef14e9bbce3e00ad6690";
+  };
+
+  nativeBuildInputs = [
+    astropy-extension-helpers
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    astropy
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    pytest-doctestplus
+    hypothesis
+  ];
+
+  # 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..fbf40096daef
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/astropy/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, pythonOlder
+
+# build time
+, astropy-extension-helpers
+, astropy-helpers
+, cython
+, jinja2
+, setuptools-scm
+
+# runtime
+, numpy
+, packaging
+, pyerfa
+, pyyaml
+}:
+
+let
+  pname = "astropy";
+  version = "5.1";
+in
+buildPythonPackage {
+  inherit pname version;
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8"; # according to setup.cfg
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-HbGyx+3fx3PKZvozvQeyXVucO17uK5NODKJ3+lsbe34=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    astropy-extension-helpers
+    astropy-helpers
+    cython
+    jinja2
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    packaging
+    pyerfa
+    pyyaml
+  ];
+
+  # infinite recursion with pytest-astropy (pytest-astropy-header depends on astropy itself)
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Astronomy/Astrophysics library for Python";
+    homepage = "https://www.astropy.org";
+    license = licenses.bsd3;
+    platforms = platforms.all;
+    maintainers = [ maintainers.kentjames ];
+  };
+}
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..6c1d39a82b01
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/astroquery/default.nix
@@ -0,0 +1,70 @@
+{ pkgs
+, buildPythonPackage
+, fetchPypi
+, astropy
+, requests
+, keyring
+, beautifulsoup4
+, html5lib
+, matplotlib
+, pillow
+, pytest
+, pytest-astropy
+, pytestCheckHook
+, pyvo
+, astropy-helpers
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "astroquery";
+  version = "0.4.6";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-MHylVMtzSgypoi+G9e/+fkE6+ROuZeFXiXLYR7H+E+4=";
+  };
+
+  disabled = !isPy3k;
+
+  propagatedBuildInputs = [
+    astropy
+    requests
+    keyring
+    beautifulsoup4
+    html5lib
+    pyvo
+  ];
+
+  nativeBuildInputs = [ astropy-helpers ];
+
+  # Disable automatic update of the astropy-helper module
+  postPatch = ''
+    substituteInPlace setup.cfg --replace "auto_use = True" "auto_use = False"
+  '';
+
+  checkInputs = [
+    matplotlib
+    pillow
+    pytest
+    pytest-astropy
+    pytestCheckHook
+  ];
+
+  # 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..3d78ae7690b3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/asttokens/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, setuptools-scm
+, six
+, astroid
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "asttokens";
+  version = "2.0.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-mlTBFPAsepSA1WVQkyVGo/H+cdigLxvHzNDuPuNc9NU=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  checkInputs = [
+    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/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-lru/default.nix b/nixpkgs/pkgs/development/python-modules/async-lru/default.nix
new file mode 100644
index 000000000000..b656b1947857
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/async-lru/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, pytestCheckHook
+, pytest-asyncio
+}:
+
+buildPythonPackage rec {
+  pname = "async-lru";
+  version = "1.0.3";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "aio-libs";
+    repo = "async-lru";
+    rev = "v${version}";
+    hash = "sha256-98ZPFSOFRnymTCfCG9OuajfxXAWyCrByyJEHhpPVPbM=";
+  };
+
+  postPatch = ''
+    sed -i -e '/^addopts/d' -e '/^filterwarnings/,+2d' setup.cfg
+  '';
+
+  checkInputs = [
+    pytestCheckHook
+    pytest-asyncio
+  ];
+
+  pytestFlagsArray = [
+    "--asyncio-mode=strict"
+  ];
+
+  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-upnp-client/default.nix b/nixpkgs/pkgs/development/python-modules/async-upnp-client/default.nix
new file mode 100644
index 000000000000..ce8572566e3e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/async-upnp-client/default.nix
@@ -0,0 +1,79 @@
+{ lib
+, stdenv
+, aiohttp
+, async-timeout
+, buildPythonPackage
+, defusedxml
+, fetchFromGitHub
+, pytest-asyncio
+, pytestCheckHook
+, python-didl-lite
+, pythonOlder
+, voluptuous
+}:
+
+buildPythonPackage rec {
+  pname = "async-upnp-client";
+  version = "0.31.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "StevenLooman";
+    repo = "async_upnp_client";
+    rev = version;
+    sha256 = "sha256-/8gSx1oe2ljBGIPddzBLXuH3LiuHpUXi4/vO7stm5FY=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    async-timeout
+    defusedxml
+    python-didl-lite
+    voluptuous
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    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";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
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..277616849e15
--- /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;
+    sha256 = "6ebb3d106c12920aaae42ccb6f787ef5eefdcdd166ea3d628fa8476abe712144";
+  };
+
+  checkInputs = [
+    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_stagger/default.nix b/nixpkgs/pkgs/development/python-modules/async_stagger/default.nix
new file mode 100644
index 000000000000..3dafd2b21941
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/async_stagger/default.nix
@@ -0,0 +1,43 @@
+{ 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 {
+    inherit pname version;
+    sha256 = "1mj3daaqxjdavbxcjrdwx5ky9maa2blbv53aa6d7w9zxkrz3b7xa";
+  };
+
+  checkInputs = [
+    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..2a67ed1d6710
--- /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.2";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15";
+  };
+
+  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/asyncclick/default.nix b/nixpkgs/pkgs/development/python-modules/asyncclick/default.nix
new file mode 100644
index 000000000000..e49fda936c83
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/asyncclick/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, anyio
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools-scm
+, pytestCheckHook
+, pythonOlder
+, trio
+}:
+
+buildPythonPackage rec {
+  pname = "asyncclick";
+  version = "8.0.1.3";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "python-trio";
+    repo = pname;
+    rev = version;
+    sha256 = "03b8zz8i3aqzxr3ffzb4sxnrcm3gsk9r4hmr0fkml1ahi754bx2r";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    anyio
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    trio
+  ];
+
+  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/asyncio-dgram/default.nix b/nixpkgs/pkgs/development/python-modules/asyncio-dgram/default.nix
new file mode 100644
index 000000000000..a01e9389f431
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/asyncio-dgram/default.nix
@@ -0,0 +1,46 @@
+{ 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 = "v${version}";
+    sha256 = "sha256-Eb/9JtgPT2yOlfnn5Ox8M0kcQhSlRCuX8+Rq6amki8Q=";
+  };
+
+  checkInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  # OSError: AF_UNIX path too long
+  doCheck = !stdenv.isDarwin;
+
+  disabledTests = [
+    "test_protocol_pause_resume"
+  ];
+
+  pythonImportsCheck = [
+    "asyncio_dgram"
+  ];
+
+  meta = with lib; {
+    description = "Python support for higher level Datagram";
+    homepage = "https://github.com/jsbronder/asyncio-dgram";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..38f3389aa60e
--- /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";
+  };
+
+  checkInputs = [
+    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/asyncio_mqtt/default.nix b/nixpkgs/pkgs/development/python-modules/asyncio_mqtt/default.nix
new file mode 100644
index 000000000000..c0ae1cea95f7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/asyncio_mqtt/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, async_generator
+, paho-mqtt
+}:
+
+buildPythonPackage rec {
+  pname = "asyncio-mqtt";
+  version = "0.12.1";
+  format = "setuptools";
+
+  src = fetchPypi {
+    pname = "asyncio_mqtt";
+    inherit version;
+    sha256 = "sha256-bb+FpF+U0m50ZUEWgK2jlHtQVG6YII1dUuegp+16fDg=";
+  };
+
+  propagatedBuildInputs = [
+    paho-mqtt
+  ] ++ lib.optional (pythonOlder "3.7") [
+    async_generator
+  ];
+
+  doCheck = false; # no tests
+
+  pythonImportsCheck = [ "asyncio_mqtt" ];
+
+  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/master/CHANGELOG.md";
+    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..8356b62b62e6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/asyncmy/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, cython
+, fetchFromGitHub
+, poetry-core
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "asyncmy";
+  version = "0.2.5";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "long2ice";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-yLAse8p+2RYHJmDwD5vrHlf29URB+kdupjD1DwTcRAc=";
+  };
+
+  nativeBuildInputs = [
+    cython
+    poetry-core
+  ];
+
+  # 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..0a3ef8f119e0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/asyncpg/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, uvloop
+, postgresql
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "asyncpg";
+  version = "0.26.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-d+aEok/uF7o+SHypgtAlntF7rhr2gAb0zyhLI7og6iw=";
+  };
+
+  checkInputs = [
+    uvloop
+    postgresql
+  ];
+
+  pythonImportsCheck = [
+    "asyncpg"
+  ];
+
+  meta = with lib; {
+    description = "Asyncio PosgtreSQL driver";
+    homepage = "https://github.com/MagicStack/asyncpg";
+    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/asyncsleepiq/default.nix b/nixpkgs/pkgs/development/python-modules/asyncsleepiq/default.nix
new file mode 100644
index 000000000000..d088563aae29
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/asyncsleepiq/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "asyncsleepiq";
+  version = "1.2.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-X+bJyzQxWJaS1/KNOE/3zQKSbwUpm9XN35HYf6s+BPs=";
+  };
+
+  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";
+    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..086bf0371ae8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/asyncssh/default.nix
@@ -0,0 +1,87 @@
+{ stdenv
+, lib
+, bcrypt
+, buildPythonPackage
+, cryptography
+, fetchPypi
+, fido2
+, gssapi
+, libnacl
+, libsodium
+, nettle
+, openssh
+, openssl
+, pyopenssl
+, pytestCheckHook
+, python-pkcs11
+, pythonOlder
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "asyncssh";
+  version = "2.12.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-J0EBMixLlBgjru2OGrbnvlGRaGxtstK9Na/rowUF54A=";
+  };
+
+  propagatedBuildInputs = [
+    bcrypt
+    cryptography
+    fido2
+    gssapi
+    libnacl
+    libsodium
+    nettle
+    pyopenssl
+    python-pkcs11
+    typing-extensions
+  ];
+
+  checkInputs = [
+    openssh
+    openssl
+    pytestCheckHook
+  ];
+
+  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; {
+    broken = stdenv.isDarwin;
+    description = "Asynchronous SSHv2 Python client and server library";
+    homepage = "https://asyncssh.readthedocs.io/";
+    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..6a9d911f66bc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/asyncstdlib/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, typing-extensions
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "asyncstdlib";
+  version = "3.10.5";
+  format = "flit";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "maxfischer2781";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-ILb+iWg2xYWBEQY1a4jPITm4QCPO8qfVCPgO3YWIVAQ=";
+  };
+
+  propagatedBuildInputs = [
+    typing-extensions
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "asyncstdlib"
+  ];
+
+  meta = with lib; {
+    description = "Python library that extends the Python asyncio standard library";
+    homepage = "https://asyncstdlib.readthedocs.io/";
+    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..dda3d35f6add
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/asynctest/default.nix
@@ -0,0 +1,33 @@
+{ lib, buildPythonPackage, fetchPypi, pythonOlder, python }:
+
+buildPythonPackage rec {
+  pname = "asynctest";
+  version = "0.13.0";
+
+  disabled = pythonOlder "3.5";
+
+  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/asyncwhois/default.nix b/nixpkgs/pkgs/development/python-modules/asyncwhois/default.nix
new file mode 100644
index 000000000000..4e91aafde6da
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/asyncwhois/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, asynctest
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, python-socks
+, pythonOlder
+, tldextract
+, whodap
+}:
+
+buildPythonPackage rec {
+  pname = "asyncwhois";
+  version = "1.0.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "pogzyb";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-TpUiUW9ntrpuT/rUhucedl+DM5X88Mislrd+3D5/TUE=";
+  };
+
+  propagatedBuildInputs = [
+    python-socks
+    tldextract
+    whodap
+  ];
+
+  checkInputs = [
+    asynctest
+    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"
+  ];
+
+  pythonImportsCheck = [
+    "asyncwhois"
+  ];
+
+  meta = with lib; {
+    description = "Python module for retrieving WHOIS information";
+    homepage = "https://github.com/pogzyb/asyncwhois";
+    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..4ad71306789e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/asysocks/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, asn1crypto
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "asysocks";
+  version = "0.1.7";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-I9X8+ucadYJsPteHvZsbw7GJ7DdliWG86DyemUVeNUw=";
+  };
+
+  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";
+    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..d2f4cc0af8ce
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/atenpdu/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pysnmp
+}:
+
+buildPythonPackage rec {
+  pname = "atenpdu";
+  version = "0.3.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-vvq8InmJUgvm/PpvZutpsBR3Fj1gR+xrkgfEGlw04Ek=";
+  };
+
+  propagatedBuildInputs = [ pysnmp ];
+
+  # 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 100755
index 000000000000..7e0074f7336d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/atlassian-python-api/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, deprecated
+, oauthlib
+, requests
+, requests-oauthlib
+, six
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "atlassian-python-api";
+  version = "3.25.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "atlassian-api";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-O0hD8PCmUH38k2a0cnt4Ihb+8/wb9RIL27xc/LONBU0=";
+  };
+
+  propagatedBuildInputs = [
+    deprecated
+    oauthlib
+    requests
+    requests-oauthlib
+    six
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "atlassian"
+  ];
+
+  meta = with lib; {
+    description = "Python Atlassian REST API Wrapper";
+    homepage = "https://github.com/atlassian-api/atlassian-python-api";
+    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..aead82a488d0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/atom/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools-scm
+, future
+, cppy
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "atom";
+  version = "0.8.1";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "nucleic";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-odthydKmgbOXYT8YAIn5MlFfH/BD8MMkuRYaiI8OZD4=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  buildInputs = [
+    cppy
+  ];
+
+  preCheck = ''
+    rm -rf atom
+  '';
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "atom.api"
+  ];
+
+  meta = with lib; {
+    description = "Memory efficient Python objects";
+    maintainers = [ maintainers.bhipple ];
+    homepage = "https://github.com/nucleic/atom";
+    license = licenses.bsd3;
+  };
+}
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..d905e590af0a
--- /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"
+  ];
+
+  checkInputs = [
+    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..dbf094d54bc0
--- /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;
+    sha256 = "sha256-gbLJBxpJNnp/dwFw5e7Iy2ZWfPu8jHPSDOXKSo1xzxE=";
+  };
+
+  # Tests depend on pytest but atomicwrites is a dependency of pytest
+  doCheck = false;
+  checkInputs = [ 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..cdef83e999e2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/atomman/default.nix
@@ -0,0 +1,78 @@
+{ lib
+, ase
+, buildPythonPackage
+, cython
+, datamodeldict
+, fetchFromGitHub
+, matplotlib
+, numericalunits
+, numpy
+, pandas
+, phonopy
+, potentials
+, pymatgen
+, pytest
+, pythonOlder
+, pythonAtLeast
+, requests
+, scipy
+, toolz
+, xmltodict
+}:
+
+buildPythonPackage rec {
+  version = "1.4.4";
+  pname = "atomman";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6" || pythonAtLeast "3.10";
+
+  src = fetchFromGitHub {
+    owner = "usnistgov";
+    repo = "atomman";
+    rev = "v${version}";
+    hash = "sha256-iLAB0KMtrTCyGpx+81QfHDPVDhq8OA6CDL/ipVRpyo0=";
+  };
+
+  propagatedBuildInputs = [
+    cython
+    datamodeldict
+    matplotlib
+    numericalunits
+    numpy
+    pandas
+    potentials
+    requests
+    scipy
+    toolz
+    xmltodict
+  ];
+
+  checkInputs = [
+    ase
+    phonopy
+    pymatgen
+    pytest
+  ];
+
+  checkPhase = ''
+    # pytestCheckHook doesn't work
+    pytest tests -k "not test_rootdir and not test_version \
+      and not test_atomic_mass and not imageflags \
+      and not test_build_unit and not test_set_and_get_in_units \
+      and not test_set_literal and not test_scalar_model " \
+      --ignore tests/plot/test_interpolate.py \
+      --ignore tests/tools/test_vect_angle.py
+  '';
+
+  pythonImportsCheck = [
+    "atomman"
+  ];
+
+  meta = with lib; {
+    description = "Atomistic Manipulation Toolkit";
+    homepage = "https://github.com/usnistgov/atomman/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ costrouc ];
+  };
+}
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..16f0f0ddffd9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/atpublic/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+, pdm-pep517
+, sybil
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "atpublic";
+  version = "3.0.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "bb072b50e6484490404e5cb4034e782aaa339fdd6ac36434e53c10791aef18bf";
+  };
+
+  nativeBuildInputs = [
+    pdm-pep517
+  ];
+
+  propagatedBuildInputs = lib.optionals (pythonOlder "3.8") [
+    typing-extensions
+  ];
+
+  checkInputs = [
+    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..b692c9009776
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/atsim_potentials/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, configparser
+, pyparsing
+, pytest
+, future
+, openpyxl
+, wrapt
+}:
+
+buildPythonPackage rec {
+  version = "0.4.0";
+  pname = "atsim.potentials";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0c3e4e2323e969880f17a9924642e0991be5761f50b254bcbadd046db3be6390";
+  };
+
+  checkInputs = [ pytest ];
+  propagatedBuildInputs = [
+    configparser
+    future
+    openpyxl
+    pyparsing
+    wrapt
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "wrapt==1.11.2" "wrapt~=1.11"
+  '';
+
+  # tests are not included with release
+  doCheck = false;
+
+  checkPhase = ''
+    py.test
+  '';
+
+  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 = [ maintainers.costrouc ];
+    broken = true; # missing cexprtk package
+  };
+}
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..3a9834ec8657
--- /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
+  ];
+
+  checkInputs = [
+    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..44b61fcba725
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/attrs/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, callPackage
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "attrs";
+  version = "22.1.0";
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Ka3CZlRH5RkdDnxWj954sh+WctNEKB0MbhqwhUKbIrY=";
+  };
+
+  outputs = [
+    "out"
+    "testout"
+  ];
+
+  postInstall = ''
+    # Install tests as the tests output.
+    mkdir $testout
+    cp -R tests $testout/tests
+  '';
+
+  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";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
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..c9fae9e0228c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/attrs/tests.nix
@@ -0,0 +1,21 @@
+{ buildPythonPackage
+, pytestCheckHook
+, attrs
+, hypothesis
+}:
+
+buildPythonPackage {
+  pname = "attrs-tests";
+  inherit (attrs) version;
+
+  srcs = attrs.testout;
+
+  dontBuild = true;
+  dontInstall = true;
+
+  checkInputs = [
+    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..ad78b6c63fc8
--- /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
+  ];
+
+  checkInputs = [
+    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..8769cdedeac3
--- /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}";
+    sha256 = "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..fc3adf2534e7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/audio-metadata/default.nix
@@ -0,0 +1,42 @@
+{ lib, buildPythonPackage, fetchPypi
+, attrs
+, bidict
+, bitstruct
+, more-itertools
+, pprintpp
+, tbm-utils
+}:
+
+buildPythonPackage rec {
+  pname = "audio-metadata";
+  version = "0.11.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9e7ba79d49cf048a911d5f7d55bb2715c10be5c127fe5db0987c5fe1aa7335eb";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "'attrs>=18.2,<19.4'" "'attrs'"
+  '';
+
+  propagatedBuildInputs = [
+    attrs
+    bidict
+    bitstruct
+    more-itertools
+    pprintpp
+    tbm-utils
+  ];
+
+  # No tests
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/thebigmunch/audio-metadata";
+    description = "A library for reading and, in the future, writing metadata from audio files";
+    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..ee3413415232
--- /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;
+    sha256 = "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..d008498117b6
--- /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}";
+    sha256 = "sha256-y+EiK9BktyTWowOiJvOb2YjtbPa7R62Wb5zinkyt1OM=";
+  };
+
+  meta = with lib; {
+    description = "Utilities and Python modules for handling audio";
+    homepage = "http://audiotools.sourceforge.net/";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ ];
+  };
+}
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..6b70f3675268
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/augeas/default.nix
@@ -0,0 +1,33 @@
+{ stdenv, lib, buildPythonPackage, fetchFromGitHub, augeas, cffi }:
+buildPythonPackage rec {
+    pname = "augeas";
+    version = "1.1.0";
+
+    src = fetchFromGitHub {
+      owner = "hercules-team";
+      repo = "python-augeas";
+      rev = "v${version}";
+      sha256 = "12q52ilcx059rn544x3712xq6myn99niz131l0fs3xx67456pajh";
+    };
+
+    # TODO: not very nice!
+    postPatch =
+      let libname = "libaugeas${stdenv.hostPlatform.extensions.sharedLibrary}";
+      in
+      ''
+        substituteInPlace augeas/ffi.py \
+          --replace 'ffi.dlopen("augeas")' \
+                    'ffi.dlopen("${lib.makeLibraryPath [augeas]}/${libname}")'
+      '';
+
+    propagatedBuildInputs = [ cffi augeas ];
+
+    doCheck = false;
+
+    meta = with lib; {
+      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..cda3ff5fbcd2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/augmax/default.nix
@@ -0,0 +1,36 @@
+{ buildPythonPackage
+, einops
+, fetchFromGitHub
+, jax
+, jaxlib
+, lib
+}:
+
+buildPythonPackage rec {
+  pname = "augmax";
+  version = "unstable-2022-02-19";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "khdlr";
+    repo = pname;
+    # augmax does not have releases tagged. See https://github.com/khdlr/augmax/issues/5.
+    rev = "3e5d85d6921a1e519987d33f226bc13f61e04d04";
+    sha256 = "046n43v7161w7najzlbi0443q60436xv24nh1mv23yw6psqqhx5i";
+  };
+
+  propagatedBuildInputs = [ einops jax ];
+
+  # augmax does not have any tests at the time of writing (2022-02-19), but
+  # jaxlib is necessary for the pythonImportsCheckPhase.
+  checkInputs = [ jaxlib ];
+
+  pythonImportsCheck = [ "augmax" ];
+
+  meta = with lib; {
+    description = "Efficiently Composable Data Augmentation on the GPU with Jax";
+    homepage = "https://github.com/khdlr/augmax";
+    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..5d3fe1ff15dd
--- /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.2";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "djtimca";
+    repo = "aurora-api";
+    rev = version;
+    sha256 = "0bh8amixkg3xigwh3ryra22x6kzhbdassmf1iqv20lhbvzmsqjv0";
+  };
+
+  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..00eb71e3d7da
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aurorapy/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitLab
+, future
+, pyserial
+, pytestCheckHook
+, pythonOlder
+, 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=";
+  };
+
+  propagatedBuildInputs = [
+    future
+    pyserial
+  ];
+
+  checkInputs = [
+    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..7ff630376c06
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/autarco/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, aiohttp
+, aresponses
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, yarl
+}:
+
+buildPythonPackage rec {
+  pname = "autarco";
+  version = "0.1.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "klaasnicolaas";
+    repo = "python-autarco";
+    rev = "v${version}";
+    hash = "sha256-ID1lCGfF6XHVv8Azd34a30hcsX17uMXo22stAhYH1Uo=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    yarl
+  ];
+
+  checkInputs = [
+    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 = [
+    "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..fe52973c2cd7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/auth0-python/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, aiohttp
+, aioresponses
+, buildPythonPackage
+, callee
+, fetchPypi
+, mock
+, pyjwt
+, pytestCheckHook
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "auth0-python";
+  version = "3.23.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-sXEWg6zrwMs8pCSloJtLL3o7ZAXTTiMXEgI7sDaogr4=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    pyjwt
+  ];
+
+  checkInputs = [
+    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";
+    license = licenses.mit;
+    maintainers = with maintainers; [ costrouc ];
+  };
+}
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..d4a71d639c73
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/authcaptureproxy/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, aiohttp
+, beautifulsoup4
+, httpx
+, importlib-metadata
+, multidict
+, typer
+, yarl
+, pytest-asyncio
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "authcaptureproxy";
+  version = "1.1.4";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "alandtse";
+    repo = "auth_capture_proxy";
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-4IPBulzRoAAplyM/1MPE40IW4IXBIGYLydzpY64Gl0c=";
+  };
+
+  postPatch = ''
+    # https://github.com/alandtse/auth_capture_proxy/issues/14
+    # https://github.com/alandtse/auth_capture_proxy/issues/15
+    substituteInPlace pyproject.toml \
+       --replace "poetry.masonry.api" "poetry.core.masonry.api" \
+       --replace 'importlib-metadata = "^3.4.0"' 'importlib-metadata = "*"'
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    beautifulsoup4
+    httpx
+    importlib-metadata
+    multidict
+    typer
+    yarl
+  ];
+
+  checkInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    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..dfcb7527d981
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/authheaders/default.nix
@@ -0,0 +1,22 @@
+{ buildPythonPackage, fetchPypi, lib
+, authres, dnspython, dkimpy, publicsuffix2
+}:
+
+buildPythonPackage rec {
+  pname = "authheaders";
+  version = "0.15.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-90rOvu+CbHtammrMDZpPx7rIboIT2X/jL1GtfjpmuOk=";
+  };
+
+  propagatedBuildInputs = [ authres dnspython dkimpy publicsuffix2 ];
+
+  meta = with lib; {
+    description = "Python library for the generation of email authentication headers";
+    homepage = "https://github.com/ValiMail/authentication-headers";
+    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..c023c8d6920f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/authlib/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytest
+, mock
+, cryptography
+, requests
+}:
+
+buildPythonPackage rec {
+  version = "1.0.1";
+  pname = "authlib";
+
+  src = fetchFromGitHub {
+    owner = "lepture";
+    repo = "authlib";
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-2uzb3rhEDMgH2QZ0yUdI1c4qLJT5XIDmOV/1mV/5lnc=";
+  };
+
+  propagatedBuildInputs = [ cryptography requests ];
+
+  checkInputs = [ mock pytest ];
+
+  checkPhase = ''
+    PYTHONPATH=$PWD:$PYTHONPATH pytest tests/{core,files}
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/lepture/authlib";
+    description = "The ultimate Python library in building OAuth and OpenID Connect servers. JWS,JWE,JWK,JWA,JWT included.";
+    maintainers = with maintainers; [ flokli ];
+    license = licenses.bsd3;
+  };
+}
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..57e09385f8a6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/autobahn/default.nix
@@ -0,0 +1,115 @@
+{ 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 = "22.6.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-+2PpRtXC3Q32gIUehOZWJKSUzofJmfKklE5PLYG/RJg=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "pytest>=2.8.6,<3.3.0" "pytest"
+  '';
+
+  propagatedBuildInputs = [
+    cryptography
+    hyperlink
+    pynacl
+    txaio
+  ];
+
+  checkInputs = [
+    mock
+    pytest-asyncio
+    pytestCheckHook
+    # FIXME: remove the following dependencies when web3 gets added
+    eth-account
+  ] ++ 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; [ SuperSandro2000 ];
+  };
+}
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..93e89a2800d4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/autograd/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildPythonPackage, fetchPypi, numpy, future }:
+
+buildPythonPackage rec {
+  pname = "autograd";
+  version = "1.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-OD3g9TfvLji4X/lpJZOwz66JWMmzvUUbUsJV/ZFx/84=";
+  };
+
+  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;
+
+  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..420322a32340
--- /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.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-fluG/2XlUh3kPtYtSotrP02c7kdmem92Hy1R93SaTzk=";
+  };
+
+  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..094015e56f5e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/automat/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, attrs
+, pytest-benchmark
+, pytestCheckHook
+, setuptools-scm
+, six
+}:
+
+let automat = buildPythonPackage rec {
+  version = "20.2.0";
+  pname = "automat";
+
+  src = fetchPypi {
+    pname = "Automat";
+    inherit version;
+    sha256 = "7979803c74610e11ef0c0d68a2942b152df52da55336e0c9d58daf1831cbdf33";
+  };
+
+  patches = [
+    # don't depend on m2r
+    (fetchpatch {
+      name = "dont-depend-on-m2r.patch";
+      url = "https://github.com/glyph/automat/compare/v20.2.0..2562fa4ddeba5b5945d9482baa4c26a414f5e831.patch";
+      includes = [ "setup.py" ];
+      hash = "sha256-jlPLJMu1QbBpiVYHDiqPydrXjEoZgYZTVVGNxSA0NxY=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    six
+    attrs
+  ];
+
+  checkInputs = [
+    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; [ SuperSandro2000 ];
+  };
+}; 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..bd2816f6d345
--- /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;
+    sha256 = "sha256-41qd+KPSrOrczkovwXht3irbcYlYehBZ1HZ44yZe4cM=";
+  };
+
+  propagatedBuildInputs = [
+    APScheduler
+    hiredis
+    aioredis
+    ephem
+    pytz
+    pyyaml
+  ];
+
+  checkInputs = [
+    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/autopage/default.nix b/nixpkgs/pkgs/development/python-modules/autopage/default.nix
new file mode 100644
index 000000000000..4ebaa9f8c905
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/autopage/default.nix
@@ -0,0 +1,22 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "autopage";
+  version = "0.5.1";
+
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-Ab4+5hu3FOkJD8xcEPTPVGw5YzHGIMauUKIyGyjtMZk=";
+  };
+
+  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..80c57ef732c2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/autopep8/default.nix
@@ -0,0 +1,31 @@
+{ lib, fetchPypi, buildPythonPackage, pycodestyle, glibcLocales
+, toml
+}:
+
+buildPythonPackage rec {
+  pname = "autopep8";
+  version = "1.6.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "44f0932855039d2c15c4510d6df665e4730f2b8582704fa48f9c55bd3e17d979";
+  };
+
+  propagatedBuildInputs = [ pycodestyle toml ];
+
+  # One test fails:
+  # FAIL: test_recursive_should_not_crash_on_unicode_filename (test.test_autopep8.CommandLineTests)
+#   doCheck = false;
+
+  checkInputs = [ glibcLocales ];
+
+  LC_ALL = "en_US.UTF-8";
+
+  meta = with lib; {
+    description = "A tool that automatically formats Python code to conform to the PEP 8 style guide";
+    homepage = "https://pypi.python.org/pypi/autopep8/";
+    license = licenses.mit;
+    platforms = platforms.all;
+    maintainers = with maintainers; [ bjornfor ];
+  };
+}
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..a6aa50b2de0c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/av/default.nix
@@ -0,0 +1,147 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+
+# build
+, cython
+, pkg-config
+
+# runtime
+, ffmpeg
+
+# tests
+, numpy
+, pillow
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "av";
+  version = "9.2.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "mikeboers";
+    repo = "PyAV";
+    rev = "v${version}";
+    hash = "sha256-I7j+EzpvgKCNY8TbcaHsaWtetyvmno6YYhQTer2+Ds0=";
+  };
+
+  nativeBuildInputs = [
+    cython
+    pkg-config
+  ];
+
+  buildInputs = [
+    ffmpeg
+  ];
+
+  preCheck = ''
+    # ensure we import the built version
+    rm -r av
+  '';
+
+  checkInputs = [
+    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"
+  ];
+
+  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..a456c110ff42
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/avion/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, bluepy
+, buildPythonPackage
+, csrmesh
+, fetchPypi
+, pycryptodome
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "avion";
+  version = "0.10";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0zgv45086b97ngyqxdp41wxb7hpn9g7alygc21j9y3dib700vzdz";
+  };
+
+  propagatedBuildInputs = [
+    bluepy
+    csrmesh
+    pycryptodome
+    requests
+  ];
+
+  # Project 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..fd24227e03cd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/avro/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, typing-extensions
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "avro";
+  version = "1.11.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-8SNiPsxkjQ4gzhT47YUWIUDBPMSxCIZdGyUp+/oGwAg=";
+  };
+
+  propagatedBuildInputs = lib.optionals (pythonOlder "3.8") [
+    typing-extensions
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Requires network access
+    "test_server_with_path"
+  ];
+
+  pythonImportsCheck = [
+    "avro"
+  ];
+
+  meta = with lib; {
+    description = "Python serialization and RPC framework";
+    homepage = "https://github.com/apache/avro";
+    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..f6ad9bf086cc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/avro3k/default.nix
@@ -0,0 +1,19 @@
+{ lib, buildPythonPackage, fetchPypi, isPy3k }:
+
+buildPythonPackage rec {
+  pname = "avro3k";
+  version = "1.7.7-SNAPSHOT";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "15ahl0irwwj558s964abdxg4vp6iwlabri7klsm2am6q5r0ngsky";
+  };
+
+  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/awesome-slugify/default.nix b/nixpkgs/pkgs/development/python-modules/awesome-slugify/default.nix
new file mode 100644
index 000000000000..47ca9859b5e7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/awesome-slugify/default.nix
@@ -0,0 +1,34 @@
+{ lib, buildPythonPackage, fetchPypi, unidecode, regex, python }:
+
+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 ];
+
+  checkPhase = ''
+      ${python.interpreter} -m unittest discover
+  '';
+
+  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..f55f91d5a192
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/awesomeversion/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "awesomeversion";
+  version = "22.6.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "ludeeus";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-osAJzJr9PtGH8wcHam1BolIBTD8QDBWg3mI/z4JW0JE=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  checkInputs = [
+    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";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..97bdc19a8039
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/awkward/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, cmake
+, numba
+, numpy
+, pytestCheckHook
+, pyyaml
+, rapidjson
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "awkward";
+  version = "1.8.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-ZlX6ItGx0dy5zO4NUCNQq5DFNGehC1QLdiRCK1lNLnI=";
+  };
+
+  nativeBuildInputs = [ cmake ];
+  buildInputs = [ pyyaml rapidjson ];
+  propagatedBuildInputs = [ numpy setuptools ]; # https://github.com/scikit-hep/awkward/blob/main/requirements.txt
+
+  dontUseCmakeConfigure = true;
+
+  checkInputs = [ pytestCheckHook numba ];
+
+  disabledTests = [
+    # incomatible with numpy 1.23
+    "test_numpyarray"
+  ];
+
+  disabledTestPaths = [ "tests-cuda" ];
+
+  pythonImportsCheck = [ "awkward" ];
+
+  meta = with lib; {
+    description = "Manipulate JSON-like data with NumPy-like idioms";
+    homepage = "https://github.com/scikit-hep/awkward";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ veprbl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/awkward0/default.nix b/nixpkgs/pkgs/development/python-modules/awkward0/default.nix
new file mode 100644
index 000000000000..ce9f1eabc77a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/awkward0/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, numpy
+, pytest-runner
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "awkward0";
+  version = "0.15.5";
+
+  src = fetchFromGitHub {
+    owner = "scikit-hep";
+    repo = "awkward-0.x";
+    rev = version;
+    sha256 = "039pxzgll2yz8xpr6bw788ymvgvqgna5kgl9m6d9mzi4yhbjsjpx";
+  };
+
+  nativeBuildInputs = [ pytest-runner ];
+
+  propagatedBuildInputs = [ numpy ];
+
+  checkInputs = [ pytestCheckHook ];
+
+  # Can't find a fixture
+  disabledTests = [ "test_import_pandas" ];
+
+  pythonImportsCheck = [ "awkward0" ];
+
+  meta = with lib; {
+    description = "Manipulate jagged, chunky, and/or bitmasked arrays as easily as Numpy";
+    homepage = "https://github.com/scikit-hep/awkward-array";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ costrouc SuperSandro2000 ];
+  };
+}
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..7f79f99e3a67
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aws-adfs/default.nix
@@ -0,0 +1,83 @@
+{ lib
+, boto3
+, botocore
+, buildPythonPackage
+, click
+, configparser
+, fetchFromGitHub
+, fetchpatch
+, fido2
+, lxml
+, poetry-core
+, pyopenssl
+, pytestCheckHook
+, pythonOlder
+, requests
+, requests-kerberos
+, toml
+}:
+
+buildPythonPackage rec {
+  pname = "aws-adfs";
+  version = "2.2.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "venth";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-REJYuOGq22onMj4WcfA7i4/cG99UGZA9D99ESIKY1A8=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    boto3
+    botocore
+    click
+    configparser
+    fido2
+    lxml
+    pyopenssl
+    requests
+    requests-kerberos
+  ];
+
+  patches = [
+    # Apply new fido2 api (See: venth/aws-adfs#243)
+    (fetchpatch {
+      url = "https://github.com/venth/aws-adfs/commit/09836d89256f3537270d760d8aa30ab9284725a8.diff";
+      hash = "sha256-pAAJvOa43BXtyWvV8hsLe2xqd5oI+vzndckRTRol61s=";
+    })
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'boto3 = "^1.20.50"' 'boto3 = "*"' \
+      --replace 'botocore = ">=1.12.6"' 'botocore = "*"'
+  '';
+
+  checkInputs = [
+    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";
+    license = licenses.psfl;
+    maintainers = with maintainers; [ bhipple ];
+  };
+}
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..f2dd2c420527
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aws-lambda-builders/default.nix
@@ -0,0 +1,73 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchFromGitHub
+, mock
+, parameterized
+, pyelftools
+, pytestCheckHook
+, pythonOlder
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "aws-lambda-builders";
+  version = "1.18.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "awslabs";
+    repo = "aws-lambda-builders";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-yAqGVZnnragi3+jaAGnkYNH/XtpH3bojXHmPCrANgJU=";
+  };
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  checkInputs = [
+    mock
+    parameterized
+    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"
+    # 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; {
+    broken = (stdenv.isLinux && stdenv.isAarch64);
+    description = "Tool to compile, build and package AWS Lambda functions";
+    homepage = "https://github.com/awslabs/aws-lambda-builders";
+    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..edd0e9426506
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aws-sam-translator/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, boto3
+, buildPythonPackage
+, fetchFromGitHub
+, jsonschema
+, mock
+, parameterized
+, pytest-env
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "aws-sam-translator";
+  version = "1.47.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "aws";
+    repo = "serverless-application-model";
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-FYEJ+mMxb8+OXUVeyLbAqOnujNi/wNhvAl4Lh4ZeE0I=";
+  };
+
+  propagatedBuildInputs = [
+    boto3
+    jsonschema
+    six
+  ];
+
+  postPatch = ''
+    substituteInPlace requirements/base.txt \
+      --replace "jsonschema~=3.2" "jsonschema>=3.2"
+    substituteInPlace pytest.ini \
+      --replace " --cov samtranslator --cov-report term-missing --cov-fail-under 95" ""
+  '';
+
+  checkInputs = [
+    mock
+    parameterized
+    pytest-env
+    pytestCheckHook
+    pyyaml
+  ];
+
+  disabledTests = [
+    # AssertionError: Expected 7 errors, found 9:
+    "test_errors_13_error_definitionuri"
+  ];
+
+  pythonImportsCheck = [
+    "samtranslator"
+  ];
+
+  meta = with lib; {
+    description = "Python library to transform SAM templates into AWS CloudFormation templates";
+    homepage = "https://github.com/awslabs/serverless-application-model";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
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..fd8ed21cd085
--- /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.10.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-mxSST9BijPkpNgVYZGVTVAA/CxrMPhw//eZAPQeZ3Xo=";
+  };
+
+  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..33d3dcf49918
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/awscrt/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, cmake
+, perl
+, stdenv
+, gcc10
+, CoreFoundation
+, Security
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "awscrt";
+  version = "0.14.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-MGLTFcsWVC/gTdgjny6LwyOO6QRc1QcLkVzy677Lqqw=";
+  };
+
+  buildInputs = lib.optionals stdenv.isDarwin [
+    CoreFoundation
+    Security
+  ];
+
+  # Required to suppress -Werror
+  # https://github.com/NixOS/nixpkgs/issues/39687
+  hardeningDisable = lib.optionals stdenv.cc.isClang [
+    "strictoverflow"
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "extra_link_args += ['-Wl,-fatal_warnings']" ""
+  '';
+
+  # 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";
+    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..7ec8b9008fd4
--- /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}";
+    sha256 = "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..bc6bbcd30d72
--- /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.0";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "aws";
+    repo = "aws-lambda-python-runtime-interface-client";
+    rev = version;
+    sha256 = "1amlaq119mk8fa3fxi3d6vgp83vcd81mbk53jzbixacklmcsp50k";
+  };
+
+  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;
+
+  checkInputs = [ 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/axis/default.nix b/nixpkgs/pkgs/development/python-modules/axis/default.nix
new file mode 100644
index 000000000000..b926a1abc25b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/axis/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, attrs
+, buildPythonPackage
+, fetchFromGitHub
+, httpx
+, packaging
+, xmltodict
+}:
+
+buildPythonPackage rec {
+  pname = "axis";
+  version = "44";
+
+  src = fetchFromGitHub {
+    owner = "Kane610";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-GC8GiDP/QHU+8swe60VFPRx8kSMMHuXjIPEKCja8HPE=";
+  };
+
+  propagatedBuildInputs = [
+    attrs
+    httpx
+    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";
+    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..ee7f9fd44ff4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-appconfiguration/default.nix
@@ -0,0 +1,28 @@
+{ lib, buildPythonPackage, fetchPypi, azure-core
+, msrest
+}:
+
+buildPythonPackage rec {
+  pname = "azure-appconfiguration";
+  version = "1.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "9372467c74930d20827135d468b7fcaa1ad42e4673a4591ceadbb6ad8e1b7e07";
+  };
+
+  propagatedBuildInputs = [
+    azure-core
+    msrest
+  ];
+
+  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";
+    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..f3f395b6f78e
--- /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";
+    sha256 = "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..9a39aa70c64f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-batch/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, msrest
+, azure-common
+, msrestazure
+}:
+
+buildPythonPackage rec {
+  pname = "azure-batch";
+  version = "12.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "sha256-GpseF4mEp79JWvZ7zOUfDbHkqKlXr7KeM1VKFKlnTes=";
+  };
+
+  propagatedBuildInputs = [
+    msrest
+    msrestazure
+    azure-common
+  ];
+
+  # 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..a540ebf0bead
--- /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";
+    sha256 = "sha256-SsDNMhTja2obakQmhnIqXYzESWA6qDPz8PQL2oNnBKM=";
+  };
+
+  propagatedBuildInputs = [
+    azure-nspkg
+  ] ++ lib.optionals (!isPy3k) [ setuptools ]; # need for namespace lookup
+
+  postInstall = if isPy3k then "" else ''
+    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..bc1aaf5f8bd1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-containerregistry/default.nix
@@ -0,0 +1,32 @@
+{ lib, buildPythonPackage, fetchPypi, pythonOlder
+, azure-core
+, msrest
+, msrestazure
+}:
+
+buildPythonPackage rec {
+  pname = "azure-containerregistry";
+  version = "1.0.0";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-DIZCHZM5aeKtmJrgwAk5J26ltaxNxKUn3rR+FbmuyZc=";
+    extension = "zip";
+  };
+
+  propagatedBuildInputs = [ azure-core msrest msrestazure ];
+
+  # 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..352fd019cf94
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-core/default.nix
@@ -0,0 +1,89 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, aiodns
+, aiohttp
+, flask
+, mock
+, msrest
+, pytest
+, pytest-asyncio
+, pytest-trio
+, pytestCheckHook
+, requests
+, six
+, trio
+, typing-extensions }:
+
+buildPythonPackage rec {
+  version = "1.24.2";
+  pname = "azure-core";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "sha256-Dzog0kVlm/gfs2cAcKVBDI1KQymNWpgeYtzjkwAKkIQ=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    six
+    typing-extensions
+  ];
+
+  checkInputs = [
+    aiodns
+    aiohttp
+    flask
+    mock
+    msrest
+    pytest
+    pytest-trio
+    pytest-asyncio
+    pytestCheckHook
+    trio
+  ];
+
+  # 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.optional 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"
+  ];
+
+  meta = with lib; {
+    description = "Microsoft Azure 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-cosmos/default.nix b/nixpkgs/pkgs/development/python-modules/azure-cosmos/default.nix
new file mode 100644
index 000000000000..9cbbd8e64b06
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-cosmos/default.nix
@@ -0,0 +1,30 @@
+{ buildPythonPackage
+, lib
+, fetchPypi
+, six
+, requests
+}:
+
+buildPythonPackage rec {
+  version = "3.2.0";
+  pname = "azure-cosmos";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "4f77cc558fecffac04377ba758ac4e23f076dc1c54e2cf2515f85bc15cbde5c6";
+  };
+
+  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..7f2933e01a56
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-data-tables/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, azure-core
+, msrest
+}:
+
+buildPythonPackage rec {
+  pname = "azure-data-tables";
+  version = "12.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "sha256-3V/I3pHi+JCO+kxkyn9jz4OzBoqbpCYpjeO1QTnpZlw=";
+  };
+
+  propagatedBuildInputs = [
+    azure-core
+    msrest
+  ];
+
+  # 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";
+    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..b201b39d52db
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-datalake-store/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, requests
+, adal
+, azure-common
+, futures ? null
+, pathlib2
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "azure-datalake-store";
+  version = "0.0.52";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "4198ddb32614d16d4502b43d5c9739f81432b7e0e4d75d30e05149fe6007fea2";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    adal
+    azure-common
+  ] ++ lib.optionals (!isPy3k) [
+    futures
+    pathlib2
+  ];
+
+  # 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..99e9198c4fea
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-eventgrid/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, msrest
+, azure-common
+, azure-core
+, msrestazure
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "azure-eventgrid";
+  version = "4.9.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    hash = "sha256-ueuOxhNATK6o/Vue+x5vtP0ac3CQellkuyQmSrq7tqQ=";
+  };
+
+  propagatedBuildInputs = [
+    azure-common
+    azure-core
+    msrest
+    msrestazure
+  ];
+
+  # 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";
+    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..a177f824fa2e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-eventhub/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, azure-core
+, uamqp
+, pythonOlder
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "azure-eventhub";
+  version = "5.10.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "8c83fbe96a420813599a9a3c66adc315b7208f56d5a50a20aa04a8aa7062b074";
+  };
+
+  propagatedBuildInputs = [
+    azure-core
+    uamqp
+    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..bf0af097b158
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-identity/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, azure-common
+, azure-core
+, cryptography
+, mock
+, msal
+, msal-extensions
+, msrest
+, msrestazure
+, pythonOlder
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "azure-identity";
+  version = "1.10.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    hash = "sha256-ZW5QNNnO8pfPmzU3btYgCFJzwYz6Us6kpiW/DV0tZAk=";
+  };
+
+  propagatedBuildInputs = [
+    azure-common
+    azure-core
+    cryptography
+    mock
+    msal
+    msal-extensions
+    msrest
+    msrestazure
+    six
+  ];
+
+  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";
+    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..1f5b2d9cbb48
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-keyvault-administration/default.nix
@@ -0,0 +1,37 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27
+, azure-common
+, azure-core
+, msrest
+}:
+
+buildPythonPackage rec {
+  pname = "azure-keyvault-administration";
+  version = "4.1.1";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "sha256-m5dkKUZoPkpUzSW1K39+wpIfWHc2oRyxMetOf/Ybzuc=";
+  };
+
+  propagatedBuildInputs = [
+    azure-common
+    azure-core
+    msrest
+  ];
+
+  # 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..5079cfa9670c
--- /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.5.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    hash = "sha256-4eIIF90ZSajuzlGFrUOQacWR1AdmSP2cY8EeM5McGZA=";
+  };
+
+  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..01d823ca8fd7
--- /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.6.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    hash = "sha256-D37DHSpOszn/nZavfysPW6O9KLXu4GGjjxt4hybJSa4=";
+  };
+
+  propagatedBuildInputs = [
+    azure-common
+    azure-core
+    msrest
+    cryptography
+  ];
+
+  checkInputs = [
+    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..66c1ded269da
--- /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.5.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    hash = "sha256-IfzSrUti4E4QZzE8dAqHnIRf4CllWzinZF2MI5XQOrI=";
+  };
+
+  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..7b088728b275
--- /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 = "3.0.0";
+  pname = "azure-mgmt-apimanagement";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9262f54ed387eb083d8dae66d32a8df35647319b902bd498cdc376f50a12d154";
+    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..650b54c9dd15
--- /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 = "2.1.0";
+  pname = "azure-mgmt-appconfiguration";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-6s3KfWOlzkoq7uxuDbFMYmW22rOYHtgQgYQ6RMFQiQ8=";
+    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-applicationinsights/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-applicationinsights/default.nix
new file mode 100644
index 000000000000..f547c7fe2b32
--- /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 = "3.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "sha256-mFUKupq4IXywGs6aQQYFYSNNH9PCNxicS1mRneSdhHU=";
+  };
+
+  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..0489cb112b8e
--- /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 = "2.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "0776edc4980be940a8602eefc0372b4d1a1fa26caa46e3c0234e0c7a0feda4ec";
+  };
+
+  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..796c65bcd077
--- /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 = "16.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    hash = "sha256-aWkQZs1aLIbo/arvu4DilAOBrO38gFPfGTtSFNLs5oI=";
+  };
+
+  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..69dff020c8e7
--- /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 = "1.0.0";
+  pname = "azure-mgmt-botservice";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9dae4d749a2a072e22703318ea36e379aec20876c553b2889037c7bdec4b9546";
+    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..af3a30a117fd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-cdn/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, msrest
+, msrestazure
+, azure-common
+, azure-mgmt-nspkg
+, azure-mgmt-core
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-cdn";
+  version = "12.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "sha256-t8PuIYkjS0r1Gs4pJJJ8X9cz8950imQtbVBABnyMnd0=";
+  };
+
+  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 CDN 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-cognitiveservices/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-cognitiveservices/default.nix
new file mode 100644
index 000000000000..312b317d6f62
--- /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.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    hash = "sha256-XUsi5fNpirCTQ9Zz4AdYPvX8/WS7N5sQcT5t2q2YDkg=";
+  };
+
+  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..28043046d8aa
--- /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 = if isPy3k then "" else ''
+    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..6c0f36d92eee
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-compute/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, azure-mgmt-common
+, azure-mgmt-core
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-compute";
+  version = "27.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    hash = "sha256-5caVUxZvt+7L/1LDfcD/SiUwvFVF1KXdS6mDIVrSKJ0=";
+  };
+
+  propagatedBuildInputs = [
+    azure-mgmt-common
+    azure-mgmt-core
+  ];
+
+  pythonNamespaces = [
+    "azure.mgmt"
+  ];
+
+  # 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";
+    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..0f8adb56ad34
--- /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";
+    sha256 = "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..83e1163df467
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-containerinstance/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-containerinstance";
+  version = "9.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "sha256-3rElVUvbGqF99ppZanUUrwFGtCAXak2zhMVOd6n9bkY=";
+  };
+
+  propagatedBuildInputs = [
+    msrest
+    msrestazure
+    azure-common
+    azure-mgmt-core
+  ] ++ lib.optionals (!isPy3k) [
+    azure-mgmt-nspkg
+  ];
+
+  # 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..dc86f5acd738
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-containerregistry/default.nix
@@ -0,0 +1,32 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27
+, azure-common
+, azure-mgmt-core
+, msrest
+, msrestazure
+}:
+
+buildPythonPackage rec {
+  version = "10.0.0";
+  pname = "azure-mgmt-containerregistry";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-HjejK28Em5AeoQ20o4fucnXTlAwADF/SEpVfHn9anZk=";
+    extension = "zip";
+  };
+
+  propagatedBuildInputs = [ azure-common azure-mgmt-core msrest msrestazure ];
+
+  # 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";
+    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..de3bca44c5cf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-containerservice/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-containerservice";
+  version = "20.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "sha256-+XNJbI4LTxx8kcNr6dDlcaGujrqriKaEPb0deo6YbkM=";
+  };
+
+  propagatedBuildInputs = [
+    msrest
+    msrestazure
+    azure-common
+    azure-mgmt-core
+  ];
+
+  # 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";
+    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..2a4b00432f19
--- /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.3.1";
+  pname = "azure-mgmt-core";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "sha256-yJ6/GMInvJih7sypVGC4p+IwWQ1FbI+pwtWs3GcPeAg=";
+  };
+
+  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..d1a717802432
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-cosmosdb/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, msrest
+, msrestazure
+, azure-common
+, azure-mgmt-core
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-cosmosdb";
+  version = "7.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    hash = "sha256-NMwcqgvxwma+aXUhL8OQm+tpH+MCCjHMALf0Ii8bQlo=";
+  };
+
+  propagatedBuildInputs = [
+    msrest
+    msrestazure
+    azure-common
+    azure-mgmt-core
+  ];
+
+  # has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "This is the Microsoft Azure Cosmos DB 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-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..c6907efc9977
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-datafactory/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, msrest
+, msrestazure
+, azure-common
+, azure-mgmt-core
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-datafactory";
+  version = "2.7.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    hash = "sha256-g7av5MFy4QNg+81PqDGznHXUZsHhnaauaJV/B6GMy4A=";
+  };
+
+  propagatedBuildInputs = [
+    msrest
+    msrestazure
+    azure-common
+    azure-mgmt-core
+  ];
+
+  # has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "This is the Microsoft Azure Data Factory 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-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..18665f4dbb6e
--- /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";
+    sha256 = "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..515a8ab6026a
--- /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.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "407c2dacb33513ffbe9ca4be5addb5e9d4bae0cb7efa613c3f7d531ef7bf8de8";
+  };
+
+  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..4955655607d2
--- /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 = "10.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    hash = "sha256-MZqhSBkwypvEefhoEWEPsBUFidWYD7qAX6edcBDDSSA=";
+  };
+
+  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..32e4bc0ebb75
--- /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";
+    sha256 = "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-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..b00b49694328
--- /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.1.0";
+  pname = "azure-mgmt-imagebuilder";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-2EWfTsl5y3Sw4P8d5X7TKxYmO4PagUTNv/SFKdjY2Ss=";
+    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..ea5fbd1c1020
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-iothub/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-iothub";
+  version = "2.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "sha256-nsAeVhs5N8bpwYenmRwJmqF/IAqz/ulSoYIeOU5l0eM=";
+  };
+
+  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 IoTHub 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-iothubprovisioningservices/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-iothubprovisioningservices/default.nix
new file mode 100644
index 000000000000..dfd8581af1aa
--- /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";
+    sha256 = "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..c0efa141785f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-keyvault/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, msrest
+, msrestazure
+, azure-common
+, azure-mgmt-core
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-keyvault";
+  version = "10.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    hash = "sha256-DpO+6FvsNwjjcz2ImhHpColHVNpPUMgCtEMrfUzfAaA=";
+  };
+
+  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 Key Vault 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-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..4c61b55b666c
--- /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;
+    sha256 = "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..26bc4064fb26
--- /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 = "2.2.0";
+  pname = "azure-mgmt-kusto";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-A369Y5cqKthMz43QUvWQHq5ggz93plGObl7K4xnUdnc=";
+    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..d8be6d179383
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-maps/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, msrest
+, msrestazure
+, azure-common
+, azure-mgmt-core
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-maps";
+  version = "2.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "384e17f76a68b700a4f988478945c3a9721711c0400725afdfcb63cf84e85f0e";
+  };
+
+  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 Maps 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-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..57ccffcf997f
--- /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.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    hash = "sha256-KKUeibEAUqKsjjjqpzYBFaQUGniY3rbe+lfCnL0+lpY=";
+  };
+
+  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..d2583b157f76
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-monitor/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, msrest
+, msrestazure
+, azure-common
+, azure-mgmt-core
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-monitor";
+  version = "4.0.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    hash = "sha256-rwUhKm9arvUW3EWAgv3+SdJYR54Hob2RmMDA6IjEpn4=";
+  };
+
+  propagatedBuildInputs = [
+    msrest
+    msrestazure
+    azure-common
+    azure-mgmt-core
+  ];
+
+  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..45a57d1c68a0
--- /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 = "6.1.0";
+
+  disabled = pythonOlder "3.6";
+
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "sha256-lS8da3Al1z1pMLDBf6ZtWc1UFUVgkN1qpKTxt4VXdlQ=";
+  };
+
+  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..717637933e84
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-netapp/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, azure-common
+, azure-mgmt-core
+, msrest
+, msrestazure
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-netapp";
+  version = "8.1.0";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Fdf9wzgeK5HY5d8HwFBokXB2ojHFNMVi9ne9ZQyVh5w=";
+    extension = "zip";
+  };
+
+  propagatedBuildInputs = [
+    azure-common
+    azure-mgmt-core
+    msrest
+    msrestazure
+  ];
+
+  # 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";
+    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..60f67855d924
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-network/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, azure-common
+, azure-mgmt-core
+, msrest
+, msrestazure
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  version = "21.0.0";
+  pname = "azure-mgmt-network";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    hash = "sha256-NwVC9ln7qXDJMwtCc9AyTOq7wnum3xv5DYAg8AmGR8g=";
+  };
+
+  propagatedBuildInputs = [
+    azure-common
+    azure-mgmt-core
+    msrest
+    msrestazure
+  ];
+
+  # 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..c6ed92e0428d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-privatedns/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-privatedns";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b60f16e43f7b291582c5f57bae1b083096d8303e9d9958e2c29227a55cc27c45";
+    extension = "zip";
+  };
+
+  propagatedBuildInputs = [
+    azure-common
+    azure-mgmt-core
+    msrest
+    msrestazure
+  ];
+
+  # 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..68cf99fa0d4a
--- /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";
+    sha256 = "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..4ad3f3bd25f4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-recoveryservices/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-recoveryservices";
+  version = "2.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "sha256-2DeOemVpkjeI/hUdG04IuHU2h3cmk3oG4kr1wIDvdbM=";
+  };
+
+  propagatedBuildInputs = [
+    azure-common
+    azure-mgmt-core
+    msrest
+    msrestazure
+  ] ++ lib.optionals (!isPy3k) [
+    azure-mgmt-nspkg
+  ];
+
+  # 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";
+    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..d5fe92f320b0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-recoveryservicesbackup/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, msrest
+, msrestazure
+, azure-common
+, azure-mgmt-core
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-recoveryservicesbackup";
+  version = "5.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    hash = "sha256-BciA3sFyja5xo9yS3WVglC73y8gTfw8UejdEzbD4HYE=";
+  };
+
+  propagatedBuildInputs = [
+    msrest
+    msrestazure
+    azure-common
+    azure-mgmt-core
+  ];
+
+  # 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";
+    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..b2a763441a33
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-redhatopenshift/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, msrest
+, msrestazure
+, azure-common
+, azure-mgmt-core
+, isPy27
+}:
+
+buildPythonPackage rec {
+  version = "1.1.0";
+  pname = "azure-mgmt-redhatopenshift";
+  disabled = isPy27; # don't feel like fixing namespace issues on python2
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "sha256-Tq8h3fvajxIG2QjtCyHCQDE2deBDioxLLaQQek/O24U=";
+  };
+
+  propagatedBuildInputs = [
+    msrest
+    msrestazure
+    azure-common
+    azure-mgmt-core
+  ];
+
+  pythonNamespaces = "azure.mgmt";
+
+  # no included
+  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..c7890b55b04c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-redis/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-redis";
+  version = "13.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "ece913e5fc7f157e945809e557443f79ff7691cabca4bbc5ecb266352f843179";
+  };
+
+  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 Redis Cache 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-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..0be05eb390f1
--- /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.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    hash = "sha256-5vXdXiRubnzPk4uTFeNHR6rwiHSGbeUREX9eW1pqC3E=";
+  };
+
+  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..8ac4330b45a8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-resource/default.nix
@@ -0,0 +1,39 @@
+{ pkgs
+, buildPythonPackage
+, fetchPypi
+, azure-mgmt-core
+, azure-mgmt-common
+, isPy3k
+}:
+
+
+buildPythonPackage rec {
+  version = "21.1.0";
+  pname = "azure-mgmt-resource";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "sha256-UpZa3jHNBZ/qKxUT1l/mFgRuQz3g5YPc9cnJvr8+vWk=";
+  };
+
+  propagatedBuildInputs = [
+    azure-mgmt-common
+    azure-mgmt-core
+  ];
+
+  # has no tests
+  doCheck = false;
+
+  pythonNamespaces = [ "azure.mgmt" ];
+
+  pythonImportsCheck = [ "azure.mgmt.resource" ];
+
+  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 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..e4cb5b234742
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-search/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, msrest
+, msrestazure
+, azure-common
+, azure-mgmt-core
+, azure-mgmt-nspkg
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-search";
+  version = "8.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "a96d50c88507233a293e757202deead980c67808f432b8e897c4df1ca088da7e";
+  };
+
+  propagatedBuildInputs = [
+    azure-common
+    azure-mgmt-core
+    azure-mgmt-nspkg
+    msrest
+    msrestazure
+  ];
+
+  # 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";
+    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..a947e84f9aef
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-security/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-security";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ae1cff598dfe80e93406e524c55c3f2cbffced9f9b7a5577e3375008a4c3bcad";
+    extension = "zip";
+  };
+
+  propagatedBuildInputs = [
+    azure-common
+    azure-mgmt-core
+    msrest
+    msrestazure
+  ];
+
+  # 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..51843b9ab4a7
--- /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.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    hash = "sha256-R8Narn7eC7j59tDjsgbk9lF0PcOgOwSnzoMp3Qu0rmg=";
+  };
+
+  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..55739e868e76
--- /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";
+    sha256 = "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..f574b32286c4
--- /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;
+    sha256 = "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..baa318bba461
--- /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.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    hash = "sha256-lUNIDyP5W+8aIX7manfMqaO2IJJm/+2O+Buv+Bh4EZE=";
+  };
+
+  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..417264a70ffa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-storage/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, azure-mgmt-common
+, azure-mgmt-core
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-storage";
+  version = "20.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    hash = "sha256-IU8/3oyR4n1T8uZUoo0VADrT9vFchDioIF8MiKSNlFE=";
+  };
+
+  propagatedBuildInputs = [
+    azure-mgmt-common
+    azure-mgmt-core
+  ];
+
+  pythonNamespaces = [
+    "azure.mgmt"
+  ];
+
+  pythonImportsCheck = [
+    "azure.mgmt.storage"
+  ];
+
+  # 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..71257c46c4f2
--- /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.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "157bd9123a5814473a9cd131832ea614c478548722ec01f47b35d778dc307d55";
+  };
+
+  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..68d14c49ef6a
--- /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.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "sha256-R0F2HoA0bE7dTLPycTaOqYBj+ATQFeJFwv4EjtK1lqg=";
+  };
+
+  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..ddaa89d916eb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-web/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-web";
+  version = "7.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "sha256-WvyNgfiliEt6qawqy8Le8eifhxusMkoZbf6YcyY1SBA=";
+  };
+
+  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 Web 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-multiapi-storage/default.nix b/nixpkgs/pkgs/development/python-modules/azure-multiapi-storage/default.nix
new file mode 100644
index 000000000000..84114684476c
--- /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 = "0.9.0";
+  pname = "azure-multiapi-storage";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-7uq8uRZ3MXI1Gy+DmMkRVNV7uZPw6j8r9KfhS8d+tCY=";
+  };
+
+  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..47849c9c6f1a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-servicebus/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, azure-common
+, azure-core
+, buildPythonPackage
+, fetchPypi
+, isodate
+, msrestazure
+, pythonOlder
+, six
+, typing-extensions
+, uamqp
+}:
+
+buildPythonPackage rec {
+  pname = "azure-servicebus";
+  version = "7.8.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    hash = "sha256-KTvJXOJ3o2KUL9iPcus6m0qS3hAAB3Wz0uPgCttFqlk=";
+  };
+
+  propagatedBuildInputs = [
+    azure-common
+    azure-core
+    isodate
+    msrestazure
+    six
+    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";
+    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..6a3caa03e649
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-storage-blob/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, azure-common
+, azure-core
+, azure-storage-common
+, msrest
+, isPy3k
+, futures ? null
+}:
+
+buildPythonPackage rec {
+  pname = "azure-storage-blob";
+  version = "12.13.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "sha256-U/DUzTKXCsn/m5dT+D3S+z+aww4dAecWOMQ2xQm/2IQ=";
+  };
+
+  propagatedBuildInputs = [
+    azure-common
+    azure-core
+    azure-storage-common
+    msrest
+  ] ++ lib.optional (!isPy3k) futures;
+
+  # 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";
+    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..866e8173278d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-storage-file-share/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+
+# pythonPackages
+, azure-core
+, cryptography
+, msrest
+}:
+
+buildPythonPackage rec {
+  pname = "azure-storage-file-share";
+  version = "12.9.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    hash = "sha256-faowRP4H1/dQTLmhX5mhessoyAjtgzQWeL8t+TFfXCI=";
+  };
+
+  propagatedBuildInputs = [
+    azure-core
+    cryptography
+    msrest
+  ];
+
+  # requires 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";
+    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..515b3f398dfd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-storage-queue/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, azure-common
+, azure-storage-common
+}:
+
+buildPythonPackage rec {
+  pname = "azure-storage-queue";
+  version = "2.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "14e82d3691f1bbd23f2aff143a6c17af3c297164f6e597d223b65a67051ba278";
+  };
+
+  propagatedBuildInputs = [
+    azure-common
+    azure-storage-common
+  ];
+
+  # has no tests
+  doCheck = false;
+
+  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";
+    license = licenses.mit;
+    maintainers = with maintainers; [ cmcdragonkai ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-storage/default.nix b/nixpkgs/pkgs/development/python-modules/azure-storage/default.nix
new file mode 100644
index 000000000000..af6652733bd5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-storage/default.nix
@@ -0,0 +1,36 @@
+{ pkgs
+, buildPythonPackage
+, fetchPypi
+, azure-common
+, cryptography
+, futures ? null
+, python-dateutil
+, requests
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  version = "0.36.0";
+  pname = "azure-storage";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0pyasfxkin6j8j00qmky7d9cvpxgis4fi9bscgclj6yrpvf14qpv";
+  };
+
+  propagatedBuildInputs = [ azure-common cryptography python-dateutil requests ]
+                            ++ pkgs.lib.optionals (!isPy3k) [ futures ];
+
+  postPatch = ''
+    rm azure_bdist_wheel.py
+    substituteInPlace setup.cfg \
+      --replace "azure-namespace-package = azure-nspkg" ""
+  '';
+
+  meta = with pkgs.lib; {
+    description = "Microsoft Azure SDK for Python";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ olcai ];
+  };
+}
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..de0909fa0c02
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-synapse-artifacts/default.nix
@@ -0,0 +1,34 @@
+{ lib, buildPythonPackage, fetchPypi
+, azure-common
+, azure-core
+, msrest
+}:
+
+buildPythonPackage rec {
+  pname = "azure-synapse-artifacts";
+  version = "0.13.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "sha256-WJZtE7efs1xwalyb0Sr2J+pmPIt9gn2o01/prncb2uM=";
+  };
+
+  propagatedBuildInputs = [
+    azure-common
+    azure-core
+    msrest
+  ];
+
+  # zero tests run
+  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";
+    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..5c3c8c8c682c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/b2sdk/default.nix
@@ -0,0 +1,78 @@
+{ lib
+, arrow
+, buildPythonPackage
+, fetchPypi
+, importlib-metadata
+, logfury
+, pyfakefs
+, pytestCheckHook
+, pytest-lazy-fixture
+, pytest-mock
+, pythonOlder
+, requests
+, setuptools-scm
+, tqdm
+}:
+
+buildPythonPackage rec {
+  pname = "b2sdk";
+  version = "1.17.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-pyPjjdQ8wzvQitlchGlfNTPwqs0PH6xgplSPUWpjtwM=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    arrow
+    logfury
+    requests
+    tqdm
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    pytest-lazy-fixture
+    pytest-mock
+    pyfakefs
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace 'setuptools_scm<6.0' 'setuptools_scm'
+    substituteInPlace requirements.txt \
+      --replace 'arrow>=0.8.0,<1.0.0' 'arrow'
+  '';
+
+  disabledTestPaths = [
+    # requires aws s3 auth
+    "test/integration/test_download.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";
+    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..5273069d019c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/babel/default.nix
@@ -0,0 +1,25 @@
+{ stdenv, lib, buildPythonPackage, fetchPypi, pytz, pytestCheckHook, freezegun }:
+
+buildPythonPackage rec {
+  pname = "babel";
+  version = "2.10.3";
+
+  src = fetchPypi {
+    pname = "Babel";
+    inherit version;
+    sha256 = "sha256-dhRVNxHul0kPcyEm3Ad/jQrghOvGqW4j2xSCr6vbLFE=";
+  };
+
+  propagatedBuildInputs = [ pytz ];
+
+  checkInputs = [ pytestCheckHook freezegun ];
+
+  doCheck = !stdenv.isDarwin;
+
+  meta = with lib; {
+    homepage = "https://babel.pocoo.org/";
+    description = "Collection of internationalizing tools";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..bd6baccbde43
--- /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; [ jtojnar ];
+  };
+}
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..b5a53b62132b
--- /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";
+  };
+
+  checkInputs = [ 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..9671b7b5a267
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/backoff/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchFromGitHub, pytestCheckHook, poetry, pytest-asyncio, responses }:
+
+buildPythonPackage rec {
+  pname = "backoff";
+  version = "2.1.2";
+
+  src = fetchFromGitHub {
+    owner = "litl";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-eKd1g3UxXlpSlNlik80RKXRaw4mZyvAWl3i2GNuZ3hI=";
+  };
+
+  format = "pyproject";
+
+  nativeBuildInputs = [ poetry ];
+
+  checkInputs = [ pytestCheckHook pytest-asyncio responses ];
+
+  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..7bb8c4e81225
--- /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;
+    sha256 = "sha256-rdgKbVQaELilPrN4ve8RbbaLiT14Xex0esy5vUX2ZBc=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    wheel
+  ];
+
+  checkInputs = [
+    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..7db161b86110
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/backports-datetime-fromisoformat/default.nix
@@ -0,0 +1,23 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "backports-datetime-fromisoformat";
+  version = "1.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0p0gyhfqq6gssf3prsy0pcfq5w0wx2w3pcjqbwx3imvc92ls4xwm";
+  };
+
+  # no tests in pypi package
+  doCheck = false;
+
+  pythonImportsCheck = [ "backports.datetime_fromisoformat" ];
+
+  meta = with lib; {
+    description = "Backport of Python 3.7's datetime.fromisoformat";
+    homepage = "https://github.com/movermeyer/backports.datetime_fromisoformat";
+    license = licenses.mit;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..84618e8da1d8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/backports-entry-points-selectable/default.nix
@@ -0,0 +1,32 @@
+{ lib, buildPythonPackage, fetchPypi, pythonOlder, setuptools-scm, importlib-metadata }:
+
+buildPythonPackage rec {
+  pname = "backports-entry-points-selectable";
+  version = "1.1.1";
+
+  src = fetchPypi {
+    pname = "backports.entry_points_selectable";
+    inherit version;
+    sha256 = "914b21a479fde881635f7af5adc7f6e38d6b274be32269070c53b698c60d5386";
+  };
+
+  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; {
+    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; [ SuperSandro2000 ];
+  };
+}
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..52163abe8bcf
--- /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";
+  };
+
+  checkInputs = [ 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-zoneinfo/default.nix b/nixpkgs/pkgs/development/python-modules/backports-zoneinfo/default.nix
new file mode 100644
index 000000000000..5fa4c6323169
--- /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;
+    sha256 = "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" ];
+
+  checkInputs = [
+    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_abc/default.nix b/nixpkgs/pkgs/development/python-modules/backports_abc/default.nix
new file mode 100644
index 000000000000..d67117613d7f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/backports_abc/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "backports_abc";
+  version = "0.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "033be54514a03e255df75c5aee8f9e672f663f93abb723444caec8fe43437bde";
+  };
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest discover
+  '';
+
+  meta = {
+    homepage = "https://github.com/cython/backports_abc";
+    license = lib.licenses.psfl;
+    description = "A backport of recent additions to the 'collections.abc' module";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/backports_csv/default.nix b/nixpkgs/pkgs/development/python-modules/backports_csv/default.nix
new file mode 100644
index 000000000000..6086178c9597
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/backports_csv/default.nix
@@ -0,0 +1,20 @@
+{ lib, buildPythonPackage, fetchPypi, future }:
+
+buildPythonPackage rec {
+
+  pname = "backports.csv";
+  version = "1.0.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0vdx5jlhs91iizc8j8l8811nqprwvdx39pgkdc82w2qkfgzxyxqj";
+  };
+
+  propagatedBuildInputs = [ future ];
+
+  meta = with lib; {
+    description = "Backport of Python 3 csv module";
+    homepage = "https://github.com/ryanhiebert";
+    license = licenses.psfl;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/backports_functools_lru_cache/default.nix b/nixpkgs/pkgs/development/python-modules/backports_functools_lru_cache/default.nix
new file mode 100644
index 000000000000..680d23782f56
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/backports_functools_lru_cache/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools-scm
+, isPy3k
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "backports.functools_lru_cache";
+  version = "1.6.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d5ed2169378b67d3c545e5600d363a923b09c456dab1593914935a68ad478271";
+  };
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  checkInputs = [ pytestCheckHook ];
+
+  # Test fail on Python 2
+  doCheck = isPy3k;
+
+  pythonNamespaces = [ "backports" ];
+
+  meta = {
+    description = "Backport of functools.lru_cache";
+    homepage = "https://github.com/jaraco/backports.functools_lru_cache";
+    license = lib.licenses.mit;
+  };
+}
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..7fd9bca3a796
--- /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 commited 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";
+  };
+
+  checkInputs = [
+    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/backports_ssl_match_hostname/default.nix b/nixpkgs/pkgs/development/python-modules/backports_ssl_match_hostname/default.nix
new file mode 100644
index 000000000000..a7403e16123a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/backports_ssl_match_hostname/default.nix
@@ -0,0 +1,18 @@
+{ lib, buildPythonPackage, fetchPypi, pythonAtLeast }:
+
+buildPythonPackage rec {
+  pname = "backports.ssl_match_hostname";
+  version = "3.7.0.1";
+  disabled = pythonAtLeast "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "bb82e60f9fbf4c080eabd957c39f0641f0fc247d9a16e31e26d594d8f42b9fd2";
+  };
+
+  meta = with lib; {
+    description = "The Secure Sockets layer is only actually *secure*";
+    homepage = "https://bitbucket.org/brandon/backports.ssl_match_hostname";
+    license = licenses.psfl;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/backports_tempfile/default.nix b/nixpkgs/pkgs/development/python-modules/backports_tempfile/default.nix
new file mode 100644
index 000000000000..0d1203d28be2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/backports_tempfile/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, python
+, buildPythonPackage
+, fetchPypi
+, setuptools-scm
+, backports_weakref
+}:
+
+buildPythonPackage rec {
+  pname = "backports.tempfile";
+  version = "1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1c648c452e8770d759bdc5a5e2431209be70d25484e1be24876cf2168722c762";
+  };
+
+  buildInputs = [ setuptools-scm ];
+
+  propagatedBuildInputs = [ backports_weakref ];
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest discover -s tests
+  '';
+
+  # requires https://pypi.org/project/backports.test.support
+  doCheck = false;
+
+  meta = {
+    description = "Backport of new features in Python's tempfile module";
+    license = lib.licenses.psfl;
+    homepage = "https://github.com/pjdelport/backports.tempfile";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/backports_unittest-mock/default.nix b/nixpkgs/pkgs/development/python-modules/backports_unittest-mock/default.nix
new file mode 100644
index 000000000000..bf81efce8d89
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/backports_unittest-mock/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchPypi, setuptools-scm, mock }:
+
+buildPythonPackage rec {
+  pname = "backports.unittest_mock";
+  version = "1.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "eff58e53de8fdeb27a1c87a9d57e7b91d15d1bc3854e85344b1a2e69f31ecda7";
+  };
+
+  propagatedBuildInputs = [ mock ];
+
+  buildInputs = [ setuptools-scm ];
+
+  # does not contain tests
+  doCheck = false;
+  pythonImportsCheck = [ "backports.unittest_mock" ];
+
+  meta = with lib; {
+    description = "Provides a function install() which makes the mock module";
+    homepage = "https://github.com/jaraco/backports.unittest_mock";
+    license = licenses.mit;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/backports_weakref/default.nix b/nixpkgs/pkgs/development/python-modules/backports_weakref/default.nix
new file mode 100644
index 000000000000..4db504ac3306
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/backports_weakref/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools-scm
+# , backports
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "backports.weakref";
+  version = "1.0.post1";
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "bc4170a29915f8b22c9e7c4939701859650f2eb84184aee80da329ac0b9825c2";
+  };
+
+  buildInputs = [ setuptools-scm ];
+#   checkInputs = [ backports ];
+
+  # Requires backports package
+  doCheck = false;
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest discover tests
+  '';
+
+  meta = with lib; {
+    description = "Backports of new features in Python’s weakref module";
+    license = licenses.psfl;
+    maintainers = with maintainers; [ jyp ];
+  };
+}
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..40d06f7da8a0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bacpypes/default.nix
@@ -0,0 +1,32 @@
+{ lib, buildPythonPackage, fetchFromGitHub
+, wheel, pytestCheckHook, pytest-runner, pythonAtLeast }:
+
+buildPythonPackage rec {
+  version = "0.18.4";
+  pname = "bacpypes";
+  disabled = pythonAtLeast "3.9";
+
+  src = fetchFromGitHub {
+    owner = "JoelBender";
+    repo = "bacpypes";
+    rev = version;
+    sha256 = "1z5v0i7ms8na062wxd5ki43yy5z2d9cns0p4vdmkx2drwsbzlav2";
+  };
+
+  propagatedBuildInputs = [ wheel ];
+
+  # Using pytes instead of setuptools check hook allows disabling specific tests
+  checkInputs = [ pytestCheckHook pytest-runner ];
+  dontUseSetuptoolsCheck = true;
+  disabledTests = [
+    # Test fails with a an error: AssertionError: assert 30 == 31
+    "test_recurring_task_5"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/JoelBender/bacpypes";
+    description = "BACpypes provides a BACnet application layer and network layer written in Python for daemons, scripting, and graphical interfaces.";
+    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..67aed7c186fd
--- /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;
+
+  checkInputs = [
+    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/banal/default.nix b/nixpkgs/pkgs/development/python-modules/banal/default.nix
new file mode 100644
index 000000000000..793de7d3a765
--- /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 = teams.determinatesystems.members;
+  };
+}
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..cf1bbd9c54aa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bandit/default.nix
@@ -0,0 +1,44 @@
+{ buildPythonPackage
+, fetchPypi
+, lib
+, isPy3k
+
+# pythonPackages
+, GitPython
+, pbr
+, pyyaml
+, six
+, stevedore
+}:
+
+buildPythonPackage rec {
+  pname = "bandit";
+  version = "1.7.4";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-LWOoxXNBe64ziWLUubBvvGCA907NlVoJKEnh5lxxe9I=";
+  };
+
+  propagatedBuildInputs = [
+    GitPython
+    pbr
+    pyyaml
+    six
+    stevedore
+  ];
+
+  # Framework is Tox, tox performs 'pip install' inside the virtual-env
+  #   and this requires Network Connectivity
+  doCheck = false;
+
+  meta = {
+    description = "Security oriented static analyser for python code";
+    homepage = "https://bandit.readthedocs.io/en/latest/";
+    license = lib.licenses.asl20;
+    maintainers = with lib.maintainers; [
+      kamadorueda
+    ];
+  };
+}
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/baron/default.nix b/nixpkgs/pkgs/development/python-modules/baron/default.nix
new file mode 100644
index 000000000000..e5a752dd5dbb
--- /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 ];
+
+  checkInputs = [ 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..348422e31fa7
--- /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" ""
+  '';
+
+  checkInputs = [ 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..6fe7a111b5d4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/base58/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pyhamcrest
+, pytest-benchmark
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "base58";
+  version = "2.1.1";
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c5d0cb3f5b6e81e8e35da5754388ddcc6d0d14b6c6a132cb93d69ed580a7278c";
+  };
+
+  checkInputs = [
+    pyhamcrest
+    pytest-benchmark
+    pytestCheckHook
+  ];
+
+  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..e81eca6e137d
--- /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=";
+  };
+
+  checkInputs = [
+    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/baseline/default.nix b/nixpkgs/pkgs/development/python-modules/baseline/default.nix
new file mode 100644
index 000000000000..0bee2295ed56
--- /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";
+  };
+
+  checkInputs = [ 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..66972dc8b239
--- /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;
+
+  checkInputs = [
+    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..ebdbbe4d1594
--- /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 = "source/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..b0a1aac746ff
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/basemap/default.nix
@@ -0,0 +1,76 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonAtLeast
+, basemap-data
+, cython
+, geos
+, numpy
+, matplotlib
+, pillow
+, pyproj
+, pyshp
+, python
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "basemap";
+  version = "1.3.3";
+
+  src = fetchFromGitHub {
+    owner = "matplotlib";
+    repo = "basemap";
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-ObRQ5GsYx3k7fLaaK5Z4Td54rW/Nnx5+2zm8KLCIZl8=";
+  };
+
+  sourceRoot = "source/packages/basemap";
+
+  postPatch = ''
+    substituteInPlace requirements.txt \
+      --replace "numpy >= 1.21, < 1.23" "numpy >= 1.21, < 1.24" \
+      --replace "pyshp >= 1.2, < 2.2" "pyshp >= 1.2, < 2.4"
+  '';
+
+  nativeBuildInputs = [
+    cython
+    geos
+    setuptools
+  ];
+
+  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/default.nix b/nixpkgs/pkgs/development/python-modules/bash_kernel/default.nix
new file mode 100644
index 000000000000..ba4672a17746
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bash_kernel/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, ipykernel
+, isPy27
+, python
+, pexpect
+, bash
+}:
+
+buildPythonPackage rec {
+  pname = "bash_kernel";
+  version = "0.7.2";
+  format = "flit";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0w0nbr3iqqsgpk83rgd0f5b02462bkyj2n0h6i9dwyc1vpnq9350";
+  };
+
+  patches = [
+    (fetchpatch {
+      url = "https://patch-diff.githubusercontent.com/raw/takluyver/bash_kernel/pull/69.diff";
+      sha256 = "1qd7qjjmcph4dk6j0bl31h2fdmfiyyazvrc9xqqj8y21ki2sl33j";
+    })
+  ];
+
+  postPatch = ''
+    substituteInPlace bash_kernel/kernel.py \
+      --replace "'bash'" "'${bash}/bin/bash'" \
+      --replace "\"bash\"" "'${bash}/bin/bash'"
+  '';
+
+  propagatedBuildInputs = [ ipykernel pexpect ];
+
+  # no tests
+  doCheck = false;
+
+  preBuild = ''
+    export HOME=$TMPDIR
+  '';
+
+  postInstall = ''
+    ${python.interpreter} -m bash_kernel.install --prefix $out
+  '';
+
+  meta = {
+    description = "Bash Kernel for Jupyter";
+    homepage = "https://github.com/takluyver/bash_kernel";
+    license = lib.licenses.bsd3;
+    maintainers = with lib.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..0ee12c414804
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bashlex/default.nix
@@ -0,0 +1,40 @@
+{ enum-compat
+, lib
+, buildPythonPackage
+, fetchFromGitHub
+, nose
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "bashlex";
+  version = "0.15";
+
+  src = fetchFromGitHub {
+    owner = "idank";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-kKVorAIKlyC9vUzLOlaZ/JrG1kBBRIvLwBmHNj9nx84=";
+  };
+
+  checkInputs = [ nose ];
+  propagatedBuildInputs = [ enum-compat ];
+
+  # workaround https://github.com/idank/bashlex/issues/51
+  preBuild = ''
+    ${python.interpreter} -c 'import bashlex'
+  '';
+
+  checkPhase = ''
+    ${python.interpreter} -m nose --with-doctest
+  '';
+
+  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..4fda2f331f6d
--- /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
+, scikitimage
+, threadpoolctl
+}:
+
+buildPythonPackage rec {
+  pname = "batchgenerators";
+  version = "0.24";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "MIC-DKFZ";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-47jAeHMJPBk7GpUvXtQuJchgiSy6M50anftsuXWk2ag=";
+  };
+
+  propagatedBuildInputs = [
+    future
+    numpy
+    pillow
+    scipy
+    scikit-learn
+    scikitimage
+    threadpoolctl
+  ];
+
+  # see https://github.com/MIC-DKFZ/batchgenerators/pull/78
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace '"unittest2",' ""
+  '';
+
+  checkInputs = [
+    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..2b7cd1b21ecc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/batchspawner/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, jupyterhub
+, isPy27
+}:
+
+buildPythonPackage rec {
+  pname = "batchspawner";
+  version = "1.1.0";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "jupyterhub";
+    repo = "batchspawner";
+    rev = "v${version}";
+    sha256 = "0zv485b7fk5zlwgp5fyibanqzbpisdl2a0gz70fwdj4kl462axnw";
+  };
+
+  propagatedBuildInputs = [
+    jupyterhub
+  ];
+
+  # 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://jupyter.org";
+    license = licenses.bsd3;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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/bayesian-optimization/default.nix b/nixpkgs/pkgs/development/python-modules/bayesian-optimization/default.nix
new file mode 100644
index 000000000000..ec27aa5e37ae
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bayesian-optimization/default.nix
@@ -0,0 +1,41 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchFromGitHub
+, scikit-learn
+, scipy
+, pytest
+, isPy27
+}:
+
+buildPythonPackage rec {
+  pname = "bayesian-optimization";
+  version = "1.2.0";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "fmfn";
+    repo = "BayesianOptimization";
+    rev = version;
+    sha256 = "01mg9npiqh1qmq5ldnbpjmr8qkiw827msiv3crpkhbj4bdzasbfm";
+  };
+
+  propagatedBuildInputs = [
+    scikit-learn
+    scipy
+  ];
+
+  checkInputs = [ pytest ];
+  checkPhase = ''
+    # New sklearn broke one test: https://github.com/fmfn/BayesianOptimization/issues/243
+    pytest tests -k "not test_suggest_with_one_observation"
+  '';
+
+  meta = with lib; {
+    broken = (stdenv.isLinux && stdenv.isAarch64) || stdenv.isDarwin;
+    description = "A Python implementation of global optimization with gaussian processes";
+    homepage = "https://github.com/fmfn/BayesianOptimization";
+    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..4f6753790196
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bayespy/default.nix
@@ -0,0 +1,45 @@
+{ stdenv, lib, buildPythonPackage, fetchPypi, pythonOlder
+, pytestCheckHook, nose, glibcLocales, fetchpatch
+, numpy, scipy, matplotlib, h5py }:
+
+buildPythonPackage rec {
+  pname = "bayespy";
+  version = "0.5.22";
+
+  # 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 = "ed0057dc22bd392df4b3bba23536117e1b2866e3201b12c5a37428d23421a5ba";
+  };
+
+  patches = [
+    # Change from scipy to locally defined epsilon
+    # https://github.com/bayespy/bayespy/pull/126
+    (fetchpatch {
+      name = "locally-defined-epsilon.patch";
+      url = "https://github.com/bayespy/bayespy/commit/9be53bada763e19c2b6086731a6aa542ad33aad0.patch";
+      sha256 = "sha256-KYt/0GcaNWR9K9/uS2OXgK7g1Z+Bayx9+IQGU75Mpuo=";
+    })
+  ];
+
+  checkInputs = [ 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..a07551197b84
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bbox/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, pyquaternion
+, numpy
+}:
+
+buildPythonPackage rec {
+  pname = "bbox";
+  version = "0.9.2";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-ucR7mg9eubEefjC7ratEgrb9h++a26z8KV38n3N2kcw=";
+  };
+
+  propagatedBuildInputs = [ pyquaternion numpy ];
+
+  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-python-hcl2/default.nix b/nixpkgs/pkgs/development/python-modules/bc-python-hcl2/default.nix
new file mode 100644
index 000000000000..9adb93d0324d
--- /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.3.45";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-OmUN6wpsVP9/CS+JkEhirDBp1MqeA3oEcU77T5nJ9GU=";
+  };
+
+  # Nose is required during build process, so can not use `checkInputs`.
+  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/bcrypt/default.nix b/nixpkgs/pkgs/development/python-modules/bcrypt/default.nix
new file mode 100644
index 000000000000..592b5b22d47d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bcrypt/default.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;
+    sha256 = "sha256-QzxBDCF3BXcF2iqfLNAd0VdJOyp6wUyFk6FrPatra/s=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    six
+    cffi
+  ];
+
+  propagatedNativeBuildInputs = [
+    cffi
+  ];
+
+  checkInputs = [
+    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/beaker/default.nix b/nixpkgs/pkgs/development/python-modules/beaker/default.nix
new file mode 100644
index 000000000000..9b692ef92f2a
--- /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
+  ];
+
+  checkInputs = [
+    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/default.nix b/nixpkgs/pkgs/development/python-modules/beancount/default.nix
new file mode 100644
index 000000000000..6ba700cc6e24
--- /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.5";
+  pname = "beancount";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-FONWJaLpy9Q8rmF42gjLPxIk9iYeVBymcm3zXZjpw2o=";
+  };
+
+  # 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/beancount_docverif/default.nix b/nixpkgs/pkgs/development/python-modules/beancount_docverif/default.nix
new file mode 100644
index 000000000000..b39b52970f01
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/beancount_docverif/default.nix
@@ -0,0 +1,51 @@
+{ lib, buildPythonPackage, fetchPypi, isPy3k
+, setuptools-scm
+, beancount
+, pytest, sh
+}:
+
+buildPythonPackage rec {
+  version = "1.0.1";
+  pname = "beancount_docverif";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-CFBv1FZP5JO+1MPnD86ttrO42zZlvE157zqig7s4HOg=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    beancount
+  ];
+
+  checkInputs = [
+    pytest
+    sh
+  ];
+
+  checkPhase = ''
+    pytest
+  '';
+
+  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.
+        - Explictly 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/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..8aeda35741cf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/beartype/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "beartype";
+  version = "0.10.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-JOxp9qf05ul69APQjeJw3vMkhRgGAycJXSOxxN9kvyo=";
+  };
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "beartype"
+  ];
+
+  meta = with lib; {
+    description = "Fast runtime type checking for Python";
+    homepage = "https://github.com/beartype/beartype";
+    license = licenses.mit;
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+}
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..ee11ead039e7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/beautifulsoup4/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, chardet
+, html5lib
+, lxml
+, pytestCheckHook
+, pythonOlder
+, soupsieve
+, sphinxHook
+}:
+
+buildPythonPackage rec {
+  pname = "beautifulsoup4";
+  version = "4.11.1";
+  format = "setuptools";
+  outputs = ["out" "doc"];
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-rZqlW2XvKAjrQF9Gz3Tff8twRNXLwmSH+W6y7y5DZpM=";
+  };
+
+  nativeBuildInputs = [
+    sphinxHook
+  ];
+
+  propagatedBuildInputs = [
+    chardet
+    html5lib
+    lxml
+    soupsieve
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "bs4"
+  ];
+
+  meta = with lib; {
+    homepage = "http://crummy.com/software/BeautifulSoup/bs4/";
+    description = "HTML and XML parser";
+    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..e222a8cdd9c4
--- /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
+  ];
+
+  checkInputs = [
+    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/bech32/default.nix b/nixpkgs/pkgs/development/python-modules/bech32/default.nix
new file mode 100644
index 000000000000..33b9044d758f
--- /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;
+    sha256 = "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/bedup/default.nix b/nixpkgs/pkgs/development/python-modules/bedup/default.nix
new file mode 100644
index 000000000000..454a972f177b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bedup/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, btrfs-progs
+, contextlib2
+, pyxdg
+, pycparser
+, alembic
+, cffi
+, pythonOlder
+, isPyPy
+}:
+
+buildPythonPackage rec {
+  version = "0.10.1";
+  pname = "bedup";
+  disabled = pythonOlder "3.3";
+
+  src = fetchFromGitHub {
+    owner = "g2p";
+    repo = "bedup";
+    rev = "v${version}";
+    sha256 = "0sp8pmjkxcqq0alianfp41mwq7qj10rk1qy31pjjp9kiph1rn0x6";
+  };
+
+  buildInputs = [ btrfs-progs ];
+  propagatedBuildInputs = [ contextlib2 pyxdg pycparser alembic ]
+    ++ lib.optionals (!isPyPy) [ cffi ];
+
+  meta = with lib; {
+    description = "Deduplication for Btrfs";
+    longDescription = ''
+      Deduplication for Btrfs. bedup looks for new and changed files,
+      making sure that multiple copies of identical files share space
+      on disk. It integrates deeply with btrfs so that scans are
+      incremental and low-impact.
+    '';
+    homepage = "https://github.com/g2p/bedup";
+    license = licenses.gpl2;
+    maintainers = with maintainers; [ bluescreen303 ];
+  };
+}
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..5254f79c4b2f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/behave/default.nix
@@ -0,0 +1,52 @@
+{ lib, stdenv, fetchFromGitHub
+, buildPythonApplication, python
+, pytestCheckHook, mock, path, pyhamcrest, pytest-html
+, glibcLocales
+, colorama, cucumber-tag-expressions, parse, parse-type, six
+}:
+
+buildPythonApplication rec {
+  pname = "behave";
+  version = "1.2.7.dev2";
+
+  src = fetchFromGitHub {
+    owner = "behave";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-B8PUN1Q4UAsDWrHjPZDlpaPjCKjI/pAogCSI+BQnaWs=";
+  };
+
+  checkInputs = [ 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..35f939fba1a8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bellows/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, click
+, click-log
+, dataclasses
+, pure-pcapy3
+, pyserial-asyncio
+, voluptuous
+, zigpy
+, asynctest
+, pythonOlder
+, pytestCheckHook
+, pytest-asyncio
+, pytest-timeout
+}:
+
+buildPythonPackage rec {
+  pname = "bellows";
+  version = "0.32.0";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "zigpy";
+    repo = "bellows";
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-+kD1V0SfRm0yYi64ciwtFK7YSVXnED6fBzQcGj6KKbo=";
+  };
+
+  propagatedBuildInputs = [
+    click
+    click-log
+    pure-pcapy3
+    pyserial-asyncio
+    voluptuous
+    zigpy
+  ] ++ lib.optionals (pythonOlder "3.7") [
+    dataclasses
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    pytest-asyncio
+    pytest-timeout
+  ]  ++ lib.optionals (pythonOlder "3.8") [
+    asynctest
+  ];
+
+  pythonImportsCheck = [
+    "bellows"
+  ];
+
+  meta = with lib; {
+    description = "Python module to implement EZSP for EmberZNet devices";
+    homepage = "https://github.com/zigpy/bellows";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ mvnetbiz ];
+  };
+}
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/bespon/default.nix b/nixpkgs/pkgs/development/python-modules/bespon/default.nix
new file mode 100644
index 000000000000..da6820ef6ecc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bespon/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  version = "0.6.0";
+  pname = "BespON";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "2f2bda67fea8ee95c8aa7e885835ab88bdbfa392a94077ce1c9d29017420ce7a";
+  };
+
+  propagatedBuildInputs = [ ];
+  # 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/bibtexparser/default.nix b/nixpkgs/pkgs/development/python-modules/bibtexparser/default.nix
new file mode 100644
index 000000000000..d8bfe8e9a668
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bibtexparser/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, future
+, pyparsing
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "bibtexparser";
+  version = "1.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "sciunto-org";
+    repo = "python-${pname}";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-Z+opmknmgyFwvKJyvrv3MMpo23etZCn4bxGTpG5d/dY=";
+  };
+
+  propagatedBuildInputs = [
+    future
+    pyparsing
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    # https://github.com/sciunto-org/python-bibtexparser/pull/259
+    substituteInPlace bibtexparser/tests/test_crossref_resolving.py \
+      --replace "import unittest2 as unittest" "import unittest"
+  '';
+
+  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..f59e6418fe91
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bidict/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, sphinx
+, hypothesis
+, py
+, pytestCheckHook
+, pytest-benchmark
+, sortedcollections
+, sortedcontainers
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "bidict";
+  version = "0.22.0";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-XIJrPhXpfMbmFd4pV1aEfCgqebecVDDTv8kJsayfW9g=";
+  };
+
+  propagatedBuildInputs = [
+    sphinx
+  ];
+
+  checkInputs = [
+    hypothesis
+    py
+    pytestCheckHook
+    pytest-benchmark
+    sortedcollections
+    sortedcontainers
+  ];
+
+  pythonImportsCheck = [ "bidict" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/jab/bidict";
+    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..e59c8baa511f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bids-validator/default.nix
@@ -0,0 +1,26 @@
+{ buildPythonPackage
+, lib
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  version = "1.9.7";
+  pname = "bids-validator";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-q8dnOSoN9Gu9yl/UJNRXeTBBKTnfJhHwqN6+QVTlexI=";
+  };
+
+  # 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";
+    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..617b87bc12f1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/biliass/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, protobuf
+}:
+
+buildPythonPackage rec {
+  pname = "biliass";
+  version = "1.3.5";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-kgoQUX2l5YENEozcnfluwvcAO1ZSxlfHPVIa9ABW6IU=";
+  };
+
+  propagatedBuildInputs = [ protobuf ];
+
+  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..303d334936c6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/billiard/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, case
+, psutil
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "billiard";
+  version = "4.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-NE2aHX063fFx6yxZbJ6Y0e/4Gw4D8fk5iTmjUYyiY6k=";
+  };
+
+  checkInputs = [
+    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";
+    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..a9ca9833a55f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bimmer-connected/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, pbr
+, httpx
+, pycryptodome
+, pyjwt
+, pytestCheckHook
+, respx
+, time-machine
+}:
+
+buildPythonPackage rec {
+  pname = "bimmer-connected";
+  version = "0.10.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "bimmerconnected";
+    repo = "bimmer_connected";
+    rev = "refs/tags/${version}";
+    hash = "sha256-RgF9uQREFOLvAUtoXixywSfQExu6W3qw0JCqVw9Nl9w=";
+  };
+
+  nativeBuildInputs = [
+    pbr
+  ];
+
+  PBR_VERSION = version;
+
+  propagatedBuildInputs = [
+    httpx
+    pycryptodome
+    pyjwt
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    respx
+    time-machine
+  ];
+
+  meta = with lib; {
+    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/binaryornot/default.nix b/nixpkgs/pkgs/development/python-modules/binaryornot/default.nix
new file mode 100644
index 000000000000..103bd79294e6
--- /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 ];
+
+  checkInputs = [ 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..d5ec4774010c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bincopy/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchPypi, argparse-addons, humanfriendly, pyelftools }:
+
+buildPythonPackage rec {
+  pname = "bincopy";
+  version = "17.10.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-d1l+kqyGkBvctfKRHxCpve/8mLa7nTfDwXzxgJznce4=";
+  };
+
+  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..a63df0d7d399
--- /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.3";
+
+  src = fetchFromGitHub {
+    owner = "ReFirmLabs";
+    repo = "binwalk";
+    rev = "v${version}";
+    sha256 = "0phqyqv34vhh80dgipiggs4n3iq2vfjk9ywx2c5d8g61vzgbd2g8";
+  };
+
+  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)
+  '';
+
+  checkInputs = [ 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/biopython/default.nix b/nixpkgs/pkgs/development/python-modules/biopython/default.nix
new file mode 100644
index 000000000000..002b3ce2e292
--- /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.79";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "edb07eac99d3b8abd7ba56ff4bedec9263f76dfc3c3f450e7d2e2bcdecf8559b";
+  };
+
+  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..737dad3550cc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bip_utils/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, ecdsa
+, pysha3
+}:
+
+buildPythonPackage rec {
+  pname = "bip_utils";
+  version = "2.5.1";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "ebellocchia";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-lH8hd+JA1FhGH60MYIIuwHjr/4wFbYeuw/hd60kr1xc=";
+  };
+
+  propagatedBuildInputs = [ ecdsa pysha3 ];
+
+  pythonImportsCheck = [
+    "bip_utils"
+  ];
+
+  meta = {
+    description = "Implementation of BIP39, BIP32, BIP44, BIP49 and BIP84 for wallet seeds, keys and addresses generation";
+    homepage = "https://github.com/ebellocchia/bip_utils";
+    license = with lib.licenses; [ mit ];
+    maintainers = with lib.maintainers; [ prusnak ];
+  };
+}
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..c6714c3d4cbc
--- /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";
+  };
+
+  checkInputs = [
+    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..7ee76f2f2fe8
--- /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.5.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-jTj2B1EAgJmmWdWs+zXvQVAYPv/Vsr+mwQGZJw3fTJw=";
+  };
+
+  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..358a4d163f3e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bitbox02/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildPythonPackage, fetchPypi, base58, ecdsa, hidapi, noiseprotocol, protobuf, semver, typing-extensions }:
+
+buildPythonPackage rec {
+  pname = "bitbox02";
+  version = "6.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-wTateh3dJycFNozLaQbAzXF0avr2ofBdjlqqcOBLr/0=";
+  };
+
+  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/";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..820fa883676a
--- /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.4";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-n3tEQkl6KBAno4LY67lZme3TIvsm35VA2yyfWYuIE1c=";
+  };
+
+  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.13.3" "ecdsa>=0.13.3"
+  '';
+
+  # 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..f3eb86c7bbb1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bitcoinlib/default.nix
@@ -0,0 +1,29 @@
+{ stdenv, lib, buildPythonPackage, isPy3k, fetchFromGitHub, openssl }:
+
+let ext = if stdenv.isDarwin then "dylib" else "so";
+in buildPythonPackage rec {
+  pname = "bitcoinlib";
+  version = "0.11.0";
+
+  disabled = !isPy3k;
+
+  src = fetchFromGitHub {
+    owner  = "petertodd";
+    repo   = "python-bitcoinlib";
+    rev    = "python-${pname}-v${version}";
+    sha256 = "0pwypd966zzivb37fvg4l6yr7ihplqnr1jwz9zm3biip7x89bdzm";
+  };
+
+  postPatch = ''
+    substituteInPlace bitcoin/core/key.py --replace \
+      "ctypes.util.find_library('ssl') or 'libeay32'" \
+      "'${lib.getLib openssl}/lib/libssl.${ext}'"
+  '';
+
+  meta = {
+    homepage = src.meta.homepage;
+    description = "Easy interface to the Bitcoin data structures and protocol";
+    license = with lib.licenses; [ lgpl3 ];
+    maintainers = with lib.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..200f3edf038a
--- /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
+  ];
+
+  checkInputs = [
+    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..dc11813554af
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bite-parser/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, poetry-core
+, pytest-asyncio
+, pytestCheckHook
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "bite-parser";
+  version = "0.1.3";
+
+  disabled = pythonOlder "3.7";
+
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0f246e98a5556d6ed9a33fda1e94c3ab906305729feb30d25e35344b3e1c1fd9";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  checkInputs = [
+    pytest-asyncio
+    pytestCheckHook
+    typing-extensions
+  ];
+
+  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..1e7f24144645
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bitlist/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nose
+, parts
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "bitlist";
+  version = "1.0.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-rpXQKkV2RUuYza+gfpGEH3kFJ+hjuNGKV2i46eXQUUI=";
+  };
+
+  propagatedBuildInputs = [
+    parts
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    nose
+  ];
+
+  pythonImportsCheck = [
+    "bitlist"
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "--doctest-modules --ignore=docs --cov=bitlist --cov-report term-missing" ""
+  '';
+
+  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..66a42858650c
--- /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";
+  };
+
+  checkInputs = [ (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/bitstring/default.nix b/nixpkgs/pkgs/development/python-modules/bitstring/default.nix
new file mode 100644
index 000000000000..52bc9bae865b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bitstring/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "bitstring";
+  version = "3.1.9";
+
+  src = fetchFromGitHub {
+    owner = "scott-griffiths";
+    repo = pname;
+    rev = "bitstring-${version}";
+    sha256 = "0y2kcq58psvl038r6dhahhlhp1wjgr5zsms45wyz1naq6ri8x9qa";
+  };
+
+  checkPhase = ''
+    cd test
+    ${python.interpreter} -m unittest discover
+  '';
+
+  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..4602e650b7f3
--- /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.15.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-b6atv7jzuMtowhsTqmXSPrLDrDJBmrkm8/0f/3F6kSU=";
+  };
+
+  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..80aed4e6fef5
--- /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 ];
+
+  checkInputs = [ 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..61a93bf98655
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/black/default.nix
@@ -0,0 +1,86 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, setuptools-scm
+, pytestCheckHook
+, aiohttp
+, aiohttp-cors
+, click
+, colorama
+, mypy-extensions
+, pathspec
+, parameterized
+, platformdirs
+, tomli
+, typed-ast
+, typing-extensions
+, uvloop
+}:
+
+
+buildPythonPackage rec {
+  pname = "black";
+  version = "22.6.0";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-bG054ortN5rsQNocZUNMd9deZbtZoeHCg95UX7Tnxsk=";
+  };
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  # 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;
+
+  checkInputs = [ pytestCheckHook parameterized ];
+
+  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);
+
+  propagatedBuildInputs = [
+    aiohttp
+    aiohttp-cors
+    click
+    colorama
+    mypy-extensions
+    pathspec
+    platformdirs
+    tomli
+    uvloop
+  ] ++ lib.optional (pythonOlder "3.8") typed-ast
+  ++ lib.optional (pythonOlder "3.10") typing-extensions;
+
+  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;
+    maintainers = with maintainers; [ sveitser autophagy ];
+  };
+}
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..06cefc9bbb0d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bleach/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, six
+, html5lib
+, setuptools
+, packaging
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "bleach";
+  version = "5.0.1";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-DQMlXEfrm9Lyaqm7fyEHcy5+j+GVyi9kcJ/POwpKCFw=";
+  };
+
+  propagatedBuildInputs = [
+    packaging
+    six
+    html5lib
+    setuptools
+  ];
+
+  checkInputs = [
+    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..248ca673fab4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bleak-retry-connector/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, async-timeout
+, bleak
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+, pytest-asyncio
+}:
+
+buildPythonPackage rec {
+  pname = "bleak-retry-connector";
+  version = "1.8.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Bluetooth-Devices";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-wtzZ94nHfVtX8YakMLGxhqvn95v93qL2Qz9OeBRB520=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    async-timeout
+    bleak
+  ];
+
+  checkInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace " --cov=bleak_retry_connector --cov-report=term-missing:skip-covered" ""
+  '';
+
+  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";
+    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..bd66c47c6cc1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bleak/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, bluez
+, buildPythonPackage
+, dbus-next
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "bleak";
+  version = "0.15.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-2MjYjeDyKhW9E1ugVsTlsvufFRGSg97yGx7X1DwA1ZA=";
+  };
+
+  propagatedBuildInputs = [
+    dbus-next
+    typing-extensions
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    # bleak checks BlueZ's version with a call to `bluetoothctl --version`
+    substituteInPlace bleak/backends/bluezdbus/__init__.py \
+      --replace \"bluetoothctl\" \"${bluez}/bin/bluetoothctl\"
+  '';
+
+  pythonImportsCheck = [
+    "bleak"
+  ];
+
+  meta = with lib; {
+    description = "Bluetooth Low Energy platform agnostic client";
+    homepage = "https://github.com/hbldh/bleak";
+    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..5f695e0922e4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/blebox-uniapi/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, aiohttp
+, semver
+, asynctest
+, deepmerge
+, pytest-asyncio
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "blebox-uniapi";
+  version = "2.0.2";
+
+  src = fetchFromGitHub {
+    owner = "blebox";
+    repo = "blebox_uniapi";
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-0Yiooy7YSUFjqqcyH2fPQ6AWuR0EJxfRRZTw/6JGcMA=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "pytest-runner" ""
+  '';
+
+  propagatedBuildInputs = [
+    aiohttp
+    semver
+  ];
+
+  checkInputs = [
+    asynctest
+    deepmerge
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "blebox_uniapi" ];
+
+  meta = with lib; {
+    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/blessed/default.nix b/nixpkgs/pkgs/development/python-modules/blessed/default.nix
new file mode 100644
index 000000000000..592c36692d0f
--- /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.19.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-mg0JlpW/Yh1GgN1sc/atVH9qNEL72+gMSx2qHtvEkvw=";
+  };
+
+  checkInputs = [ 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..00b7fd9a63d7
--- /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 ];
+  checkInputs = [ 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..ceb6413da31c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/blinker/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "blinker";
+  version = "1.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-kj5eL2nBVfLMQtr7vXDhbj/eJNLUqiq3L744YjiJJGI=";
+  };
+
+  checkInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "blinker" ];
+
+  meta = with lib; {
+    homepage = "https://pythonhosted.org/blinker/";
+    description = "Fast, simple object-to-object and broadcast signaling";
+    license = licenses.mit;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..236f481df2ee
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/blinkpy/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, python-dateutil
+, python-slugify
+, requests
+, pytestCheckHook
+, pythonAtLeast
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "blinkpy";
+  version = "0.19.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "fronzbot";
+    repo = "blinkpy";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-depaXtbXo5F1JC3M24i6ynWhpm9x9O7UCjkoSzFaSZI=";
+  };
+
+  propagatedBuildInputs = [
+    python-dateutil
+    python-slugify
+    requests
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "blinkpy"
+    "blinkpy.api"
+    "blinkpy.auth"
+    "blinkpy.blinkpy"
+    "blinkpy.camera"
+    "blinkpy.helpers.util"
+    "blinkpy.sync_module"
+  ];
+
+  disabledTests = lib.optionals (pythonAtLeast "3.10") [
+    "test_download_video_exit"
+    "test_parse_camera_not_in_list"
+    "test_parse_downloaded_items"
+  ];
+
+  meta = with lib; {
+    description = "Python library for the Blink Camera system";
+    homepage = "https://github.com/fronzbot/blinkpy";
+    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..8e7dd0b11fb5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/blinkstick/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pyusb
+}:
+
+buildPythonPackage rec {
+  pname = "BlinkStick";
+  version = "1.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0rdk3i81s6byw23za0bxvkh7sj5l16qxxgc2c53qjg3klc24wcm9";
+  };
+
+  # Upstream fix https://github.com/arvydas/blinkstick-python/pull/54
+  # https://github.com/arvydas/blinkstick-python/pull/54/commits/b9bee2cd72f799f1210e5d9e13207f93bbc2d244.patch
+  # has line ending issues after 1.2.0
+  postPatch = ''
+    substituteInPlace setup.py --replace "pyusb==1.0.0" "pyusb>=1.0.0"
+  '';
+
+  propagatedBuildInputs = [ pyusb ];
+
+  # Project has no tests
+  doCheck = false;
+  pythonImportsCheck = [ "blinkstick" ];
+
+  meta = with lib; {
+    description = "Python package to control BlinkStick USB devices";
+    homepage = "https://github.com/arvydas/blinkstick-python";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ np ];
+  };
+}
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..290e1928414f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/blis/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, cython
+, hypothesis
+, numpy
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "blis";
+  version = "0.9.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-aZ4coUlnFjcLS5tSfFjYQr+JKGPY2UTNoy+HIO08tCk=";
+  };
+
+  nativeBuildInputs = [
+    cython
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+
+  checkInputs = [
+    hypothesis
+    pytest
+  ];
+
+  meta = with lib; {
+    description = "BLAS-like linear algebra library";
+    homepage = "https://github.com/explosion/cython-blis";
+    license = licenses.bsd3;
+    platforms = platforms.x86_64;
+  };
+}
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..64ffc5ff4b3e
--- /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.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "af70c3be444f2f2d07c0603cef547b51bbd9f4fbd4aadebd8f1e8ee73ccbc5e5";
+  };
+
+  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..34245d93560c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/blockdiag/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, buildPythonPackage
+, docutils
+, fetchFromGitHub
+, 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;
+    sha256 = "sha256-j8FoNUIJJOaahaol1MRPyY2jcPCEIlaAD4bmM2QKFFI=";
+  };
+
+  propagatedBuildInputs = [
+    setuptools
+    funcparserlib
+    pillow
+    webcolors
+    reportlab
+    docutils
+  ];
+
+  checkInputs = [
+    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 SuperSandro2000 ];
+  };
+}
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..d26bdfa0851e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/blocksat-cli/default.nix
@@ -0,0 +1,53 @@
+{ buildPythonPackage
+, fetchPypi
+, lib
+, distro
+, pysnmp
+, python-gnupg
+, qrcode
+, requests
+, sseclient-py
+, zfec
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "blocksat-cli";
+  version = "0.4.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-btwL8l5UdE9FwWXfuf1OHa8EwXDoFrh8tvOwr1yhyRg=";
+  };
+
+  propagatedBuildInputs = [
+    distro
+    pysnmp
+    python-gnupg
+    qrcode
+    requests
+    sseclient-py
+    zfec
+  ];
+
+  checkInputs = [ 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"
+  ];
+
+  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/blspy/default.nix b/nixpkgs/pkgs/development/python-modules/blspy/default.nix
new file mode 100644
index 000000000000..d4122dddc8bc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/blspy/default.nix
@@ -0,0 +1,71 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchFromGitHub
+, setuptools-scm
+, substituteAll
+, cmake
+, boost
+, gmp
+, pybind11
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "blspy";
+  version = "1.0.13";
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-feuHVtBgjzGBjY1eSKh47feTT8prdkSwvs993lJSSiI=";
+  };
+
+  patches = [
+    # prevent CMake from trying to get libraries on the Internet
+    (substituteAll {
+      src = ./dont_fetch_dependencies.patch;
+      pybind11_src = pybind11.src;
+      relic_src = fetchFromGitHub {
+        owner = "Chia-Network";
+        repo = "relic";
+        rev = "215c69966cb78b255995f0ee9c86bbbb41c3c42b"; # pinned by blspy
+        hash = "sha256-wivK18Cp7BMZJvrYxJgSHInRZgFgsgSzd0YIy5IWoYA=";
+      };
+      sodium_src = fetchFromGitHub {
+        owner = "AmineKhaldi";
+        repo = "libsodium-cmake";
+        rev = "f73a3fe1afdc4e37ac5fe0ddd401bf521f6bba65"; # pinned by blspy
+        sha256 = "sha256-lGz7o6DQVAuEc7yTp8bYS2kwjzHwGaNjugDi1ruRJOA=";
+        fetchSubmodules = true;
+      };
+      catch2_src = fetchFromGitHub {
+        owner = "catchorg";
+        repo = "Catch2";
+        rev = "v3.0.0-preview5"; # pinned by blspy
+        sha256 = "sha256-IQ1yGZo3nKHTqScUoq3i3Njxqvk7uW8hQ3GT0/SxGaw=";
+      };
+    })
+  ];
+
+  nativeBuildInputs = [ cmake setuptools-scm ];
+
+  buildInputs = [ boost gmp.static pybind11 ];
+
+  pythonImportsCheck = [
+    "blspy"
+  ];
+
+  # Note: upstream testsuite is just a single test.py script outside of any framework
+  doCheck = false;
+
+  # CMake needs to be run by setuptools rather than by its hook
+  dontConfigure = true;
+
+  meta = with lib; {
+    description = "BLS signatures with aggregation";
+    homepage = "https://github.com/Chia-Network/bls-signatures/";
+    license = licenses.asl20;
+    maintainers = teams.chia.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/blspy/dont_fetch_dependencies.patch b/nixpkgs/pkgs/development/python-modules/blspy/dont_fetch_dependencies.patch
new file mode 100644
index 000000000000..3184e3f0ea8e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/blspy/dont_fetch_dependencies.patch
@@ -0,0 +1,64 @@
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 6922167..23d8da6 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -31,29 +31,18 @@ set(CMAKE_MODULE_PATH
+ include(FetchContent)
+ 
+ FetchContent_Declare(Sodium
+-  GIT_REPOSITORY https://github.com/AmineKhaldi/libsodium-cmake.git
+-  # Latest commit at the moment this was added here
+-  # Anchored to libsodium v1.0.18
+-  GIT_TAG f73a3fe1afdc4e37ac5fe0ddd401bf521f6bba65
++  URL @sodium_src@
+ )
+ set(SODIUM_PCH "on" CACHE STRING "")
+ set(SODIUM_DISABLE_TESTS "on" CACHE STRING "")
+ set(SODIUM_CHIA_MINIMAL "on" CACHE STRING "")
+ FetchContent_MakeAvailable(Sodium)
+ 
+-if (DEFINED ENV{RELIC_MAIN})
+-  set(RELIC_GIT_TAG "origin/main")
+-else ()
+-  # This is currently anchored to upstream aecdcae7956f542fbee2392c1f0feb0a8ac41dc5
+-  set(RELIC_GIT_TAG "215c69966cb78b255995f0ee9c86bbbb41c3c42b")
+-endif ()
+-
+ message(STATUS "Relic will be built from: ${RELIC_GIT_TAG}")
+ 
+ FetchContent_Declare(
+   relic
+-  GIT_REPOSITORY https://github.com/Chia-Network/relic.git
+-  GIT_TAG ${RELIC_GIT_TAG}
++  SOURCE_DIR @relic_src@
+ )
+ 
+ # Relic related options
+diff --git a/python-bindings/CMakeLists.txt b/python-bindings/CMakeLists.txt
+index 5a8c381..d9aa940 100644
+--- a/python-bindings/CMakeLists.txt
++++ b/python-bindings/CMakeLists.txt
+@@ -1,8 +1,7 @@
+ 
+ FetchContent_Declare(
+   pybind11
+-  GIT_REPOSITORY https://github.com/pybind/pybind11.git
+-  GIT_TAG        v2.6.2
++  SOURCE_DIR @pybind11_src@
+ )
+ FetchContent_MakeAvailable(pybind11 relic)
+ 
+diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
+index 449164a..15a955e 100644
+--- a/src/CMakeLists.txt
++++ b/src/CMakeLists.txt
+@@ -37,8 +37,7 @@ install(FILES $<TARGET_FILE:bls> DESTINATION lib)
+ if(BUILD_BLS_TESTS)
+   FetchContent_Declare(
+     Catch2
+-    GIT_REPOSITORY https://github.com/catchorg/Catch2.git
+-    GIT_TAG        v3.0.0-preview5
++    URL @catch2_src@
+   )
+   FetchContent_MakeAvailable(Catch2)
+   add_executable(runtest test.cpp)
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..039470a7b3e8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bluetooth-adapters/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, poetry-core
+, async-timeout
+, dbus-next
+, myst-parser
+, pytestCheckHook
+, sphinxHook
+, sphinx-rtd-theme
+}:
+
+buildPythonPackage rec {
+  pname = "bluetooth-adapters";
+  version = "0.2.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "Bluetooth-Devices";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-S6ZTUGBLCZ4gaiKTxC8xa4KDBl/zoZQ2vlFuXdcwLmk=";
+  };
+
+  postPatch = ''
+    # Drop pytest arguments (coverage, ...)
+    sed -i '/addopts/d' pyproject.toml
+  '';
+
+  outputs = [
+    "out"
+    "doc"
+  ];
+
+  nativeBuildInputs = [
+    myst-parser
+    poetry-core
+    sphinx-rtd-theme
+    sphinxHook
+  ];
+
+  propagatedBuildInputs = [
+    async-timeout
+    dbus-next
+  ];
+
+  pythonImportsCheck = [
+    "bluetooth_adapters"
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/bluetooth-devices/bluetooth-adapters/blob/main/CHANGELOG.md";
+    description = "Tools to enumerate and find Bluetooth Adapters";
+    homepage = "https://bluetooth-adapters.readthedocs.io/";
+    license = licenses.asl20;
+    maintainers = teams.home-assistant.members;
+  };
+}
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..8744adc57555
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bluetooth-data-tools/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "bluetooth-data-tools";
+  version = "0.1.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "Bluetooth-Devices";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-AobkHODtWun2TPxb6yR/ieYyeIndTG0KmxTY81fQHCA=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  checkInputs = [
+    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";
+    license = with 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..a511e23cd945
--- /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.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "Bluetooth-Devices";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-Btfya9l1UX7GbiUxuaFHT0l+pG+Dg5X0L2JS+1/VYOo=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    home-assistant-bluetooth
+    sensor-state-data
+  ];
+
+  checkInputs = [
+    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..665f08f7987c
--- /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
+  '';
+
+  checkInputs = [
+    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..9797a7ab0d8f
--- /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}";
+    sha256 = "sha256-gmdRxMJ0DoCyNcb/bYp746PBi4HktHAAYOcSQJ0Uheg=";
+  };
+
+  propagatedBuildInputs = [
+    smbus-cffi
+  ];
+
+  preBuild = ''
+    cd library
+  '';
+
+  checkInputs = [
+    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/bokeh/default.nix b/nixpkgs/pkgs/development/python-modules/bokeh/default.nix
new file mode 100644
index 000000000000..75ca944830f1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bokeh/default.nix
@@ -0,0 +1,100 @@
+{ buildPythonPackage
+, fetchPypi
+, futures ? null
+, isPy27
+, isPyPy
+, jinja2
+, lib
+, mock
+, numpy
+, nodejs
+, packaging
+, pillow
+#, pytestCheckHook#
+, pytest
+, python-dateutil
+, pyyaml
+, selenium
+, six
+, substituteAll
+, tornado
+, typing-extensions
+, pytz
+, flaky
+, networkx
+, beautifulsoup4
+, requests
+, nbconvert
+, icalendar
+, pandas
+, pythonImportsCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "bokeh";
+  # update together with panel which is not straightforward
+  version = "2.4.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-7zOAEWGvN5Zlq3o0aE8iCYYeOu/VyAOiH7u5nZSHSwM=";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./hardcode-nodejs-npmjs-paths.patch;
+      node_bin = "${nodejs}/bin/node";
+      npm_bin = "${nodejs}/bin/npm";
+    })
+  ];
+
+  disabled = isPyPy || isPy27;
+
+  nativeBuildInputs = [
+    pythonImportsCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "bokeh"
+  ];
+
+  checkInputs = [
+    mock
+    pytest
+    pillow
+    selenium
+    pytz
+    flaky
+    networkx
+    beautifulsoup4
+    requests
+    nbconvert
+    icalendar
+    pandas
+  ];
+
+  propagatedBuildInputs = [
+    pillow
+    jinja2
+    python-dateutil
+    six
+    pyyaml
+    tornado
+    numpy
+    packaging
+    typing-extensions
+  ]
+  ++ lib.optionals ( isPy27 ) [
+    futures
+  ];
+
+  # This test suite is a complete pain. Somehow it can't find its fixtures.
+  doCheck = false;
+
+  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..f8f33c0021f2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bokeh/hardcode-nodejs-npmjs-paths.patch
@@ -0,0 +1,15 @@
+diff --git a/bokeh/util/compiler.py b/bokeh/util/compiler.py
+index a752aad7d..8af05ff63 100644
+--- a/bokeh/util/compiler.py
++++ b/bokeh/util/compiler.py
+@@ -442,8 +442,8 @@ def _detect_nodejs():
+     raise RuntimeError('node.js v%s or higher is needed to allow compilation of custom models ' % version +
+                        '("conda install nodejs" or follow https://nodejs.org/en/download/)')
+ 
+-_nodejs = None
+-_npmjs = None
++_nodejs = "@node_bin@"
++_npmjs = "@npm_bin@"
+ 
+ def _nodejs_path():
+     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..c5c2ecb68bc4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/boltons/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, pytestCheckHook
+, pythonAtLeast
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "boltons";
+  version = "21.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "mahmoud";
+    repo = "boltons";
+    rev = version;
+    hash = "sha256-8HO7X2PQEbQIQsCa2cMHQI3rlofVT22GYrWNXY34MLk=";
+  };
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  patches = lib.optionals (pythonAtLeast "3.10") [
+    # pprint has no attribute _safe_repr, https://github.com/mahmoud/boltons/issues/294
+    (fetchpatch {
+      name = "fix-pprint-attribute.patch";
+      url = "https://github.com/mahmoud/boltons/commit/270e974975984f662f998c8f6eb0ebebd964de82.patch";
+      sha256 = "sha256-pZLfr6SRCw2aLwZeYaX7bzfJeZC4cFUILEmnVsKR6zc=";
+    })
+  ];
+
+  pythonImportsCheck = [
+    "boltons"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/mahmoud/boltons";
+    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
+    '';
+    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..ae467123e9bc
--- /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.6.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    pname = "BoltzTraP2";
+    inherit version;
+    hash = "sha256-zEKRsNg5P+KKQCeB49TiiSXRmusvr1zwssHhppZdkfA=";
+  };
+
+  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; [ costrouc ];
+  };
+}
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..1a07de6dccef
--- /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
+  ];
+
+  checkInputs = [
+    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..9b64d1e0a9b5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bond-async/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, aiohttp
+, aioresponses
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "bond-async";
+  version = "0.1.22";
+
+  disabled = pythonOlder "3.7";
+
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "bondhome";
+    repo = "bond-async";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-wU1niuzHwNmrmyjcTlBIKrBf1wMbHHFlIBxFNHUwDw4=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  checkInputs = [
+    aioresponses
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "bond_async"
+  ];
+
+  meta = {
+    description = "Asynchronous Python wrapper library over Bond Local API";
+    homepage = "https://github.com/bondhome/bond-async";
+    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..3ac516e5e1b7
--- /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=";
+  };
+
+  checkInputs = [
+    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..f5f3dda77a45
--- /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
+  ];
+
+  checkInputs = [ 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..109487b88b94
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/boost-histogram/default.nix
@@ -0,0 +1,28 @@
+{ lib, fetchPypi, buildPythonPackage, isPy3k, boost, numpy, pytestCheckHook, pytest-benchmark, setuptools-scm }:
+
+buildPythonPackage rec {
+  pname = "boost-histogram";
+  version = "1.3.1";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    pname = "boost_histogram";
+    inherit version;
+    sha256 = "sha256-Mc05Zlbzo3g04H0wTNuE2ZBrwhcmJqPZL+V30IvPQQ8=";
+  };
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  buildInputs = [ boost ];
+
+  propagatedBuildInputs = [ numpy ];
+
+  checkInputs = [ 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/bootstrapped-pip/default.nix b/nixpkgs/pkgs/development/python-modules/bootstrapped-pip/default.nix
new file mode 100644
index 000000000000..b2846e3a13a1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bootstrapped-pip/default.nix
@@ -0,0 +1,67 @@
+{ lib, stdenv, python, makeWrapper, unzip
+, pipInstallHook
+, setuptoolsBuildHook
+, wheel, pip, setuptools
+}:
+
+stdenv.mkDerivation rec {
+  pname = "pip";
+  inherit (pip) version;
+  name = "${python.libPrefix}-bootstrapped-${pname}-${version}";
+
+  srcs = [ wheel.src pip.src setuptools.src ];
+  sourceRoot = ".";
+
+  dontUseSetuptoolsBuild = true;
+  dontUsePipInstall = true;
+
+  # Should be propagatedNativeBuildInputs
+  propagatedBuildInputs = [
+    # Override to remove dependencies to prevent infinite recursion.
+    (pipInstallHook.override{pip=null;})
+    (setuptoolsBuildHook.override{setuptools=null; wheel=null;})
+  ];
+
+  postPatch = ''
+    mkdir -p $out/bin
+  '';
+
+  nativeBuildInputs = [ makeWrapper unzip ];
+  buildInputs = [ python ];
+
+  dontBuild = true;
+
+  installPhase = lib.optionalString (!stdenv.hostPlatform.isWindows) ''
+    export SETUPTOOLS_INSTALL_WINDOWS_SPECIFIC_FILES=0
+  '' + ''
+    # Give folders a known name
+    mv pip* pip
+    mv setuptools* setuptools
+    mv wheel* wheel
+    # Set up PYTHONPATH. The above folders need to be on PYTHONPATH
+    # $out is where we are installing to and takes precedence
+    export PYTHONPATH="$out/${python.sitePackages}:$(pwd)/pip/src:$(pwd)/setuptools:$(pwd)/setuptools/pkg_resources:$(pwd)/wheel:$PYTHONPATH"
+
+    echo "Building setuptools wheel..."
+    pushd setuptools
+    rm pyproject.toml
+    ${python.pythonForBuild.interpreter} -m pip install --no-build-isolation --no-index --prefix=$out  --ignore-installed --no-dependencies --no-cache .
+    popd
+
+    echo "Building wheel wheel..."
+    pushd wheel
+    ${python.pythonForBuild.interpreter} -m pip install --no-build-isolation --no-index --prefix=$out  --ignore-installed --no-dependencies --no-cache .
+    popd
+
+    echo "Building pip wheel..."
+    pushd pip
+    ${python.pythonForBuild.interpreter} -m pip install --no-build-isolation --no-index --prefix=$out  --ignore-installed --no-dependencies --no-cache .
+    popd
+  '';
+
+  meta = {
+    description = "Version of pip used for bootstrapping";
+    license = lib.unique (pip.meta.license ++ setuptools.meta.license ++ wheel.meta.license);
+    homepage = pip.meta.homepage;
+  };
+}
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..277a55637f73
--- /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.32";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "tschamm";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-tJlgmxa6HppLLTs4ZggnJ5H6NOH3v+C9pUfLBmxr4XY=";
+  };
+
+  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/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..586f023f8009
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/boto/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonAtLeast
+, python
+, nose
+, mock
+, requests
+, httpretty
+}:
+
+buildPythonPackage rec {
+  pname = "boto";
+  version = "2.49.0";
+  disabled = pythonAtLeast "3.10"; # cannot import name 'Mapping' from 'collections'
+
+  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
+  ];
+
+  checkPhase = ''
+    ${python.interpreter} tests/test.py default
+  '';
+
+  checkInputs = [ 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 = [ maintainers.costrouc ];
+  };
+}
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..834df14102f0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/boto3/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, botocore
+, jmespath
+, s3transfer
+, futures ? null
+, docutils
+, nose
+, mock
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "boto3";
+  version = "1.24.42"; # N.B: if you change this, change botocore and awscli to a matching version
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-3z1u8CMEvXw3EQkJNsCS1dtzXdoQneysHiNsPvf9t68=";
+  };
+
+  propagatedBuildInputs = [ botocore jmespath s3transfer ] ++ lib.optionals (!isPy3k) [ futures ];
+  checkInputs = [ docutils nose mock ];
+
+  checkPhase = ''
+    runHook preCheck
+    # This method is not in mock. It might have appeared in some versions.
+    sed -i 's/action.assert_called_once()/self.assertEqual(action.call_count, 1)/' \
+      tests/unit/resources/test_factory.py
+    nosetests -d tests/unit --verbose
+    runHook postCheck
+  '';
+
+  # Network access
+  doCheck = false;
+
+  pythonImportsCheck = [ "boto3" ];
+
+  meta = {
+    homepage = "https://github.com/boto/boto3";
+    license = lib.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.
+    '';
+  };
+}
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..d7e525897604
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/botocore/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python-dateutil
+, jmespath
+, docutils
+, simplejson
+, mock
+, nose
+, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "botocore";
+  version = "1.27.42"; # N.B: if you change this, change boto3 and awscli to a matching version
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-OKGApmZsWpsGmnXsPPN0/ypkw+kMnySpFoWLzesERW0=";
+  };
+
+  propagatedBuildInputs = [
+    python-dateutil
+    jmespath
+    docutils
+    simplejson
+    urllib3
+  ];
+
+  checkInputs = [ mock nose ];
+
+  checkPhase = ''
+    nosetests -v
+  '';
+
+  # Network access
+  doCheck = false;
+
+  pythonImportsCheck = [ "botocore" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/boto/botocore";
+    license = licenses.asl20;
+    description = "A low-level interface to a growing number of Amazon Web Services";
+  };
+}
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..6532312ab71b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bottle/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "bottle";
+  version = "0.12.21";
+
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "787c61b6cc02b9c229bf2663011fac53dd8fc197f7f8ad2eeede29d888d7887e";
+  };
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    cd test
+  '';
+
+  disabledTests = [
+    "test_delete_cookie"
+    "test_error"
+    "test_error_in_generator_callback"
+  ];
+
+  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..5774397e24f2
--- /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.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "Bottleneck";
+    inherit version;
+    hash = "sha256-LA0nr+RTUfb0IYkzYmIYBPp96hT+KaeOqlLUMj9kbec=";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  checkInputs = [
+    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/boxx/default.nix b/nixpkgs/pkgs/development/python-modules/boxx/default.nix
new file mode 100644
index 000000000000..f8ab26fae171
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/boxx/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+, xvfb-run
+, matplotlib
+, scikitimage
+, numpy
+, pandas
+, imageio
+, snakeviz
+, fn
+, pyopengl
+, seaborn
+, pytorch
+, pythonOlder
+, torchvision
+}:
+
+buildPythonPackage rec {
+  pname = "boxx";
+  version = "0.10.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-6qO/aPegHk+1PAu8qzIkC3fULh2WjgJcqNui+XEaLQw=";
+  };
+
+  propagatedBuildInputs = [
+    matplotlib
+    scikitimage
+    numpy
+    pandas
+    imageio
+    snakeviz
+    fn
+    pyopengl
+    seaborn
+  ];
+
+  checkInputs = [
+    xvfb-run
+    pytorch
+    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..94e1bb122c77
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bpycv/bpycv-test.py
@@ -0,0 +1,76 @@
+# based on https://github.com/DIYer22/bpycv/blob/c576e01622d87eb3534f73bf1a5686bd2463de97/example/ycb_demo.py
+import bpy
+import bpycv
+
+import os
+import glob
+import random
+
+example_data_dir = os.environ['BPY_EXAMPLE_DATA']
+
+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
+
+# 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()
+
+dataset_dir = "./dataset"
+result.save(dataset_dir=dataset_dir, fname="0", save_blend=True)
+print(f'Save to "{dataset_dir}"')
+print(f'Open "{dataset_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..7a88a4078f0b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bpycv/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchFromGitHub
+, fetchurl
+, writeText
+, blender
+, minexr
+, beautifulsoup4
+, zcs
+, requests
+, opencv3
+, boxx
+}:
+
+buildPythonPackage rec {
+  pname = "bpycv";
+  version = "0.2.43";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-6LXhKuNkX3yKeZARLXmOVNAUQhJghtzKhnszJ1G/a8U=";
+  };
+
+  propagatedBuildInputs = [
+    beautifulsoup4
+    minexr
+    zcs
+    requests
+    opencv3
+    boxx
+  ];
+
+  postPatch = ''
+    sed -i 's/opencv-python//g' requirements.txt
+  '';
+
+  # pythonImportsCheck = [ "bpycv" ]; # this import depends on bpy that is only available inside blender
+  checkInputs = [ blender ];
+  checkPhase = let
+    bpycv_example_data = fetchFromGitHub {
+      owner = "DIYer22";
+      repo = "bpycv_example_data";
+      sha256 = "sha256-dGb6KvbXTGTu5f4AqhA+i4AwTqBoR5SdXk0vsMEcD3Q=";
+      rev = "6ce0e65c107d572011394da16ffdf851e988dbb4";
+    };
+  in ''
+    TEMPDIR=$(mktemp -d)
+    pushd $TEMPDIR
+      cp -r ${bpycv_example_data} example_data
+      chmod +w -R example_data
+      BPY_EXAMPLE_DATA=${bpycv_example_data} blender -b -P ${./bpycv-test.py}
+    popd
+  '';
+
+  meta = with lib; {
+    description = "Computer vision utils for Blender";
+    homepage = "https://github.com/DIYer22/bpycv";
+    license = licenses.mit;
+    maintainers = with maintainers; [ lucasew ];
+  };
+}
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..b66f81d032e2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bpython/default.nix
@@ -0,0 +1,73 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, curtsies
+, cwcwidth
+, dataclasses
+, greenlet
+, jedi
+, pygments
+, pytestCheckHook
+, pythonOlder
+, pyperclip
+, pyxdg
+, requests
+, substituteAll
+, typing-extensions
+, urwid
+, watchdog
+}:
+
+buildPythonPackage rec {
+  pname = "bpython";
+  version = "0.22.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-H7HgpSMyV5/E49z3XiF5avZ6rivkYBeez8zpUwpJogA=";
+  };
+
+  propagatedBuildInputs = [
+    curtsies
+    cwcwidth
+    greenlet
+    jedi
+    pygments
+    pyperclip
+    pyxdg
+    requests
+    typing-extensions
+    urwid
+    watchdog
+  ] ++ lib.optionals (pythonOlder "3.7") [
+    dataclasses
+  ];
+
+  postInstall = ''
+    substituteInPlace "$out/share/applications/org.bpython-interpreter.bpython.desktop" \
+      --replace "Exec=/usr/bin/bpython" "Exec=$out/bin/bpython"
+  '';
+
+  checkInputs = [
+    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/braceexpand/default.nix b/nixpkgs/pkgs/development/python-modules/braceexpand/default.nix
new file mode 100644
index 000000000000..c5e711bb8043
--- /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";
+  };
+
+  checkInputs = [ 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..d5f080d8d4f6
--- /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.3.post1";
+  format = "pyproject";
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-57I/yLLNBtPewGkrqr7LJJ3alOBqYXkB/wOmxW/XFpM=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  checkInputs = [ 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; [ SuperSandro2000 ];
+  };
+}
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..c88f6712f796
--- /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
+  ];
+
+  checkInputs = [
+    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..e82c5ce78379
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/branca/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+, jinja2
+, selenium
+, six
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "branca";
+  version = "0.5.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-5vL366fdNozu+PY4Irhn9eEdTTq90Jmnh9ue0rcGWuE=";
+  };
+
+  checkInputs = [ pytest selenium ];
+  propagatedBuildInputs = [ jinja2 six setuptools ];
+
+  # Seems to require a browser
+  doCheck = false;
+
+  meta = {
+    description = "Generate complex HTML+JS pages with Python";
+    homepage = "https://github.com/python-visualization/branca";
+    license = with lib.licenses; [ mit ];
+  };
+}
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..eb0e03653e59
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bravado-core/default.nix
@@ -0,0 +1,113 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, fqdn
+, idna
+, isoduration
+, jsonpointer
+, jsonref
+, jsonschema
+, mock
+, msgpack
+, mypy-extensions
+, pytest-benchmark
+, pytestCheckHook
+, python-dateutil
+, pythonOlder
+, pytz
+, pyyaml
+, rfc3987
+, rfc3339-validator
+, simplejson
+, six
+, strict-rfc3339
+, swagger-spec-validator
+, uri-template
+, webcolors
+}:
+
+buildPythonPackage rec {
+  pname = "bravado-core";
+  version = "5.17.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Yelp";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-okQA4YJq0lyVJuDzD8mMRlOS/K3gf1qRUpw/5M0LlZE=";
+  };
+
+  propagatedBuildInputs = [
+    jsonref
+    jsonschema
+    msgpack
+    python-dateutil
+    pytz
+    pyyaml
+    simplejson
+    six
+    swagger-spec-validator
+
+    # the following packages are included when jsonschema (3.2) is installed
+    # as jsonschema[format], which reflects what happens in setup.py
+    fqdn
+    idna
+    isoduration
+    jsonpointer
+    rfc3987
+    rfc3339-validator
+    strict-rfc3339
+    uri-template
+    webcolors
+  ];
+
+  checkInputs = [
+    mypy-extensions
+    pytestCheckHook
+    mock
+    pytest-benchmark
+  ];
+
+  pythonImportsCheck = [
+    "bravado_core"
+  ];
+
+  pytestFlagsArray = [
+    "--benchmark-skip"
+  ];
+
+  disabledTestPaths = [
+    # Tests are out-dated (not supporting later modules releases, e.g., jsonschema)
+    "tests/_decorators_test.py"
+    "tests/formatter"
+    "tests/marshal"
+    "tests/model"
+    "tests/operation"
+    "tests/param"
+    "tests/request"
+    "tests/resource"
+    "tests/response"
+    "tests/schema"
+    "tests/security_test.py"
+    "tests/spec"
+    "tests/swagger20_validator"
+    "tests/unmarshal"
+    "tests/validate"
+  ];
+
+  disabledTests = [
+    "test_petstore_spec"
+  ];
+
+  meta = with lib; {
+    broken = (stdenv.isLinux && stdenv.isAarch64) || stdenv.isDarwin;
+    description = "Library for adding Swagger support to clients and servers";
+    homepage = "https://github.com/Yelp/bravado-core";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ vanschelven ];
+  };
+}
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..849f7e0b0a73
--- /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}";
+    sha256 = "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..a53af25bd888
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/breathe/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, docutils
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, sphinx
+}:
+
+buildPythonPackage rec {
+  pname = "breathe";
+  version = "4.34.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "michaeljones";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-OOc3XQjqQa0cVpA+/HHco+koL+0whUm5qC7x3xiEdwQ=";
+  };
+
+  propagatedBuildInputs = [
+    docutils
+    sphinx
+  ];
+
+  checkInputs = [
+    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/default.nix b/nixpkgs/pkgs/development/python-modules/breezy/default.nix
new file mode 100644
index 000000000000..64774a70867a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/breezy/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, configobj
+, patiencediff
+, fastbencode
+, fastimport
+, dulwich
+, launchpadlib
+, testtools
+, pythonOlder
+, installShellFiles
+}:
+
+buildPythonPackage rec {
+  pname = "breezy";
+  version = "3.2.2";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-GHpuRSCN0F2BdQc2cgyDcQz0gJT1R+xAgcVxJZVZpNU=";
+  };
+
+  nativeBuildInputs = [ installShellFiles ];
+
+  propagatedBuildInputs = [
+    configobj
+    fastbencode
+    patiencediff
+    fastimport
+    dulwich
+    launchpadlib
+  ];
+
+  checkInputs = [ testtools ];
+
+  # There is a conflict with their `lazy_import` and plugin tests
+  doCheck = false;
+
+  # symlink for bazaar compatibility
+  postInstall = ''
+    ln -s "$out/bin/brz" "$out/bin/bzr"
+
+    installShellCompletion --cmd brz --bash contrib/bash/brz
+  '';
+
+  pythonImportsCheck = [ "breezy" ];
+
+  meta = with lib; {
+    description = "Friendly distributed version control system";
+    homepage = "https://www.breezy-vcs.org/";
+    license = licenses.gpl2Only;
+    maintainers = [ maintainers.marsam ];
+  };
+}
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..66d611f5e931
--- /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;
+    sha256 = "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/broadlink/default.nix b/nixpkgs/pkgs/development/python-modules/broadlink/default.nix
new file mode 100644
index 000000000000..e03fa1c2aef6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/broadlink/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, cryptography
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "broadlink";
+  version = "0.18.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-2ktLSJ1Nsdry8dvWmY/BbhHApTYQMvSjCsNKX3PkocU=";
+  };
+
+  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";
+    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..891791dfecb7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/brother-ql/default.nix
@@ -0,0 +1,37 @@
+{ 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;
+    sha256 = "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 ];
+  };
+}
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..7dbab50b63bf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/brother/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pysnmplib
+, pytest-asyncio
+, pytest-error-for-skips
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "brother";
+  version = "1.2.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "bieniu";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-+o6hv63u6FBEu57mD02lss0LQPwgBnXsP8CKQ+/74/Q=";
+  };
+
+  propagatedBuildInputs = [
+    pysnmplib
+  ];
+
+  checkInputs = [
+    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";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
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..ad247be16185
--- /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.0.9";
+
+  src = fetchFromGitHub {
+    owner = "google";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-tFnXSXv8t3l3HX6GwWLhEtgpqz0c7Yom5U3k47pWM7o=";
+    # .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;
+
+  checkInputs = [
+    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; [ SuperSandro2000 ];
+  };
+}
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..5e0600d343a8
--- /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.0.9.2";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "python-hyper";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0qx7an7772brmx1rbbrqzqnkqqvicc70mx740nl31kzzyv4jjs00";
+  };
+
+  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..2cc918b288ce
--- /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 ];
+
+  checkInputs = [ 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..8daf79f208d6
--- /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 ];
+
+  checkInputs = [
+    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..cfb9364c30d8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/browser-cookie3/default.nix
@@ -0,0 +1,47 @@
+{ stdenv
+, lib
+, fetchPypi
+, buildPythonPackage
+, pythonOlder
+, lz4
+, keyring
+, pbkdf2
+, pycryptodome
+, pyaes
+}:
+
+buildPythonPackage rec {
+  pname = "browser-cookie3";
+  version = "0.16.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Gamys354RIvUQOelN8YDY6GfpJanC7CjWXC1plmh/jU=";
+  };
+
+  propagatedBuildInputs = [
+    lz4
+    keyring
+    pbkdf2
+    pyaes
+    pycryptodome
+  ];
+
+  # No tests implemented
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "browser_cookie3"
+  ];
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    description = "Loads cookies from your browser into a cookiejar object";
+    homepage = "https://github.com/borisbabic/browser_cookie3";
+    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..1c11e92b2346
--- /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
+  ];
+
+  checkInputs = [
+    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/bsblan/default.nix b/nixpkgs/pkgs/development/python-modules/bsblan/default.nix
new file mode 100644
index 000000000000..e371079b3605
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bsblan/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, aiohttp
+, aresponses
+, buildPythonPackage
+, fetchFromGitHub
+, mypy
+, packaging
+, poetry-core
+, pydantic
+, pytest-asyncio
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+, yarl
+}:
+
+buildPythonPackage rec {
+  pname = "bsblan";
+  version = "0.5.5";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "liudger";
+    repo = "python-bsblan";
+    rev = "v${version}";
+    hash = "sha256-kq4cML7D9XC/QRPjGfaWcs0H78OOc2IXGua7qJpWYOQ=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    packaging
+    pydantic
+    yarl
+  ];
+
+  checkInputs = [
+    aresponses
+    mypy
+    pytest-asyncio
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    # Upstream doesn't set a version for the pyproject.toml
+    substituteInPlace pyproject.toml \
+      --replace 'version = "0.0.0"' 'version = "${version}"' \
+      --replace "--cov" ""
+  '';
+
+  pythonImportsCheck = [
+    "bsblan"
+  ];
+
+  meta = with lib; {
+    description = "Python client for BSB-Lan";
+    homepage = "https://github.com/liudger/python-bsblan";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..82459398ca73
--- /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 = [ maintainers.costrouc ];
+  };
+
+}
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..5ee2ff0522af
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bsdiff4/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "bsdiff4";
+  version = "1.2.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-GICsP1KmxGrmvMbbEX5Ps1+bDM1a91/U/uaQfQDWmDw=";
+  };
+
+  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";
+    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..955cd4951d7a
--- /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
+, scikitimage
+, 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;
+    sha256 = "sha256-ak9McvXl7Nz5toUaPaRaJek9lurxiQiIW209GnZEjX0=";
+  };
+
+  buildInputs = [
+    absl-py
+    dm-env
+    dm-tree
+    frozendict
+    gym
+    matplotlib
+    mizani
+    pandas
+    patsy
+    plotnine
+    scikitimage
+    scipy
+    statsmodels
+    termcolor
+  ];
+
+  checkInputs = [
+    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/default.nix b/nixpkgs/pkgs/development/python-modules/btchip/default.nix
new file mode 100644
index 000000000000..e34b58907ea8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/btchip/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildPythonPackage, fetchPypi, hidapi, pyscard, ecdsa }:
+
+buildPythonPackage rec {
+  pname = "btchip-python";
+  version = "0.1.32";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "34f5e0c161c08f65dc0d070ba2ff4c315ed21c4b7e0faa32a46862d0dc1b8f55";
+  };
+
+  propagatedBuildInputs = [ hidapi pyscard ecdsa ];
+
+  # 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/btrees/default.nix b/nixpkgs/pkgs/development/python-modules/btrees/default.nix
new file mode 100644
index 000000000000..d900beca38a4
--- /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 = "4.10.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "BTrees";
+    inherit version;
+    hash = "sha256-1qsONBDQdNcVQkXW3GSTrobxtQvWCA0TEOuz7N6l3rY=";
+  };
+
+  propagatedBuildInputs = [
+    persistent
+    zope_interface
+  ];
+
+  checkInputs = [
+    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..9bcb8f37330b
--- /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;
+    sha256 = "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/bugsnag/default.nix b/nixpkgs/pkgs/development/python-modules/bugsnag/default.nix
new file mode 100644
index 000000000000..fa2880fb0553
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bugsnag/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, webob
+}:
+
+buildPythonPackage rec {
+  pname = "bugsnag";
+  version = "4.2.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-PT6XaKz3QFAEhCmS7jXKK7xxscNlpbhGpCKQIRuSt6U=";
+  };
+
+  propagatedBuildInputs = [
+    webob
+  ];
+
+  pythonImportsCheck = [
+    "bugsnag"
+  ];
+
+  # no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Automatic error monitoring for Python applications";
+    homepage = "https://github.com/bugsnag/bugsnag-python";
+    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..9beb8e9239ff
--- /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 yurrriq ];
+  };
+}
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..a57e957efe67
--- /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 = [ maintainers.costrouc ];
+  };
+
+}
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..03a1610ac7e4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bugzilla/default.nix
@@ -0,0 +1,29 @@
+{ lib, buildPythonPackage, fetchPypi
+, pep8, coverage, logilab_common, requests }:
+
+buildPythonPackage rec {
+  pname = "bugzilla";
+  version = "2.3.0";
+
+  src = fetchPypi {
+    pname = "python-${pname}";
+    inherit version;
+    sha256 = "0q8c3k0kdnd11g2s56cp8va9365x0xfr2m2zn9fgxjijdyhwdic5";
+  };
+
+  buildInputs = [ pep8 coverage logilab_common ];
+  propagatedBuildInputs = [ requests ];
+
+  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.gpl2;
+    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..ba288f59b28a
--- /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
+  ];
+
+  checkInputs = [
+    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..e4a7d69f34f6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/build/default.nix
@@ -0,0 +1,87 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, filelock
+, flit-core
+, importlib-metadata
+, packaging
+, pep517
+, pytest-mock
+, pytest-rerunfailures
+, pytest-xdist
+, pytestCheckHook
+, pythonOlder
+, toml
+, tomli
+}:
+
+buildPythonPackage rec {
+  pname = "build";
+  version = "0.8.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "pypa";
+    repo = pname;
+    rev = version;
+    hash = "sha256-P0DFBYsL2Ce/JwfYss64+CY/IvzYZEiz9wuEslij+oU=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    packaging
+    pep517
+    tomli
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  checkInputs = [
+    filelock
+    toml
+    pytest-mock
+    pytest-rerunfailures
+    pytest-xdist
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "-W"
+    "ignore::DeprecationWarning"
+  ];
+
+  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; {
+    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";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/buildbot/default.nix b/nixpkgs/pkgs/development/python-modules/buildbot/default.nix
new file mode 100644
index 000000000000..4e9ccaf23701
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/buildbot/default.nix
@@ -0,0 +1,119 @@
+{ stdenv, lib, buildPythonPackage, fetchpatch, fetchPypi, makeWrapper, isPy3k
+, python, twisted, jinja2, msgpack, zope_interface, sqlalchemy, alembic
+, python-dateutil, txaio, autobahn, pyjwt, pyyaml, treq, txrequests, pypugjs
+, boto3, moto, mock, lz4, setuptoolsTrial
+, buildbot-worker, buildbot-pkg, buildbot-plugins, parameterized, git, openssh
+, glibcLocales
+, nixosTests
+}:
+
+let
+  withPlugins = plugins: buildPythonPackage {
+    pname = "${package.pname}-with-plugins";
+    inherit (package) version;
+
+    dontUnpack = true;
+    dontBuild = true;
+    doCheck = false;
+
+    nativeBuildInputs = [ makeWrapper ];
+    propagatedBuildInputs = plugins ++ package.propagatedBuildInputs;
+
+    installPhase = ''
+      makeWrapper ${package}/bin/buildbot $out/bin/buildbot \
+        --prefix PYTHONPATH : "${package}/${python.sitePackages}:$PYTHONPATH"
+      ln -sfv ${package}/lib $out/lib
+    '';
+
+    passthru = package.passthru // {
+      withPlugins = morePlugins: withPlugins (morePlugins ++ plugins);
+    };
+  };
+
+  package = buildPythonPackage rec {
+    pname = "buildbot";
+    version = "3.5.0";
+
+    src = fetchPypi {
+      inherit pname version;
+      sha256 = "sha256-woGHdCan5qTp00toNkWa821EgVQMrPK+OWXoqFcgIDQ=";
+    };
+
+    propagatedBuildInputs = [
+      # core
+      twisted
+      jinja2
+      msgpack
+      zope_interface
+      sqlalchemy
+      alembic
+      python-dateutil
+      txaio
+      autobahn
+      pyjwt
+      pyyaml
+    ]
+      # tls
+      ++ twisted.optional-dependencies.tls;
+
+    checkInputs = [
+      treq
+      txrequests
+      pypugjs
+      boto3
+      moto
+      mock
+      lz4
+      setuptoolsTrial
+      buildbot-worker
+      buildbot-pkg
+      buildbot-plugins.www
+      parameterized
+      git
+      openssh
+      glibcLocales
+    ];
+
+    patches = [
+      # This patch disables the test that tries to read /etc/os-release which
+      # is not accessible in sandboxed builds.
+      ./skip_test_linux_distro.patch
+      (fetchpatch{
+        url = "https://github.com/buildbot/buildbot/commit/54b8f62902122b0091319a96d0f9edd4195ab4c6.patch";
+        stripLen = 1;
+        sha256 = "sha256-OqW3ZQK0bfqPG3YlrBbrSEEKsM/XqY2NO862ZD/DgHs=";
+      })
+    ];
+
+    postPatch = ''
+      substituteInPlace buildbot/scripts/logwatcher.py --replace '/usr/bin/tail' "$(type -P tail)"
+    '';
+
+    # TimeoutErrors on slow machines -> aarch64
+    doCheck = !stdenv.isAarch64;
+
+    preCheck = ''
+      export LC_ALL="en_US.UTF-8"
+      export PATH="$out/bin:$PATH"
+
+      # remove testfile which is missing configuration file from sdist
+      rm buildbot/test/integration/test_graphql.py
+    '';
+
+    disabled = !isPy3k;
+
+    passthru = {
+      inherit withPlugins;
+      tests.buildbot = nixosTests.buildbot;
+      updateScript = ./update.sh;
+    };
+
+    meta = with lib; {
+      broken = stdenv.isDarwin;
+      homepage = "https://buildbot.net/";
+      description = "An open-source continuous integration framework for automating software build, test, and release processes";
+      maintainers = with maintainers; [ ryansydnor lopsided98 ];
+      license = licenses.gpl2;
+    };
+  };
+in package
diff --git a/nixpkgs/pkgs/development/python-modules/buildbot/pkg.nix b/nixpkgs/pkgs/development/python-modules/buildbot/pkg.nix
new file mode 100644
index 000000000000..a2cffd739d1a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/buildbot/pkg.nix
@@ -0,0 +1,31 @@
+{ lib, buildPythonPackage, fetchPypi, isPy3k, buildbot }:
+
+buildPythonPackage rec {
+  pname = "buildbot-pkg";
+  inherit (buildbot) version;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-CYbMixfZZ1xypV0J7TW54n/fja9RGMlWiF7StJYFnqM=";
+  };
+
+  postPatch = ''
+    # Their listdir function filters out `node_modules` folders.
+    # Do we have to care about that with Nix...?
+    substituteInPlace buildbot_pkg.py --replace "os.listdir = listdir" ""
+  '';
+
+  # No tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "buildbot_pkg" ];
+
+  disabled = !isPy3k;
+
+  meta = with lib; {
+    homepage = "https://buildbot.net/";
+    description = "Buildbot Packaging Helper";
+    maintainers = with maintainers; [ ryansydnor lopsided98 ];
+    license = licenses.gpl2;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/buildbot/plugins.nix b/nixpkgs/pkgs/development/python-modules/buildbot/plugins.nix
new file mode 100644
index 000000000000..62aa51e053dc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/buildbot/plugins.nix
@@ -0,0 +1,118 @@
+{ lib, buildPythonPackage, fetchPypi, buildbot-pkg, mock }:
+
+{
+  www = buildPythonPackage rec {
+    pname = "buildbot-www";
+    inherit (buildbot-pkg) version;
+
+    src = fetchPypi {
+      inherit pname version;
+      sha256 = "sha256-boa/MWi/HAhNU3/n96i0fuoQ+jT5I+dWoe1Zd7f/Yvs=";
+    };
+
+    # Remove unneccessary circular dependency on buildbot
+    postPatch = ''
+      sed -i "s/'buildbot'//" setup.py
+    '';
+
+    buildInputs = [ buildbot-pkg mock ];
+
+    # No tests
+    doCheck = false;
+
+    meta = with lib; {
+      homepage = "https://buildbot.net/";
+      description = "Buildbot UI";
+      maintainers = with maintainers; [ ryansydnor lopsided98 ];
+      license = licenses.gpl2;
+    };
+  };
+
+  console-view = buildPythonPackage rec {
+    pname = "buildbot-console-view";
+    inherit (buildbot-pkg) version;
+
+    src = fetchPypi {
+      inherit pname version;
+      sha256 = "sha256-NUDTwgkQuasOlJxNTlvfIm99LNVCrRIdBmgeJnwkSU8=";
+    };
+
+    buildInputs = [ buildbot-pkg ];
+
+    # No tests
+    doCheck = false;
+
+    meta = with lib; {
+      homepage = "https://buildbot.net/";
+      description = "Buildbot Console View Plugin";
+      maintainers = with maintainers; [ ryansydnor lopsided98 ];
+      license = licenses.gpl2;
+    };
+  };
+
+  waterfall-view = buildPythonPackage rec {
+    pname = "buildbot-waterfall-view";
+    inherit (buildbot-pkg) version;
+
+    src = fetchPypi {
+      inherit pname version;
+      sha256 = "sha256-EmiIDCG4iFIwFnwii8fjII7C7wsBifzeZeW7HyY04dE=";
+    };
+
+    buildInputs = [ buildbot-pkg ];
+
+    # No tests
+    doCheck = false;
+
+    meta = with lib; {
+      homepage = "https://buildbot.net/";
+      description = "Buildbot Waterfall View Plugin";
+      maintainers = with maintainers; [ ryansydnor lopsided98 ];
+      license = licenses.gpl2;
+    };
+  };
+
+  grid-view = buildPythonPackage rec {
+    pname = "buildbot-grid-view";
+    inherit (buildbot-pkg) version;
+
+    src = fetchPypi {
+      inherit pname version;
+      sha256 = "sha256-QcS8QJ17uzDvkynTczj05LojuIT6feGiQNCwCESbVLw=";
+    };
+
+    buildInputs = [ buildbot-pkg ];
+
+    # No tests
+    doCheck = false;
+
+    meta = with lib; {
+      homepage = "https://buildbot.net/";
+      description = "Buildbot Grid View Plugin";
+      maintainers = with maintainers; [ lopsided98 ];
+      license = licenses.gpl2;
+    };
+  };
+
+  wsgi-dashboards = buildPythonPackage rec {
+    pname = "buildbot-wsgi-dashboards";
+    inherit (buildbot-pkg) version;
+
+    src = fetchPypi {
+      inherit pname version;
+      sha256 = "sha256-U9ecRxpDowzjD4GsrW4FUHcbNaWeAFGKDlqMrbIoTrQ=";
+    };
+
+    buildInputs = [ buildbot-pkg ];
+
+    # No tests
+    doCheck = false;
+
+    meta = with lib; {
+      homepage = "https://buildbot.net/";
+      description = "Buildbot WSGI dashboards Plugin";
+      maintainers = with maintainers; [ lopsided98 ];
+      license = licenses.gpl2;
+    };
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/buildbot/skip_test_linux_distro.patch b/nixpkgs/pkgs/development/python-modules/buildbot/skip_test_linux_distro.patch
new file mode 100644
index 000000000000..8fe5c7b56b4f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/buildbot/skip_test_linux_distro.patch
@@ -0,0 +1,11 @@
+diff -Nur buildbot-0.9.6/buildbot/test/unit/test_buildbot_net_usage_data.py buildbot-0.9.6.patched/buildbot/test/unit/test_buildbot_net_usage_data.py
+--- buildbot-0.9.6/buildbot/test/unit/test_buildbot_net_usage_data.py	2017-04-19 16:57:02.000000000 +0200
++++ buildbot-0.9.6.patched/buildbot/test/unit/test_buildbot_net_usage_data.py	2017-05-04 12:22:54.575762551 +0200
+@@ -147,6 +147,7 @@
+         _sendBuildbotNetUsageData({'foo': 'bar'})
+ 
+     def test_linux_distro(self):
++        raise SkipTest("NixOS sandboxed builds hides /etc/os-release")
+         system = platform.system()
+         if system != "Linux":
+             raise SkipTest("test is only for linux")
diff --git a/nixpkgs/pkgs/development/python-modules/buildbot/update.sh b/nixpkgs/pkgs/development/python-modules/buildbot/update.sh
new file mode 100755
index 000000000000..3406f05db3e8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/buildbot/update.sh
@@ -0,0 +1,12 @@
+#!/usr/bin/env nix-shell
+#!nix-shell -i bash -p nix-update
+set -eu -o pipefail
+
+nix-update python3Packages.buildbot
+nix-update --version=skip python3Packages.buildbot-worker
+nix-update --version=skip python3Packages.buildbot-pkg
+nix-update --version=skip python3Packages.buildbot-plugins.www
+nix-update --version=skip python3Packages.buildbot-plugins.console-view
+nix-update --version=skip python3Packages.buildbot-plugins.waterfall-view
+nix-update --version=skip python3Packages.buildbot-plugins.grid-view
+nix-update --version=skip python3Packages.buildbot-plugins.wsgi-dashboards
diff --git a/nixpkgs/pkgs/development/python-modules/buildbot/worker.nix b/nixpkgs/pkgs/development/python-modules/buildbot/worker.nix
new file mode 100644
index 000000000000..8c5319868ce5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/buildbot/worker.nix
@@ -0,0 +1,66 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, buildbot
+
+# patch
+, coreutils
+
+# propagates
+, autobahn
+, future
+, msgpack
+, twisted
+
+# tests
+, mock
+, parameterized
+, psutil
+, setuptoolsTrial
+
+# passthru
+, nixosTests
+}:
+
+buildPythonPackage (rec {
+  pname = "buildbot-worker";
+  inherit (buildbot) version;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-HZH3TdH5dhr3f6ev25O3SgPPNbiFGMmAp9DHwcb/2MA=";
+  };
+
+  postPatch = ''
+    substituteInPlace buildbot_worker/scripts/logwatcher.py \
+      --replace /usr/bin/tail "${coreutils}/bin/tail"
+  '';
+
+  nativeBuildInputs = [
+    setuptoolsTrial
+  ];
+
+  propagatedBuildInputs = [
+    autobahn
+    future
+    msgpack
+    twisted
+  ];
+
+  checkInputs = [
+    mock
+    parameterized
+    psutil
+  ];
+
+  passthru.tests = {
+    smoke-test = nixosTests.buildbot;
+  };
+
+  meta = with lib; {
+    homepage = "https://buildbot.net/";
+    description = "Buildbot Worker Daemon";
+    maintainers = with maintainers; [ ryansydnor lopsided98 ];
+    license = licenses.gpl2;
+  };
+})
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..9fc0330ad0ba
--- /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";
+  };
+
+  checkInputs = [
+    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..efb0a0587114
--- /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.0b2";
+
+  src = fetchFromGitHub {
+    owner = "buildout";
+    repo = "buildout";
+    rev = version;
+    sha256 = "01sj09xx5kmkzynhq1xd8ahn6xqybfi8lrqjqr5lr45aaxjk2pid";
+  };
+
+  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; [ ];
+  };
+}
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..d1926c9631aa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bumps/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "bumps";
+  version = "0.9.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-BY9kg0ksKfrpQgsl1aDDJJ+zKJmURqwTtKxlITxse+o=";
+  };
+
+  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/";
+    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..2758ff5b4185
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bunch/default.nix
@@ -0,0 +1,17 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "bunch";
+  version = "1.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1akalx2pd1fjlvrq69plvcx783ppslvikqdm93z2sdybq07pmish";
+  };
+
+  doCheck = false;
+
+  meta = with lib; {
+    maintainers = with maintainers; [ ];
+  };
+}
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-python/default.nix b/nixpkgs/pkgs/development/python-modules/bx-python/default.nix
new file mode 100644
index 000000000000..ba83cca9e4ec
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bx-python/default.nix
@@ -0,0 +1,39 @@
+{ lib, fetchFromGitHub, buildPythonPackage, pythonOlder, numpy, cython, zlib, six
+, python-lzo, nose }:
+
+buildPythonPackage rec {
+  pname = "bx-python";
+  version = "0.8.13";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "bxlab";
+    repo = "bx-python";
+    rev = "v${version}";
+    sha256 = "0r3z02mvaswijalr42ikpa7crvliijy0aigsvp5m0frp05n4irf5";
+  };
+
+  nativeBuildInputs = [ cython ];
+  buildInputs = [ zlib ];
+  propagatedBuildInputs = [ numpy six python-lzo ];
+  checkInputs = [ nose ];
+
+  postInstall = ''
+    cp -r scripts/* $out/bin
+
+    # This is a small hack; the test suit 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; {
+    homepage = "https://github.com/bxlab/bx-python";
+    description =
+      "Tools for manipulating biological data, particularly multiple sequence alignments";
+    license = licenses.mit;
+    maintainers = [ 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..648ec29520bf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bytecode/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "bytecode";
+  version = "0.13.0";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "vstinner";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-aY19qMYW7KziiXVY3lxdnHk7OCAJaNh+aTvlQyJWmDw=";
+  };
+
+  checkInputs = [
+    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/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..529975f1080b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cachecontrol/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, cherrypy
+, fetchFromGitHub
+, lockfile
+, mock
+, msgpack
+, pytestCheckHook
+, pythonOlder
+, redis
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "cachecontrol";
+  version = "0.12.11";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "ionrock";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-uUPIQz/n347Q9G7NDOGuB760B/KxOglUxiS/rYjt5Po=";
+  };
+
+  propagatedBuildInputs = [
+    msgpack
+    requests
+  ];
+
+  checkInputs = [
+    cherrypy
+    mock
+    pytestCheckHook
+  ] ++ passthru.optional-dependencies.filecache;
+
+  pythonImportsCheck = [
+    "cachecontrol"
+  ];
+
+  passthru.optional-dependencies = {
+    filecache = [ lockfile ];
+    redis = [ redis ];
+  };
+
+  meta = with lib; {
+    description = "Httplib2 caching for requests";
+    homepage = "https://github.com/ionrock/cachecontrol";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ costrouc ];
+  };
+}
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..72bf870c37b5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cached-property/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, freezegun
+}:
+
+buildPythonPackage rec {
+  pname = "cached-property";
+  version = "1.5.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9fa5755838eecbb2d234c3aa390bd80fbd3ac6b6869109bfc1b499f7bd89a130";
+  };
+
+  checkInputs = [ pytestCheckHook freezegun ];
+
+  disabledTests = [
+    # https://github.com/pydanny/cached-property/issues/131
+    "test_threads_ttl_expiry"
+  ];
+
+  meta = {
+    description = "A decorator for caching properties in classes";
+    homepage = "https://github.com/pydanny/cached-property";
+    license = lib.licenses.bsd3;
+    platforms = lib.platforms.unix;
+    maintainers = with lib.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..9a873d24f563
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cachelib/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-xprocess
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "cachelib";
+  version = "0.9.0";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "pallets";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-LO1VdirKWXIAy3U8oRtnFI58qO+yn6Vm5bZdCjdgKwo=";
+  };
+
+  checkInputs = [
+    pytest-xprocess
+    pytestCheckHook
+  ];
+
+  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..9de26ad53395
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cachetools/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "cachetools";
+  version = "5.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "tkem";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-DheHTD62f1ZxoiS0y0/CzDMHvKGmEiEUAX6oaqTpB78=";
+  };
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "cachetools"
+  ];
+
+  meta = with lib; {
+    description = "Extensible memoizing collections and decorators";
+    homepage = "https://github.com/tkem/cachetools";
+    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..aff819adcad8
--- /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;
+    sha256 = "sha256-5USmuufrrWtmgibpfkjo9NtgN30hdl8plJfythmxM4s=";
+  };
+  propagatedBuildInputs = [ typing-extensions heapdict ];
+  checkInputs = [ 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/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..f7e436a41605
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cadquery/default.nix
@@ -0,0 +1,103 @@
+{ lib
+, buildPythonPackage
+, toPythonModule
+, pythonOlder
+, pythonAtLeast
+, fetchFromGitHub
+, pyparsing
+, opencascade
+, stdenv
+, python
+, cmake
+, swig
+, smesh
+, 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
+      smesh
+      freetype
+      libGL
+      libGLU
+      libX11
+    ] ++ lib.optionals stdenv.isDarwin [ Cocoa ];
+
+    propagatedBuildInputs = [
+      six
+    ];
+
+    cmakeFlags = [
+      "-Wno-dev"
+      "-DPYTHONOCC_INSTALL_DIRECTORY=${placeholder "out"}/${python.sitePackages}/OCC"
+      "-DSMESH_INCLUDE_PATH=${smesh}/include/smesh"
+      "-DSMESH_LIB_PATH=${smesh}/lib"
+      "-DPYTHONOCC_WRAP_SMESH=TRUE"
+    ];
+  });
+
+in
+  buildPythonPackage rec {
+    pname = "cadquery";
+    version = "2.0";
+
+    src = fetchFromGitHub {
+      owner = "CadQuery";
+      repo = pname;
+      rev = version;
+      sha256 = "1n63b6cjjrdwdfmwq0zx1xabjnhndk9mgfkm4w7z9ardcfpvg84l";
+    };
+
+    buildInputs = [
+      opencascade
+    ];
+
+    propagatedBuildInputs = [
+      pyparsing
+      pythonocc-core-cadquery
+    ];
+
+    FONTCONFIG_FILE = makeFontsConf {
+      fontDirectories = [ freefont_ttf ];
+    };
+
+    checkInputs = [
+      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; [ costrouc marcus7070 ];
+    };
+  }
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..cc4e19d6beb7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cairocffi/default.nix
@@ -0,0 +1,78 @@
+# FIXME: make gdk-pixbuf dependency optional
+{ stdenv
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, lib
+, substituteAll
+, makeFontsConf
+, freefont_ttf
+, pytest
+, glibcLocales
+, cairo
+, cffi
+, numpy
+, withXcffib ? false
+, xcffib
+, python
+, glib
+, gdk-pixbuf
+}:
+
+buildPythonPackage rec {
+  pname = "cairocffi";
+  version = "1.3.0";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-EIo6fLCeIDvdhQHZuq2R14bSBFYb1x6TZOizSJfEe5E=";
+  };
+
+  LC_ALL = "en_US.UTF-8";
+
+  # checkPhase require at least one 'normal' font and one 'monospace',
+  # otherwise glyph tests fails
+  FONTCONFIG_FILE = makeFontsConf {
+    fontDirectories = [ freefont_ttf ];
+  };
+
+  propagatedBuildInputs = [ cairo cffi ] ++ lib.optional withXcffib xcffib;
+  propagatedNativeBuildInputs = [ cffi ];
+
+  # pytestCheckHook does not work
+  checkInputs = [ numpy pytest glibcLocales ];
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "pytest-runner" "" \
+      --replace "pytest-cov" "" \
+      --replace "pytest-flake8" "" \
+      --replace "pytest-isort" "" \
+      --replace "--flake8 --isort" ""
+  '';
+
+  checkPhase = ''
+    py.test $out/${python.sitePackages}
+  '';
+
+  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
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/SimonSapin/cairocffi";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+    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..df6600e3faac
--- /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.5.2";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-sLmSnPXboAUXjXRqgDb88AJVUPSYylTbYYczIjhHg7w=";
+  };
+
+  propagatedBuildInputs = [ cairocffi cssselect2 defusedxml pillow tinycss2 ];
+
+  propagatedNativeBuildInputs = [ cairocffi ];
+
+  checkInputs = [ 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; [ SuperSandro2000 ];
+  };
+}
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..315260fb94c3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/caldav/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, icalendar
+, lxml
+, nose
+, pytz
+, requests
+, six
+, tzlocal
+, vobject
+}:
+
+buildPythonPackage rec {
+  pname = "caldav";
+  version = "0.9.1";
+
+  src = fetchFromGitHub {
+    owner = "python-caldav";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-Gil0v4pGyp5+TnYPjb8Vk0xTqnQKaeD8Ko/ZWhvkbUk=";
+  };
+
+  propagatedBuildInputs = [
+    vobject
+    lxml
+    requests
+    six
+  ];
+
+  checkInputs = [
+    icalendar
+    nose
+    tzlocal
+    pytz
+  ];
+
+  checkPhase = ''
+    nosetests tests
+  '';
+
+  # xandikos and radicale is only a optional test dependency, not available for python3
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace ", 'xandikos<0.2.4'" "" \
+      --replace ", 'radicale'" ""
+  '';
+
+  pythonImportsCheck = [ "caldav" ];
+
+  meta = with lib; {
+    description = "This project is a CalDAV (RFC4791) client library for Python.";
+    homepage = "https://github.com/python-caldav/caldav";
+    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..1cf63455c24b
--- /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
+
+  checkInputs = [
+    # 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..8420cbd03afd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/calmjs-parse/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, ply
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "calmjs-parse";
+  version = "1.3.0";
+
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "calmjs";
+    repo = "calmjs.parse";
+    rev = version;
+    hash = "sha256-QhHNp9g88RhGHqRRjg4nk7aXjAgGCOauOagWJoJ3fqc=";
+  };
+
+  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; {
+    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/can/default.nix b/nixpkgs/pkgs/development/python-modules/can/default.nix
new file mode 100644
index 000000000000..f0b221e5adff
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/can/default.nix
@@ -0,0 +1,80 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, future
+, hypothesis
+, packaging
+, parameterized
+, msgpack
+, pyserial
+, pytest-timeout
+, pytestCheckHook
+, pythonOlder
+, typing-extensions
+, wrapt
+}:
+
+buildPythonPackage rec {
+  pname = "python-can";
+  version = "4.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "hardbyte";
+    repo = pname;
+    rev = version;
+    hash = "sha256-/z7zBfVbO7x4UtzWOXolH2YrtYWgsvRLObWwz8sqOEc=";
+  };
+
+  propagatedBuildInputs = [
+    msgpack
+    packaging
+    pyserial
+    typing-extensions
+    wrapt
+  ];
+
+  checkInputs = [
+    future
+    hypothesis
+    parameterized
+    pytest-timeout
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace tox.ini \
+      --replace " --cov=can --cov-config=tox.ini --cov-report=xml --cov-report=term" ""
+  '';
+
+  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"
+  ];
+
+  preCheck = ''
+    export PATH="$PATH:$out/bin";
+  '';
+
+  pythonImportsCheck = [
+    "can"
+  ];
+
+  meta = with lib; {
+    description = "CAN support for Python";
+    homepage = "https://python-can.readthedocs.io";
+    license = licenses.lgpl3Only;
+    maintainers = with maintainers; [ fab sorki ];
+  };
+}
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..d131e4001c94
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/canmatrix/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, attrs
+, bitstruct
+, click
+, future
+, pathlib2
+, typing ? null
+, lxml
+, xlwt
+, xlrd
+, XlsxWriter
+, pyyaml
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "canmatrix";
+  version = "0.9.5";
+
+  # uses fetchFromGitHub as PyPi release misses test/ dir
+  src = fetchFromGitHub {
+    owner = "ebroecker";
+    repo = pname;
+    rev = version;
+    sha256 = "0x8x8kbg4gyzi0ia9657xygp0mqfii76b67fsx76d31bqsdvlda5";
+  };
+
+  propagatedBuildInputs = [
+    # required
+    attrs
+    bitstruct
+    click
+    future
+    pathlib2
+    # optional
+    lxml
+    xlwt
+    xlrd
+    XlsxWriter
+    pyyaml
+  ] ++ lib.optional (pythonOlder "3.5") typing;
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "version = versioneer.get_version()" "version = \"${version}\""
+  '';
+
+  checkInputs = [ pytestCheckHook ];
+  # long_envvar_name_imports requires stable key value pair ordering
+  pytestFlagsArray = [ "-s src/canmatrix" ];
+  disabledTests = [ "long_envvar_name_imports" ];
+  pythonImportsCheck = [ "canmatrix" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/ebroecker/canmatrix";
+    description = "Support and convert several CAN (Controller Area Network) database formats .arxml .dbc .dbf .kcd .sym fibex xls(x)";
+    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..e5ecff7837f9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/canonicaljson/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, frozendict
+, pytestCheckHook
+, pythonOlder
+, simplejson
+}:
+
+buildPythonPackage rec {
+  pname = "canonicaljson";
+  version = "1.6.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-rwC+jOnFiYV98Xa7lFlPDUOw4CfwJ6jXz4l4/bgZAko=";
+  };
+
+  propagatedBuildInputs = [
+    frozendict
+    simplejson
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    "test_frozen_dict"
+  ];
+
+  pythonImportsCheck = [
+    "canonicaljson"
+  ];
+
+  meta = with lib; {
+    description = "Encodes objects and arrays as RFC 7159 JSON";
+    homepage = "https://github.com/matrix-org/python-canonicaljson";
+    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..ccb3626e2f48
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/canopen/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools-scm
+, can
+, canmatrix
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "canopen";
+  version = "2.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-vMiqnqg/etpdoNregQOJd75SqTgCwmV2SXKesfggZdk=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    can
+    canmatrix
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "canopen"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/christiansandberg/canopen/";
+    description = "CANopen stack implementation";
+    license = licenses.mit;
+    maintainers = with maintainers; [ sorki ];
+  };
+}
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..f1a37fb70a0f
--- /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 = "source/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/capturer/default.nix b/nixpkgs/pkgs/development/python-modules/capturer/default.nix
new file mode 100644
index 000000000000..2495040887fd
--- /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;
+  checkInputs = [ 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..a15d2a5f11b9
--- /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;
+    sha256 = "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..c4d4e8892018
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cart/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, pycryptodome
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "cart";
+  version = "1.2.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "CybercentreCanada";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-PsdDlNhX0FbuwS5ZXk9P98DjnzDGdigfnRwrdwYa4qY=";
+  };
+
+  propagatedBuildInputs = [
+    pycryptodome
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "unittests"
+  ];
+
+  pythonImportsCheck = [
+    "cart"
+  ];
+
+  meta = with lib; {
+    description = "Python module for the CaRT Neutering format";
+    homepage = "https://github.com/CybercentreCanada/cart";
+    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..7a2407950576
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cartopy/default.nix
@@ -0,0 +1,64 @@
+{ buildPythonPackage, lib, fetchPypi
+, pytestCheckHook, filelock, mock, pep8
+, cython, setuptools-scm
+, six, pyshp, shapely, geos, numpy
+, gdal, pillow, matplotlib, pyepsg, pykdtree, scipy, owslib, fiona
+, proj, flufl_lock
+}:
+
+buildPythonPackage rec {
+  pname = "cartopy";
+  version = "0.20.3";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "Cartopy";
+    sha256 = "sha256-DWD6Li+9d8TR9rH507WIlmFH8HwbF50tNFcKweG0kAY=";
+  };
+
+  postPatch = ''
+    # https://github.com/SciTools/cartopy/issues/1880
+    substituteInPlace lib/cartopy/tests/test_crs.py \
+      --replace "test_osgb(" "dont_test_osgb(" \
+      --replace "test_epsg(" "dont_test_epsg("
+  '';
+
+  nativeBuildInputs = [
+    cython
+    geos # for geos-config
+    proj
+    setuptools-scm
+  ];
+
+  buildInputs = [
+    geos proj
+  ];
+
+  propagatedBuildInputs = [
+    # required
+    six pyshp shapely numpy
+
+    # optional
+    gdal pillow matplotlib pyepsg pykdtree scipy fiona owslib
+  ];
+
+  checkInputs = [ pytestCheckHook filelock mock pep8 flufl_lock ];
+
+  pytestFlagsArray = [
+    "--pyargs" "cartopy"
+    "-m" "'not network and not natural_earth'"
+  ];
+
+  disabledTests = [
+    "test_nightshade_image"
+    "background_img"
+    "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..beb6dc351420
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/casa-formats-io/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, astropy
+, dask
+, numpy
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "casa-formats-io";
+  version = "0.1";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "16rypj65wdfxxrilxfhbk563lxv86if4vvs9zfq3f8bkzdr8xl9s";
+  };
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  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..2e027eaa990c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/casbin/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, simpleeval
+, wcmatch
+}:
+
+buildPythonPackage rec {
+  pname = "casbin";
+  version = "1.17.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = "pycasbin";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-fBMhrA4zL4XPjQ63AGc5jf585ZpHTBumPievDNfCw7o=";
+  };
+
+  propagatedBuildInputs = [
+    simpleeval
+    wcmatch
+  ];
+
+  checkInputs = [
+    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";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ costrouc ];
+  };
+}
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..1243aad64cc4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cassandra-driver/default.nix
@@ -0,0 +1,97 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, cython
+, eventlet
+, futures ? null
+, iana-etc
+, geomet
+, libev
+, mock
+, nose
+, pytestCheckHook
+, pytz
+, pyyaml
+, scales
+, six
+, sure
+, gremlinpython
+, gevent
+, twisted
+, libredirect
+}:
+
+buildPythonPackage rec {
+  pname = "cassandra-driver";
+  version = "3.25.0";
+
+  # pypi tarball doesn't include tests
+  src = fetchFromGitHub {
+    owner = "datastax";
+    repo = "python-driver";
+    rev = version;
+    sha256 = "1dn7iiavsrhh6i9hcyw0mk8j95r5ym0gbrvdca998hx2rnz5ark6";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py --replace 'geomet>=0.1,<0.3' 'geomet'
+  '';
+
+  nativeBuildInputs = [ cython ];
+  buildInputs = [ libev ];
+  propagatedBuildInputs = [ six geomet ]
+    ++ lib.optionals (pythonOlder "3.4") [ futures ];
+
+  # 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'
+  '';
+  postCheck = ''
+    unset NIX_REDIRECTS LD_PRELOAD
+  '';
+
+  checkInputs = [
+    pytestCheckHook
+    eventlet
+    mock
+    nose
+    pytz
+    pyyaml
+    sure
+    scales
+    gremlinpython
+    gevent
+    twisted
+  ];
+
+  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"
+  ];
+
+  meta = with lib; {
+    description = "A Python client driver for Apache Cassandra";
+    homepage = "http://datastax.github.io/python-driver";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ turion 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..993684bd5a38
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/castepxbin/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, numpy
+, scipy
+, pymatgen
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "castepxbin";
+  version = "0.2.0";
+
+  src = fetchFromGitHub {
+    owner = "zhubonan";
+    repo = "castepxbin";
+    rev = "v${version}";
+    sha256 = "0bqicpdyisbcz8argy4ppm59zzkcn9lcs4y1mh2f31f75x732na3";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    scipy
+    pymatgen
+  ];
+
+  checkInputs = [
+    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..43e4d0029afa
--- /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;
+    sha256 = "sha256-syXHdlkgi/tq8bDZOxoapBEuG7KaTFztgWdYpyLw44g=";
+  };
+
+  propagatedBuildInputs = lib.optionals (pythonOlder "3.8") [
+    typing-extensions
+    zipp
+  ];
+
+  checkInputs = [
+    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..6cda5a23aee9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/catboost/default.nix
@@ -0,0 +1,58 @@
+{ buildPythonPackage, fetchFromGitHub, fetchpatch, lib, pythonOlder
+, clang_7, python2
+, graphviz, matplotlib, numpy, pandas, plotly, scipy, six
+, withCuda ? false, cudatoolkit }:
+
+buildPythonPackage rec {
+  pname = "catboost";
+  version = "0.24.4";
+
+  disabled = pythonOlder "3.4";
+
+  src = fetchFromGitHub {
+    owner = "catboost";
+    repo = "catboost";
+    rev = "v${version}";
+    sha256 = "sha256-pzmwEiKziB4ldnKgeCsP2HdnisX8sOkLssAzNfcSEx8=";
+  };
+
+  nativeBuildInputs = [ clang_7 python2 ];
+
+  propagatedBuildInputs = [ graphviz matplotlib numpy pandas scipy plotly six ]
+    ++ lib.optional withCuda [ cudatoolkit ];
+
+  patches = [
+    ./nix-support.patch
+    (fetchpatch {
+      name = "format.patch";
+      url = "https://github.com/catboost/catboost/pull/1528/commits/a692ba42e5c0f62e5da82b2f6fccfa77deb3419c.patch";
+      sha256 = "sha256-fNGucHxsSDFRLk3hFH7rm+zzTdDpY9/QjRs8K+AzVvo=";
+    })
+  ];
+
+  preBuild = ''
+    cd catboost/python-package
+    '';
+  setupPyBuildFlags = [ "--with-ymake=no" ];
+  CUDA_ROOT = lib.optional withCuda cudatoolkit;
+  enableParallelBuilding = true;
+
+  # Tests use custom "ya" tool, not yet supported.
+  dontUseSetuptoolsCheck = true;
+  pythonImportsCheck = [ "catboost" ];
+
+  meta = with lib; {
+    description = "High-performance library for gradient boosting on decision trees.";
+    longDescription = ''
+      A fast, scalable, high performance Gradient Boosting on Decision Trees
+      library, used for ranking, classification, regression and other machine
+      learning tasks for Python, R, Java, C++. Supports computation on CPU and GPU.
+    '';
+    license = licenses.asl20;
+    platforms = [ "x86_64-linux" ];
+    homepage = "https://catboost.ai";
+    maintainers = with maintainers; [ PlushBeaver ];
+    # _catboost.pyx.cpp:226822:19: error: use of undeclared identifier '_PyGen_Send'
+    broken = withCuda;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/catboost/nix-support.patch b/nixpkgs/pkgs/development/python-modules/catboost/nix-support.patch
new file mode 100644
index 000000000000..feaf97d57070
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/catboost/nix-support.patch
@@ -0,0 +1,181 @@
+diff --git a/catboost/python-package/setup.py b/catboost/python-package/setup.py
+index 17f1d8ff14..07da618cd1 100644
+--- a/catboost/python-package/setup.py
++++ b/catboost/python-package/setup.py
+@@ -80,7 +80,7 @@ class Helper(object):
+         self.with_cuda = os.environ.get('CUDA_PATH') or os.environ.get('CUDA_ROOT') or None
+         self.os_sdk = 'local'
+         self.with_ymake = True
+-        self.parallel = None
++        self.parallel = os.environ.get('NIX_BUILD_CORES') or None
+ 
+     def finalize_options(self):
+         if os.path.exists(str(self.with_cuda)):
+@@ -222,11 +222,12 @@ class build_ext(_build_ext):
+ 
+     def build_with_make(self, topsrc_dir, build_dir, catboost_ext, put_dir, verbose, dry_run):
+         logging.info('Buildling {} with gnu make'.format(catboost_ext))
+-        makefile = 'python{}.{}CLANG50-LINUX-X86_64.makefile'.format(python_version()[0], 'CUDA.' if self.with_cuda else '')
++        makefile = 'python{}.{}CLANG7-LINUX-X86_64.makefile'.format(python_version()[0], 'CUDA.' if self.with_cuda else '')
+         make_cmd = [
+             'make', '-f', '../../make/' + makefile,
+-            'CC=clang-5.0',
+-            'CXX=clang++-5.0',
++            'CC=clang',
++            'CXX=clang++',
++            'PYTHON=python2',
+             'BUILD_ROOT=' + build_dir,
+             'SOURCE_ROOT=' + topsrc_dir,
+         ]
+diff --git a/make/python2.CLANG7-LINUX-X86_64.makefile b/make/python2.CLANG7-LINUX-X86_64.makefile
+index e54b7078e8..fb7b208af9 100644
+--- a/make/python2.CLANG7-LINUX-X86_64.makefile
++++ b/make/python2.CLANG7-LINUX-X86_64.makefile
+@@ -4,33 +4,6 @@ BUILD_ROOT = $(shell pwd)
+ SOURCE_ROOT = $(shell pwd)
+ PYTHON = $(shell which python)
+ 
+-ifneq ($(MAKECMDGOALS),help)
+-define _CC_TEST
+-__clang_major__ __clang_minor__
+-endef
+-
+-_CC_VERSION = $(shell echo '$(_CC_TEST)' | $(CC) -E -P -)
+-$(info _CC_VERSION = '$(_CC_VERSION)')
+-
+-ifneq '$(_CC_VERSION)' '7 0'
+-    $(error clang 7.0 is required)
+-endif
+-endif
+-
+-ifneq ($(MAKECMDGOALS),help)
+-define _CXX_TEST
+-__clang_major__ __clang_minor__
+-endef
+-
+-_CXX_VERSION = $(shell echo '$(_CXX_TEST)' | $(CXX) -E -P -)
+-$(info _CXX_VERSION = '$(_CXX_VERSION)')
+-
+-ifneq '$(_CXX_VERSION)' '7 0'
+-    $(error clang 7.0 is required)
+-endif
+-endif
+-
+-
+ all\
+         ::\
+         $(BUILD_ROOT)/catboost/python-package/catboost/_catboost.so\
+diff --git a/make/python2.CUDA.CLANG7-LINUX-X86_64.makefile b/make/python2.CUDA.CLANG7-LINUX-X86_64.makefile
+index 2a22a79b25..522fb54a7c 100644
+--- a/make/python2.CUDA.CLANG7-LINUX-X86_64.makefile
++++ b/make/python2.CUDA.CLANG7-LINUX-X86_64.makefile
+@@ -4,33 +4,6 @@ BUILD_ROOT = $(shell pwd)
+ SOURCE_ROOT = $(shell pwd)
+ PYTHON = $(shell which python)
+ 
+-ifneq ($(MAKECMDGOALS),help)
+-define _CC_TEST
+-__clang_major__ __clang_minor__
+-endef
+-
+-_CC_VERSION = $(shell echo '$(_CC_TEST)' | $(CC) -E -P -)
+-$(info _CC_VERSION = '$(_CC_VERSION)')
+-
+-ifneq '$(_CC_VERSION)' '7 0'
+-    $(error clang 7.0 is required)
+-endif
+-endif
+-
+-ifneq ($(MAKECMDGOALS),help)
+-define _CXX_TEST
+-__clang_major__ __clang_minor__
+-endef
+-
+-_CXX_VERSION = $(shell echo '$(_CXX_TEST)' | $(CXX) -E -P -)
+-$(info _CXX_VERSION = '$(_CXX_VERSION)')
+-
+-ifneq '$(_CXX_VERSION)' '7 0'
+-    $(error clang 7.0 is required)
+-endif
+-endif
+-
+-
+ all\
+         ::\
+         $(BUILD_ROOT)/catboost/python-package/catboost/_catboost.so\
+diff --git a/make/python3.CLANG7-LINUX-X86_64.makefile b/make/python3.CLANG7-LINUX-X86_64.makefile
+index fee6750bcb..dc55908371 100644
+--- a/make/python3.CLANG7-LINUX-X86_64.makefile
++++ b/make/python3.CLANG7-LINUX-X86_64.makefile
+@@ -4,33 +4,6 @@ BUILD_ROOT = $(shell pwd)
+ SOURCE_ROOT = $(shell pwd)
+ PYTHON = $(shell which python)
+ 
+-ifneq ($(MAKECMDGOALS),help)
+-define _CC_TEST
+-__clang_major__ __clang_minor__
+-endef
+-
+-_CC_VERSION = $(shell echo '$(_CC_TEST)' | $(CC) -E -P -)
+-$(info _CC_VERSION = '$(_CC_VERSION)')
+-
+-ifneq '$(_CC_VERSION)' '7 0'
+-    $(error clang 7.0 is required)
+-endif
+-endif
+-
+-ifneq ($(MAKECMDGOALS),help)
+-define _CXX_TEST
+-__clang_major__ __clang_minor__
+-endef
+-
+-_CXX_VERSION = $(shell echo '$(_CXX_TEST)' | $(CXX) -E -P -)
+-$(info _CXX_VERSION = '$(_CXX_VERSION)')
+-
+-ifneq '$(_CXX_VERSION)' '7 0'
+-    $(error clang 7.0 is required)
+-endif
+-endif
+-
+-
+ all\
+         ::\
+         $(BUILD_ROOT)/catboost/python-package/catboost/_catboost.so\
+diff --git a/make/python3.CUDA.CLANG7-LINUX-X86_64.makefile b/make/python3.CUDA.CLANG7-LINUX-X86_64.makefile
+index 5146830476..ff8535b03e 100644
+--- a/make/python3.CUDA.CLANG7-LINUX-X86_64.makefile
++++ b/make/python3.CUDA.CLANG7-LINUX-X86_64.makefile
+@@ -4,33 +4,6 @@ BUILD_ROOT = $(shell pwd)
+ SOURCE_ROOT = $(shell pwd)
+ PYTHON = $(shell which python)
+ 
+-ifneq ($(MAKECMDGOALS),help)
+-define _CC_TEST
+-__clang_major__ __clang_minor__
+-endef
+-
+-_CC_VERSION = $(shell echo '$(_CC_TEST)' | $(CC) -E -P -)
+-$(info _CC_VERSION = '$(_CC_VERSION)')
+-
+-ifneq '$(_CC_VERSION)' '7 0'
+-    $(error clang 7.0 is required)
+-endif
+-endif
+-
+-ifneq ($(MAKECMDGOALS),help)
+-define _CXX_TEST
+-__clang_major__ __clang_minor__
+-endef
+-
+-_CXX_VERSION = $(shell echo '$(_CXX_TEST)' | $(CXX) -E -P -)
+-$(info _CXX_VERSION = '$(_CXX_VERSION)')
+-
+-ifneq '$(_CXX_VERSION)' '7 0'
+-    $(error clang 7.0 is required)
+-endif
+-endif
+-
+-
+ all\
+         ::\
+         $(BUILD_ROOT)/catboost/python-package/catboost/_catboost.so\
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..6584f5f15df1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cattrs/default.nix
@@ -0,0 +1,109 @@
+{ lib
+, attrs
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, exceptiongroup
+, hypothesis
+, immutables
+, motor
+, msgpack
+, orjson
+, poetry-core
+, pytest-xdist
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, tomlkit
+, typing-extensions
+, ujson
+}:
+
+buildPythonPackage rec {
+  pname = "cattrs";
+  version = "22.1.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "python-attrs";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-C8uIsewpgJfB1yYckWTwF5K32+2AAOrxFKB9I18RENg=";
+  };
+
+  patches = [
+    (fetchpatch {
+      url = "https://github.com/python-attrs/cattrs/commit/290d162a589acf10ea63b825b7b283e23ca7698a.diff";
+      excludes = [ "poetry.lock" ];
+      hash = "sha256-n6c3qVg9umGKAxeTALq3QTJgO9DIj3SY0ZHhtsDeW94=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    attrs
+  ] ++ lib.optionals (pythonOlder "3.11") [
+    exceptiongroup
+  ] ++ lib.optionals (pythonOlder "3.7") [
+    typing-extensions
+  ];
+
+  checkInputs = [
+    hypothesis
+    immutables
+    motor
+    msgpack
+    orjson
+    pytest-xdist
+    pytestCheckHook
+    pyyaml
+    tomlkit
+    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";
+    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..7fd5baf57618
--- /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.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Yrhjxe5s7UAyr+lI88FITzdVUJldO4SYFFI3/ijlRsI=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  checkInputs = [
+    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..e231624e40f8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cccolutils/default.nix
@@ -0,0 +1,23 @@
+{ lib, buildPythonPackage, fetchPypi, isPy3k, krb5Full, nose, GitPython, mock, git }:
+
+buildPythonPackage rec {
+  pname = "CCColUtils";
+  version = "1.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1gwcq4xan9as1j3q9k2zqrywxp46qx0ljwxbck9id2fvilds6ck3";
+  };
+
+  buildInputs = [ krb5Full ];
+  propagatedBuildInputs = [ nose GitPython mock git ];
+
+  doCheck = isPy3k; # needs unpackaged module to run tests on python2
+
+  meta = with lib; {
+    description = "Python Kerberos 5 Credential Cache Collection Utilities";
+    homepage = "https://pagure.io/cccolutils";
+    license = licenses.gpl2;
+    maintainers = with maintainers; [ disassembler ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cchardet/default.nix b/nixpkgs/pkgs/development/python-modules/cchardet/default.nix
new file mode 100644
index 000000000000..587d0d1f6c12
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cchardet/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, python
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "cchardet";
+  version = "2.1.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c428b6336545053c2589f6caf24ea32276c6664cb86db817e03a94c60afa0eaf";
+  };
+
+  pythonImportsCheck = [
+    "cchardet"
+  ];
+
+  checkInputs = [ nose ];
+
+  # on non x86-64 some charsets are identified as their superset, so we skip these tests (last checked with version 2.1.7)
+  preCheck = ''
+    cp -R src/tests $TMPDIR
+    pushd $TMPDIR
+  '' + lib.optionalString (stdenv.hostPlatform.system != "x86_64-linux") ''
+    rm $TMPDIR/tests/testdata/th/tis-620.txt  # identified as iso-8859-11, which is fine for all practical purposes
+    rm $TMPDIR/tests/testdata/ga/iso-8859-1.txt  # identified as windows-1252, which is fine for all practical purposes
+    rm $TMPDIR/tests/testdata/fi/iso-8859-1.txt  # identified as windows-1252, which is fine for all practical purposes
+  '';
+
+  checkPhase = ''
+    runHook preCheck
+
+    nosetests
+
+    runHook postCheck
+  '';
+
+  postCheck = ''
+    popd
+  '';
+
+  meta = {
+    description = "High-speed universal character encoding detector";
+    homepage = "https://github.com/PyYoshi/cChardet";
+    license = lib.licenses.mpl11;
+    maintainers = with lib.maintainers; [ ivan ];
+  };
+}
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..748d0ff623fd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cdcs/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, numpy
+, pandas
+, pytestCheckHook
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  version = "0.1.8";
+  pname = "cdcs";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "usnistgov";
+    repo = "pycdcs";
+    rev = "v${version}";
+    sha256 = "sha256-s+COE7hus1J5I8PTdagl7KEK5QFoidjQ3ee46kOWmkE=";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    pandas
+    requests
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  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";
+    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..a1be0b95826d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/celery-redbeat/default.nix
@@ -0,0 +1,46 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchFromGitHub
+, python-dateutil
+, celery
+, redis
+, tenacity
+, pytestCheckHook
+, fakeredis
+, mock
+}:
+
+buildPythonPackage rec {
+  pname = "celery-redbeat";
+  version = "2.0.0";
+
+  src = fetchFromGitHub {
+    owner = "sibson";
+    repo = "redbeat";
+    rev = "v${version}";
+    hash = "sha256-pu4umhfNFZ30bQu5PcT2LYN4WGzFj4p4/qHm3pVIV+c=";
+  };
+
+  propagatedBuildInputs = [
+    python-dateutil
+    celery
+    redis
+    tenacity
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    fakeredis
+    mock
+  ];
+
+  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/default.nix b/nixpkgs/pkgs/development/python-modules/celery/default.nix
new file mode 100644
index 000000000000..67c3c58794d5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/celery/default.nix
@@ -0,0 +1,107 @@
+{ stdenv
+, lib
+, billiard
+, boto3
+, buildPythonPackage
+, case
+, click
+, click-didyoumean
+, click-plugins
+, click-repl
+, dnspython
+, fetchPypi
+, fetchpatch
+, kombu
+, moto
+, pymongo
+, pytest-celery
+, pytest-subtests
+, pytest-timeout
+, pytestCheckHook
+, pythonOlder
+, pytz
+, vine
+, nixosTests
+}:
+
+buildPythonPackage rec {
+  pname = "celery";
+  version = "5.2.7";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-+vvYKTTTD4oAT4Ho96Bi4xQToj1ES+juMyZVORWVjG0=";
+  };
+
+  patches = [
+    (fetchpatch {
+      name = "billiard-4.0-comat.patch";
+      url = "https://github.com/celery/celery/commit/b260860988469ef8ad74f2d4225839c2fa91d590.patch";
+      hash = "sha256-NWB/UB0fE7A/vgMRYz6QGmqLmyN1ninAMyL4V2tpzto=";
+    })
+  ];
+
+  postPatch = ''
+    substituteInPlace requirements/default.txt \
+      --replace "billiard>=3.6.4.0,<4.0" "billiard>=3.6.4.0"
+  '';
+
+  propagatedBuildInputs = [
+    billiard
+    click
+    click-didyoumean
+    click-plugins
+    click-repl
+    kombu
+    pytz
+    vine
+  ];
+
+  checkInputs = [
+    boto3
+    case
+    dnspython
+    moto
+    pymongo
+    pytest-celery
+    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/";
+    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..a6b436a92f4a
--- /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.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "fccec41eab3f15a03445b1ce24c8a7e106d4d5520f6507a7145698ce68923d31";
+  };
+
+  # 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/censys/default.nix b/nixpkgs/pkgs/development/python-modules/censys/default.nix
new file mode 100644
index 000000000000..ee4ced91c6a9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/censys/default.nix
@@ -0,0 +1,79 @@
+{ lib
+, backoff
+, buildPythonPackage
+, fetchFromGitHub
+, importlib-metadata
+, parameterized
+, poetry-core
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+, pythonRelaxDepsHook
+, requests
+, requests-mock
+, responses
+, rich
+}:
+
+buildPythonPackage rec {
+  pname = "censys";
+  version = "2.1.8";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "censys";
+    repo = "censys-python";
+    rev = "v${version}";
+    hash = "sha256-iPCFflibEqA286j+7Vp4ZQaO9e6Bp+o7A/a7DELJcxA=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+    pythonRelaxDepsHook
+  ];
+
+  propagatedBuildInputs = [
+    backoff
+    requests
+    rich
+    importlib-metadata
+  ];
+
+  checkInputs = [
+    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";
+    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..f198d8b058dd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cepa/default.nix
@@ -0,0 +1,32 @@
+{ lib, buildPythonPackage, fetchPypi, python, mock }:
+
+buildPythonPackage rec {
+  pname = "cepa";
+  version = "1.8.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "HcbwsyTTei7SyidGSOzo/SyWodL0QPWMDKF6/Ute3no=";
+  };
+
+  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
+  '';
+
+  checkInputs = [ 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..be597277b6b7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cerberus/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "Cerberus";
+  version = "1.3.4";
+
+  src = fetchFromGitHub {
+    owner = "pyeve";
+    repo = "cerberus";
+    rev = version;
+    sha256 = "03kj15cf1pbd11mxsik96m5w1m6p0fbdc4ia5ihzmq8rz28razpq";
+  };
+
+  propagatedBuildInputs = [
+    setuptools
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    export TESTDIR=$(mktemp -d)
+    cp -R ./cerberus/tests $TESTDIR
+    pushd $TESTDIR
+  '';
+
+  postCheck = ''
+    popd
+  '';
+
+  pythonImportsCheck = [
+    "cerberus"
+  ];
+
+  meta = with lib; {
+    homepage = "http://python-cerberus.org/";
+    description = "Lightweight, extensible schema and data validation tool for Python dictionaries";
+    license = licenses.mit;
+  };
+}
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..6491749498bd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cert-chain-resolver/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, cryptography
+, fetchFromGitHub
+, pytestCheckHook
+, pytest-mock
+, pythonOlder
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "cert-chain-resolver";
+  version = "1.0.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "rkoopmans";
+    repo = "python-certificate-chain-resolver";
+    rev = version;
+    hash = "sha256-NLTRx6J6pjs7lyschHN5KtgrnpQpEyvZ2zz0pSd5sc4=";
+  };
+
+  propagatedBuildInputs = [
+    cryptography
+  ];
+
+  checkInputs = [
+    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";
+    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..782ad9608144
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/certauth/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pyopenssl
+, tldextract
+, pytestCheckHook
+, pytest-cov
+}:
+
+buildPythonPackage rec {
+  pname = "certauth";
+  version = "1.3.0";
+
+  src = fetchFromGitHub {
+    owner = "ikreymer";
+    repo = "certauth";
+    rev = "ad2bae5d40a9e45519fc1f2cd7678174bbc55b3d"; # Repo has no git tags
+    sha256 = "sha256-Rso5N0jb9k7bdorjPIUMNiZZPnzwbkxFNiTpsJ9pco0=";
+  };
+
+  propagatedBuildInputs = [
+    pyopenssl
+    tldextract
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    pytest-cov
+  ];
+
+  pythonImportsCheck = [ "certauth" ];
+
+  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..abdd6d2d8f06
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/certbot-dns-cloudflare/default.nix
@@ -0,0 +1,32 @@
+{ buildPythonPackage
+, acme
+, certbot
+, cloudflare
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "certbot-dns-cloudflare";
+
+  inherit (certbot) src version;
+  disabled = pythonOlder "3.6";
+
+  propagatedBuildInputs = [
+    acme
+    certbot
+    cloudflare
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [ "-o cache_dir=$(mktemp -d)" ];
+
+  sourceRoot = "source/certbot-dns-cloudflare";
+
+  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..182ff720e13a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/certbot-dns-google/default.nix
@@ -0,0 +1,34 @@
+{ buildPythonPackage
+, acme
+, certbot
+, google-api-python-client
+, oauth2client
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "certbot-dns-google";
+
+  inherit (certbot) src version;
+  disabled = pythonOlder "3.6";
+
+  propagatedBuildInputs = [
+    acme
+    certbot
+    google-api-python-client
+    oauth2client
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [ "-o cache_dir=$(mktemp -d)" ];
+
+  sourceRoot = "source/certbot-dns-google";
+
+  meta = certbot.meta // {
+    description = "Google Cloud 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..f3da841667ba
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/certbot-dns-rfc2136/default.nix
@@ -0,0 +1,32 @@
+{ buildPythonPackage
+, acme
+, certbot
+, dnspython
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "certbot-dns-rfc2136";
+
+  inherit (certbot) src version;
+  disabled = pythonOlder "3.6";
+
+  propagatedBuildInputs = [
+    acme
+    certbot
+    dnspython
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [ "-o cache_dir=$(mktemp -d)" ];
+
+  sourceRoot = "source/certbot-dns-rfc2136";
+
+  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..7052107418c9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/certbot-dns-route53/default.nix
@@ -0,0 +1,32 @@
+{ buildPythonPackage
+, acme
+, boto3
+, certbot
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "certbot-dns-route53";
+
+  inherit (certbot) src version;
+  disabled = pythonOlder "3.6";
+
+  propagatedBuildInputs = [
+    acme
+    boto3
+    certbot
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [ "-o cache_dir=$(mktemp -d)" ];
+
+  sourceRoot = "source/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..53c7c397f981
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/certbot/default.nix
@@ -0,0 +1,78 @@
+{ lib
+, buildPythonPackage
+, python, runCommand
+, fetchFromGitHub
+, configargparse, acme, configobj, cryptography, distro, josepy, parsedatetime, pyRFC3339, pyopenssl, pytz, requests, six, zope_component, zope_interface
+, dialog, gnureadline
+, pytest-xdist, pytestCheckHook, python-dateutil
+}:
+
+buildPythonPackage rec {
+  pname = "certbot";
+  version = "1.29.0";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-DFdXDFSqqkm4r59Kmd1wxcg2YePP3dI9squiW+iSmaU=";
+  };
+
+  sourceRoot = "source/${pname}";
+
+  propagatedBuildInputs = [
+    configargparse
+    acme
+    configobj
+    cryptography
+    distro
+    josepy
+    parsedatetime
+    pyRFC3339
+    pyopenssl
+    pytz
+    requests
+    six
+    zope_component
+    zope_interface
+  ];
+
+  buildInputs = [ dialog gnureadline ];
+
+  checkInputs = [
+    python-dateutil
+    pytestCheckHook
+    pytest-xdist
+  ];
+
+  pytestFlagsArray = [
+    "-o cache_dir=$(mktemp -d)"
+    # See https://github.com/certbot/certbot/issues/8746
+    "-W ignore::ResourceWarning"
+  ];
+
+  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..674fc1183d8e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/certifi/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "certifi";
+  version = "2022.06.15";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = "python-certifi";
+    rev = version;
+    sha256 = "sha256-CKO8wF5FMGLIZbTd7YrKE9OWV9MbfQ2+BMc5IPk1FFU=";
+  };
+
+  checkInputs = [
+    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 SuperSandro2000 ];
+  };
+}
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..3d863165f296
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/certomancer/default.nix
@@ -0,0 +1,71 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, asn1crypto
+, click
+, oscrypto
+, pyyaml
+, python-dateutil
+, tzlocal
+, pytest-aiohttp
+, pytz
+, freezegun
+, jinja2
+, pyhanko-certvalidator
+, requests
+, requests-mock
+, werkzeug
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "certomancer";
+  version = "0.8.2";
+  format = "setuptools";
+  disabled = pythonOlder "3.7";
+
+  # Tests are only available on GitHub
+  src = fetchFromGitHub {
+    owner = "MatthiasValvekens";
+    repo = "certomancer";
+    rev = version;
+    sha256 = "sha256-H43NlFNTwZtedHsB7c62MocwQVOi5JjVJxRcZY+Wn7Y=";
+  };
+
+  propagatedBuildInputs = [
+    asn1crypto
+    click
+    oscrypto
+    pyyaml
+    python-dateutil
+    tzlocal
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace ", 'pytest-runner'" "" \
+      --replace "pyhanko-certvalidator==0.19.2" "pyhanko-certvalidator==0.19.5"
+  '';
+
+  checkInputs = [
+    freezegun
+    jinja2
+    pyhanko-certvalidator
+    pytest-aiohttp
+    pytz
+    requests
+    requests-mock
+    werkzeug
+    pytestCheckHook
+  ];
+
+  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..8f53bd9805ba
--- /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;
+    sha256 = "sha256-yVF7t4FuU3C9fDg67JeM7LWZZh/mv5F4EKmjlO4AuBY=";
+  };
+
+  propagatedBuildInputs = [ asn1crypto oscrypto ];
+
+  checkInputs = [ 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/cffi/default.nix b/nixpkgs/pkgs/development/python-modules/cffi/default.nix
new file mode 100644
index 000000000000..7691d9b7d59b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cffi/default.nix
@@ -0,0 +1,46 @@
+{ lib, stdenv, buildPythonPackage, isPyPy, fetchPypi, pytestCheckHook,
+  libffi, pkg-config, pycparser
+}:
+
+if isPyPy then null else buildPythonPackage rec {
+  pname = "cffi";
+  version = "1.15.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-1AC/uaN7E1ElPLQCZxzqfom97MKU6AFqcH9tHYrJNPk=";
+  };
+
+  outputs = [ "out" "dev" ];
+
+  buildInputs = [ libffi ];
+
+  nativeBuildInputs = [ pkg-config ];
+
+  propagatedBuildInputs = [ pycparser ];
+
+  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'
+  '';
+
+  # The tests use -Werror but with python3.6 clang detects some unreachable code.
+  NIX_CFLAGS_COMPILE = lib.optionalString stdenv.cc.isClang
+    "-Wno-unused-command-line-argument -Wno-unreachable-code -Wno-c++11-narrowing";
+
+  # Lots of tests fail on aarch64-darwin due to "Cannot allocate write+execute memory":
+  # * https://cffi.readthedocs.io/en/latest/using.html#callbacks
+  doCheck = !stdenv.hostPlatform.isMusl && !(stdenv.isDarwin && stdenv.isAarch64);
+
+  checkInputs = [ pytestCheckHook ];
+
+  meta = with lib; {
+    maintainers = with maintainers; [ domenkozar lnl7 ];
+    homepage = "https://cffi.readthedocs.org/";
+    license = licenses.mit;
+    description = "Foreign Function Interface for Python calling C code";
+  };
+}
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..4341efb05c87
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cffsubr/default.nix
@@ -0,0 +1,42 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchPypi
+, fonttools
+, pytestCheckHook
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "cffsubr";
+  version = "0.2.9.post1";
+
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "azFBLc9JyPqEZkvahn4u3cVbb+b6aW/yU8TxOp/y/Fw=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    fonttools
+  ];
+
+  checkInputs = [
+    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; [ jtojnar ];
+  };
+}
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..c7b074089a68
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cfgv/default.nix
@@ -0,0 +1,23 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27, six }:
+
+buildPythonPackage rec {
+  pname = "cfgv";
+  version = "3.3.1";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f5a830efb9ce7a445376bb66ec94c638a9787422f96264c98edc6bdeed8ab736";
+  };
+
+  propagatedBuildInputs = [ six ];
+
+  # Tests not included in PyPI tarball
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Validate configuration and produce human readable error messages";
+    homepage = "https://github.com/asottile/cfgv";
+    license = licenses.mit;
+  };
+}
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..f19a6aba260f
--- /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
+  ];
+
+  checkInputs = [
+    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..238f5e83630e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cfn-lint/default.nix
@@ -0,0 +1,95 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, aws-sam-translator
+, jschema-to-python
+, jsonpatch
+, jsonschema
+, junit-xml
+, networkx
+, pyyaml
+, sarif-om
+, setuptools
+, six
+, mock
+, pydot
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "cfn-lint";
+  version = "0.61.2";
+
+  src = fetchFromGitHub {
+    owner = "aws-cloudformation";
+    repo = "cfn-python-lint";
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-282h1fBWhAfwqCuP+dU3ajn0gQtmOcPNTMKZ0a2+vHU=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "jsonschema~=3.0" "jsonschema>=3.0"
+  '';
+
+  propagatedBuildInputs = [
+    aws-sam-translator
+    jschema-to-python
+    jsonpatch
+    jsonschema
+    junit-xml
+    networkx
+    pyyaml
+    sarif-om
+    six
+  ];
+
+  checkInputs = [
+    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"
+  ];
+
+  pythonImportsCheck = [
+    "cfnlint"
+    "cfnlint.conditions"
+    "cfnlint.core"
+    "cfnlint.decode.node"
+    "cfnlint.decode.cfn_yaml"
+    "cfnlint.decode.cfn_json"
+    "cfnlint.decorators.refactored"
+    "cfnlint.graph"
+    "cfnlint.helpers"
+    "cfnlint.rules"
+    "cfnlint.runner"
+    "cfnlint.template"
+    "cfnlint.transform"
+  ];
+
+  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-python-lint/blob/master/CHANGELOG.md";
+    license = licenses.mit;
+  };
+}
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..3fd98b7e1e2a
--- /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";
+    sha256 = "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; [ WeebSorceress ];
+  };
+}
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..2fbf1a20c8de
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cftime/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, cython
+, fetchPypi
+, numpy
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "cftime";
+  version = "1.6.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-URIV9F7XzHnq2EAg6I4fxHa4q6cbR9L83vjmUkJAaSc=";
+  };
+
+  nativeBuildInputs = [
+    cython
+    numpy
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    sed -i "/--cov/d" setup.cfg
+  '';
+
+  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..06beebc2f326
--- /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";
+  };
+
+  checkInputs = [ 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 = [ maintainers.costrouc ];
+  };
+}
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..8f9408ec2fa2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/chacha20poly1305-reuseable/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+
+# build
+, poetry-core
+
+# propagates
+, cryptography
+
+# tests
+, pytestCheckHook
+}:
+
+let
+  pname = "chacha20poly1305-reuseable";
+  version = "0.0.4";
+in
+
+buildPythonPackage {
+  inherit pname version;
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "bdraco";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-iOGDTQyiznjYblT/NfHxewIwEZsPnp7bdNVD1p9/H1M=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    cryptography
+  ];
+
+  pythonImportsCheck = [
+    "chacha20poly1305_reuseable"
+  ];
+
+  preCheck = ''
+    substituteInPlace pyproject.toml \
+      --replace "--cov=chacha20poly1305_reuseable --cov-report=term-missing:skip-covered" ""
+  '';
+
+  checkInputs = [
+    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/main/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
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..55a316ceab99
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/chainer/default.nix
@@ -0,0 +1,52 @@
+{ config, lib, buildPythonPackage, fetchFromGitHub, isPy3k
+, filelock, protobuf, numpy, pytestCheckHook, mock, typing-extensions
+, cupy, cudaSupport ? config.cudaSupport or false
+}:
+
+buildPythonPackage rec {
+  pname = "chainer";
+  version = "7.8.1.post1";
+  disabled = !isPy3k; # python2.7 abandoned upstream
+
+  src = fetchFromGitHub {
+    owner = "chainer";
+    repo = "chainer";
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-epwnExmyCWmwaOz+mJnAl1peEeHLBdQGC62BlLfSTQQ=";
+  };
+
+  propagatedBuildInputs = [
+    filelock
+    protobuf
+    numpy
+    typing-extensions
+  ] ++ lib.optionals cudaSupport [ cupy ];
+
+  checkInputs = [
+    pytestCheckHook
+    mock
+  ];
+
+  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"
+  ];
+
+  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..052120d893d0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/chalice/default.nix
@@ -0,0 +1,102 @@
+{ lib
+, attrs
+, botocore
+, buildPythonPackage
+, click
+, fetchFromGitHub
+, hypothesis
+, inquirer
+, jmespath
+, mock
+, mypy-extensions
+, pip
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, requests
+, setuptools
+, six
+, typing
+, watchdog
+, websocket-client
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "chalice";
+  version = "1.27.1";
+
+  src = fetchFromGitHub {
+    owner = "aws";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-Qz8kYXu2NmcgtW8GbmLPfB4BOearEycE6EMmQRXmWeI=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "attrs>=19.3.0,<21.5.0" "attrs" \
+      --replace "pip>=9,<22.2" "pip" \
+      --replace "typing==3.6.4" "typing"
+  '';
+
+  propagatedBuildInputs = [
+    attrs
+    botocore
+    click
+    inquirer
+    jmespath
+    mypy-extensions
+    pip
+    pyyaml
+    setuptools
+    six
+    wheel
+    watchdog
+  ] ++ lib.optionals (pythonOlder "3.7") [
+    typing
+  ];
+
+  checkInputs = [
+    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"
+  ];
+
+  pythonImportsCheck = [ "chalice" ];
+
+  meta = with lib; {
+    description = "Python Serverless Microframework for AWS";
+    homepage = "https://github.com/aws/chalice";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ costrouc ];
+  };
+}
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..6ee3dc340c63
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/channels-redis/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, aioredis
+, asgiref
+, buildPythonPackage
+, channels
+, fetchPypi
+, hiredis
+, msgpack
+, pythonOlder
+, redis
+}:
+
+buildPythonPackage rec {
+  pname = "channels-redis";
+  version = "3.4.1";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "channels_redis";
+    sha256 = "sha256-eOSi8rKnRP5ah4SOw2te5J9SLGgIzv5sWDZj0NUx+qg=";
+  };
+
+  buildInputs = [ redis hiredis ];
+
+  propagatedBuildInputs = [ channels msgpack aioredis asgiref ];
+
+  # Fails with : ConnectionRefusedError: [Errno 111] Connect call failed ('127.0.0.1', 6379)
+  # (even with a local Redis instance running)
+  doCheck = false;
+
+  postPatch = ''
+    sed -i "s/msgpack~=0.6.0/msgpack/" setup.py
+    sed -i "s/aioredis~=1.0/aioredis/" setup.py
+  '';
+
+  pythonImportsCheck = [ "channels_redis" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/django/channels_redis/";
+    description = "Redis-backed ASGI channel layer implementation";
+    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..e4c8658f59bf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/channels/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, asgiref
+, django
+, daphne
+, pytest-asyncio
+, pytest-django
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "channels";
+  version = "3.0.5";
+
+  src = fetchFromGitHub {
+    owner = "django";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-bKrPLbD9zG7DwIYBst1cb+zkDsM8B02wh3D80iortpw=";
+  };
+
+  propagatedBuildInputs = [
+    asgiref
+    django
+    daphne
+  ];
+
+  checkInputs = [
+    pytest-asyncio
+    pytest-django
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "--asyncio-mode=legacy"
+  ];
+
+  pythonImportsCheck = [ "channels" ];
+
+  meta = with lib; {
+    description = "Brings event-driven capabilities to Django with a channel system";
+    license = licenses.bsd3;
+    homepage = "https://github.com/django/channels";
+    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..2e12077bd562
--- /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";
+  };
+
+  checkInputs = [ 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..b5cca5110e7c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/chardet/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, hypothesis
+, pythonOlder
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "chardet";
+  version = "5.0.0";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-A2jfK/14tfwgVyu06bt/tT4sCU9grpmTM56GcdCvuKo=";
+  };
+
+  checkInputs = [
+    hypothesis
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # flaky; https://github.com/chardet/chardet/issues/256
+    "test_detect_all_and_detect_one_should_agree"
+  ];
+
+  pythonImportsCheck = [ "chardet" ];
+
+  meta = with lib; {
+    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..9661700a2858
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/charset-normalizer/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "charset-normalizer";
+  version = "2.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "Ousret";
+    repo = "charset_normalizer";
+    rev = "refs/tags/${version}";
+    hash = "sha256-ntNMHjkQJqzSElEeyFmPIjUh6ZxQkTktPipfPHiJ/Vc=";
+  };
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace " --cov=charset_normalizer --cov-report=term-missing" ""
+  '';
+
+  pythonImportsCheck = [
+    "charset_normalizer"
+  ];
+
+  meta = with lib; {
+    description = "Python module for encoding and language detection";
+    homepage = "https://charset-normalizer.readthedocs.io/";
+    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..440739226970
--- /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.9.0";
+
+  # chart-studio was split from plotly
+  src = fetchFromGitHub {
+    owner = "plotly";
+    repo = "plotly.py";
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-o14uP7czY4DDTFDabOk7aTF3mMPmBrPg1/fkoIUlab8=";
+  };
+
+  sourceRoot = "source/packages/python/chart-studio";
+
+  propagatedBuildInputs = [
+    plotly
+    requests
+    retrying
+    six
+  ];
+
+  checkInputs = [ 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/check-manifest/default.nix b/nixpkgs/pkgs/development/python-modules/check-manifest/default.nix
new file mode 100644
index 000000000000..6c91633e8af0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/check-manifest/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, breezy
+, build
+, buildPythonPackage
+, fetchPypi
+, git
+, mock
+, pep517
+, pytestCheckHook
+, toml
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "check-manifest";
+  version = "0.48";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-O1dfHa3nvrMHjvS/M6lFGYNEV8coHbxyaxXFRmtVxlc=";
+  };
+
+  propagatedBuildInputs = [
+    build
+    pep517
+    toml
+  ];
+
+  checkInputs = [
+    breezy
+    git
+    mock
+    pytestCheckHook
+  ];
+
+  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";
+    license = licenses.mit;
+    maintainers = with maintainers; [ lewo ];
+  };
+}
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..01a6948e3cac
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cheetah3/default.nix
@@ -0,0 +1,20 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "Cheetah3";
+  version = "3.2.6.post2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "63157d7a00a273b59676b5be5aa817c75c37efc88478231f1a160f4cfb7f7878";
+  };
+
+  doCheck = false; # Circular dependency
+
+  meta = with lib; {
+    homepage = "http://www.cheetahtemplate.org/";
+    description = "A template engine and code generation tool";
+    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..da5870f7d500
--- /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 = "8.6.0";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-NmrfbnyslVVIbC0b5il5kwIu/2+MRlXBRDJozKPwjiU=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+    setuptools-scm-git-archive
+  ];
+
+  propagatedBuildInputs = [
+    jaraco_functools
+    more-itertools
+    six
+  ];
+
+  checkInputs = [
+    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..bf963ce16aa1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cherrypy/default.nix
@@ -0,0 +1,109 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, cheroot
+, fetchPypi
+, jaraco_collections
+, more-itertools
+, objgraph
+, path
+, portend
+, pytest-forked
+, pytest-services
+, pytestCheckHook
+, python-memcached
+, pythonAtLeast
+, pythonOlder
+, requests-toolbelt
+, routes
+, setuptools-scm
+, simplejson
+, zc_lockfile
+}:
+
+buildPythonPackage rec {
+  pname = "cherrypy";
+  version = "18.7.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "CherryPy";
+    inherit version;
+    hash = "sha256-cpRS95jKdWOQBG7zGAQ8roZKRoFN6vPmvTTclZrxmN4=";
+  };
+
+  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
+  ];
+
+  checkInputs = [
+    objgraph
+    path
+    pytest-forked
+    pytest-services
+    pytestCheckHook
+    requests-toolbelt
+  ];
+
+  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"
+  ] ++ 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 ];
+    # not packaged yet
+    xcgi = [ /* flup */ ];
+  };
+
+  meta = with lib; {
+    description = "Object-oriented HTTP framework";
+    homepage = "https://www.cherrypy.org";
+    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..e4f9c7bfb022
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/chess/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, python
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "chess";
+  version = "1.9.2";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "niklasf";
+    repo = "python-${pname}";
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-RGAEkeE6YAik//yZt9mJdrFj4z0yxlHjZPLUaHd9yUQ=";
+  };
+
+  pythonImportsCheck = [ "chess" ];
+
+  checkPhase = ''
+    ${python.interpreter} ./test.py -v
+  '';
+
+  meta = with lib; {
+    description = "A chess library for Python, with move generation, move validation, and support for common formats";
+    homepage = "https://github.com/niklasf/python-chess";
+    maintainers = with maintainers; [ smancill ];
+    license = licenses.gpl3Plus;
+  };
+}
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..98598e4acf15
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/chex/default.nix
@@ -0,0 +1,48 @@
+{ absl-py
+, buildPythonPackage
+, dm-tree
+, fetchFromGitHub
+, jax
+, jaxlib
+, lib
+, numpy
+, pytestCheckHook
+, toolz
+}:
+
+buildPythonPackage rec {
+  pname = "chex";
+  version = "0.1.3";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "deepmind";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-oIdRh0WKzdvyCfcamKRDiMsV51b6rdmNYcELjDQKGX4=";
+  };
+
+  propagatedBuildInputs = [
+    absl-py
+    dm-tree
+    jax
+    numpy
+    toolz
+  ];
+
+  pythonImportsCheck = [
+    "chex"
+  ];
+
+  checkInputs = [
+    jaxlib
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Chex is a library of utilities for helping to write reliable JAX code.";
+    homepage = "https://github.com/deepmind/chex";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ndl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/chia-rs/Cargo.lock b/nixpkgs/pkgs/development/python-modules/chia-rs/Cargo.lock
new file mode 100644
index 000000000000..96fc3236f142
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/chia-rs/Cargo.lock
@@ -0,0 +1,732 @@
+# 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 = "bitvec"
+version = "0.22.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5237f00a8c86130a0cc317830e558b966dd7850d48a953d998c813f01a41b527"
+dependencies = [
+ "funty",
+ "radium",
+ "tap",
+ "wyz",
+]
+
+[[package]]
+name = "block-buffer"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4"
+dependencies = [
+ "generic-array",
+]
+
+[[package]]
+name = "bls12_381"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "54757888b09a69be70b5ec303e382a74227392086ba808cb01eeca29233a2397"
+dependencies = [
+ "ff",
+ "group",
+ "pairing",
+ "rand_core",
+ "subtle",
+]
+
+[[package]]
+name = "bumpalo"
+version = "3.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "37ccbd214614c6783386c1af30caf03192f17891059cecc394b4fb119e363de3"
+
+[[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 = "chia"
+version = "0.1.5"
+dependencies = [
+ "clvmr",
+ "hex",
+ "num-traits",
+ "pyo3",
+ "serde",
+]
+
+[[package]]
+name = "chia_rs"
+version = "0.1.5"
+dependencies = [
+ "chia",
+ "clvmr",
+ "hex",
+ "py_streamable",
+ "pyo3",
+ "serde",
+ "sha2",
+]
+
+[[package]]
+name = "chia_wasm"
+version = "0.1.5"
+dependencies = [
+ "chia",
+ "wasm-bindgen",
+ "wasm-bindgen-test",
+]
+
+[[package]]
+name = "clvmr"
+version = "0.1.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d18d68c7f9e8e08ea66a6673bec83100bd53103a9d504fe279147bd0a79b260c"
+dependencies = [
+ "bls12_381",
+ "hex",
+ "lazy_static",
+ "num-bigint",
+ "num-integer",
+ "num-traits",
+ "pyo3",
+ "sha2",
+ "wasm-bindgen",
+ "wasm-bindgen-test",
+]
+
+[[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",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "cpufeatures"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "66c99696f6c9dd7f35d486b9d04d7e6e202aa3e8c40d553f2fdf5e7e0c6a71ef"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "ctor"
+version = "0.1.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f877be4f7c9f246b183111634f75baa039715e3f46ce860677d3b19a69fb229c"
+dependencies = [
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "digest"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066"
+dependencies = [
+ "generic-array",
+]
+
+[[package]]
+name = "ff"
+version = "0.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d0f40b2dcd8bc322217a5f6559ae5f9e9d1de202a2ecee2e9eafcbece7562a4f"
+dependencies = [
+ "bitvec",
+ "rand_core",
+ "subtle",
+]
+
+[[package]]
+name = "funty"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1847abb9cb65d566acd5942e94aea9c8f547ad02c98e1649326fc0e8910b8b1e"
+
+[[package]]
+name = "generic-array"
+version = "0.14.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fd48d33ec7f05fbfa152300fdad764757cbded343c1aa1cff2fbaf4134851803"
+dependencies = [
+ "typenum",
+ "version_check",
+]
+
+[[package]]
+name = "ghost"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b93490550b1782c589a350f2211fff2e34682e25fed17ef53fc4fa8fe184975e"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "group"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1c363a5301b8f153d80747126a04b3c82073b9fe3130571a9d170cacdeaf7912"
+dependencies = [
+ "byteorder",
+ "ff",
+ "rand_core",
+ "subtle",
+]
+
+[[package]]
+name = "hex"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
+
+[[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 = "inventory"
+version = "0.1.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f0eb5160c60ba1e809707918ee329adb99d222888155835c6feedba19f6c3fd4"
+dependencies = [
+ "ctor",
+ "ghost",
+ "inventory-impl",
+]
+
+[[package]]
+name = "inventory-impl"
+version = "0.1.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7e41b53715c6f0c4be49510bb82dee2c1e51c8586d885abe65396e82ed518548"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "js-sys"
+version = "0.3.52"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ce791b7ca6638aae45be056e068fc756d871eb3b3b10b8efa62d1c9cec616752"
+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 = "libc"
+version = "0.2.126"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836"
+
+[[package]]
+name = "lock_api"
+version = "0.4.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "327fa5b6a6940e4699ec49a9beae1ea4845c6bab9314e4f84ac68742139d8c53"
+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 = "num-bigint"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4e0d047c1062aa51e256408c560894e5251f08925980e53cf1aa5bd00eec6512"
+dependencies = [
+ "autocfg",
+ "num-integer",
+ "num-traits",
+]
+
+[[package]]
+name = "num-integer"
+version = "0.1.44"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db"
+dependencies = [
+ "autocfg",
+ "num-traits",
+]
+
+[[package]]
+name = "num-traits"
+version = "0.2.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "once_cell"
+version = "1.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "18a6dbe30758c9f83eb00cbea4ac95966305f5a7772f3f42ebfc7fc7eddbd8e1"
+
+[[package]]
+name = "opaque-debug"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5"
+
+[[package]]
+name = "pairing"
+version = "0.20.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7de9d09263c9966e8196fe0380c9dbbc7ea114b5cf371ba29004bc1f9c6db7f3"
+dependencies = [
+ "group",
+]
+
+[[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.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d76e8e1493bcac0d2766c42737f34458f1c8c50c0d23bcb24ea953affb273216"
+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.42"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c278e965f1d8cf32d6e0e96de3d3e79712178ae67986d9cf9151f51e95aac89b"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "py_streamable"
+version = "0.1.0"
+dependencies = [
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "pyo3"
+version = "0.15.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7cf01dbf1c05af0a14c7779ed6f3aa9deac9c3419606ac9de537a2d649005720"
+dependencies = [
+ "cfg-if",
+ "indoc",
+ "inventory",
+ "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.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 = "quote"
+version = "1.0.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3bcdf212e9776fbcb2d23ab029360416bb1706b1aea2d1a5ba002727cbcab804"
+dependencies = [
+ "proc-macro2",
+]
+
+[[package]]
+name = "radium"
+version = "0.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "643f8f41a8ebc4c5dc4515c82bb8abd397b527fc20fd681b7c011c2aee5d44fb"
+
+[[package]]
+name = "rand_core"
+version = "0.6.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7"
+
+[[package]]
+name = "redox_syscall"
+version = "0.2.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a"
+dependencies = [
+ "bitflags",
+]
+
+[[package]]
+name = "scoped-tls"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ea6a9290e3c9cf0f18145ef7ffa62d68ee0bf5fcd651017e586dc7fd5da448c2"
+
+[[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.140"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fc855a42c7967b7c369eb5860f7164ef1f6f81c20c7cc1141f2a604e18723b03"
+dependencies = [
+ "serde_derive",
+]
+
+[[package]]
+name = "serde_derive"
+version = "1.0.140"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6f2122636b9fe3b81f1cb25099fcf2d3f542cdb1d45940d56c713158884a05da"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "sha2"
+version = "0.9.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b362ae5752fd2137731f9fa25fd4d9058af34666ca1966fb969119cc35719f12"
+dependencies = [
+ "block-buffer",
+ "cfg-if",
+ "cpufeatures",
+ "digest",
+ "opaque-debug",
+]
+
+[[package]]
+name = "smallvec"
+version = "1.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2fd0db749597d91ff862fd1d55ea87f7855a744a8425a64695b6fca237d1dad1"
+
+[[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.98"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c50aef8a904de4c23c788f104b7dddc7d6f79c647c7c8ce4cc8f73eb0ca773dd"
+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 = "typenum"
+version = "1.15.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987"
+
+[[package]]
+name = "unicode-ident"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "15c61ba63f9235225a22310255a29b806b907c9b8c964bcbd0a2c70f3f2deea7"
+
+[[package]]
+name = "unindent"
+version = "0.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "52fee519a3e570f7df377a06a1a7775cdbfb7aa460be7e08de2b1f0e69973a44"
+
+[[package]]
+name = "version_check"
+version = "0.9.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
+
+[[package]]
+name = "wasm-bindgen"
+version = "0.2.75"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b608ecc8f4198fe8680e2ed18eccab5f0cd4caaf3d83516fa5fb2e927fda2586"
+dependencies = [
+ "cfg-if",
+ "wasm-bindgen-macro",
+]
+
+[[package]]
+name = "wasm-bindgen-backend"
+version = "0.2.75"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "580aa3a91a63d23aac5b6b267e2d13cb4f363e31dce6c352fca4752ae12e479f"
+dependencies = [
+ "bumpalo",
+ "lazy_static",
+ "log",
+ "proc-macro2",
+ "quote",
+ "syn",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-futures"
+version = "0.4.25"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "16646b21c3add8e13fdb8f20172f8a28c3dbf62f45406bcff0233188226cfe0c"
+dependencies = [
+ "cfg-if",
+ "js-sys",
+ "wasm-bindgen",
+ "web-sys",
+]
+
+[[package]]
+name = "wasm-bindgen-macro"
+version = "0.2.75"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "171ebf0ed9e1458810dfcb31f2e766ad6b3a89dbda42d8901f2b268277e5f09c"
+dependencies = [
+ "quote",
+ "wasm-bindgen-macro-support",
+]
+
+[[package]]
+name = "wasm-bindgen-macro-support"
+version = "0.2.75"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6c2657dd393f03aa2a659c25c6ae18a13a4048cebd220e147933ea837efc589f"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+ "wasm-bindgen-backend",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-shared"
+version = "0.2.75"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2e0c4a743a309662d45f4ede961d7afa4ba4131a59a639f29b0069c3798bbcc2"
+
+[[package]]
+name = "wasm-bindgen-test"
+version = "0.3.25"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ce783b6c3854292723f498b7bfcf65a782a320b6f1cb3012d08dfbc603fa62f5"
+dependencies = [
+ "console_error_panic_hook",
+ "js-sys",
+ "scoped-tls",
+ "wasm-bindgen",
+ "wasm-bindgen-futures",
+ "wasm-bindgen-test-macro",
+]
+
+[[package]]
+name = "wasm-bindgen-test-macro"
+version = "0.3.25"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3859815cf8435b92f3a34381bef950daffc1403bbb77ef99e35422a7b0abb194"
+dependencies = [
+ "proc-macro2",
+ "quote",
+]
+
+[[package]]
+name = "web-sys"
+version = "0.3.52"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "01c70a82d842c9979078c772d4a1344685045f1a5628f677c2b2eab4dd7d2696"
+dependencies = [
+ "js-sys",
+ "wasm-bindgen",
+]
+
+[[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 = "wyz"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "129e027ad65ce1453680623c3fb5163cbf7107bfe1aa32257e7d0e63f9ced188"
+dependencies = [
+ "tap",
+]
diff --git a/nixpkgs/pkgs/development/python-modules/chia-rs/default.nix b/nixpkgs/pkgs/development/python-modules/chia-rs/default.nix
new file mode 100644
index 000000000000..2df9c16f2a30
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/chia-rs/default.nix
@@ -0,0 +1,49 @@
+{ buildPythonPackage
+, lib
+, fetchFromGitHub
+, pytestCheckHook
+, rustPlatform
+}:
+
+buildPythonPackage rec {
+  pname = "chia-rs";
+  version = "0.1.5";
+
+  src = fetchFromGitHub {
+    owner = "chia-network";
+    repo = "chia_rs";
+    rev = version;
+    sha256 = "sha256-4TIRj7FMIArI/EvDARReC4MqDG44zjn/MKoUHAVqq5s=";
+  };
+
+  cargoDeps = rustPlatform.importCargoLock {
+    lockFile = ./Cargo.lock;
+  };
+
+  postPatch = ''
+    cp ${./Cargo.lock} Cargo.lock
+  '';
+
+  nativeBuildInputs = with rustPlatform; [
+    cargoSetupHook
+    maturinBuildHook
+  ];
+
+  preBuild = ''
+    # avoid ENOENT in maturinBuildHook
+    touch wheel/Cargo.lock
+  '';
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  buildAndTestSubdir = "wheel";
+
+  meta = with lib; {
+    description = "Rust crate & wheel with consensus code";
+    homepage = "https://github.com/Chia-Network/chia_rs/";
+    license = licenses.asl20;
+    maintainers = teams.chia.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/chiabip158/default.nix b/nixpkgs/pkgs/development/python-modules/chiabip158/default.nix
new file mode 100644
index 000000000000..ce4ffd6271fa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/chiabip158/default.nix
@@ -0,0 +1,40 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchPypi
+, cmake
+, pybind11
+, pythonOlder
+, pytestCheckHook
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "chiabip158";
+  version = "1.1";
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-2iQeiQl/CLq2zwo/mUKBwIwV5wlNYUdUfENGNxeDMU8=";
+  };
+
+  nativeBuildInputs = [ cmake setuptools-scm ];
+
+  buildInputs = [ pybind11 ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  # CMake needs to be run by setuptools rather than by its hook
+  dontConfigure = true;
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    description = "Chia's implementation of BIP 158";
+    homepage = "https://www.chia.net/";
+    license = licenses.asl20;
+    maintainers = teams.chia.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/chiapos/default.nix b/nixpkgs/pkgs/development/python-modules/chiapos/default.nix
new file mode 100644
index 000000000000..11452dee2ea5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/chiapos/default.nix
@@ -0,0 +1,57 @@
+{ stdenv
+, lib
+, substituteAll
+, buildPythonPackage
+, fetchPypi
+, catch2
+, cmake
+, cxxopts
+, ghc_filesystem
+, pybind11
+, pytestCheckHook
+, pythonOlder
+, psutil
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "chiapos";
+  version = "1.0.10";
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-2SqWdGzSXs53PafXnCvTGQXNJqD+5gdJnaYi2O2ABLg=";
+  };
+
+  patches = [
+    # prevent CMake from trying to get libraries on the Internet
+    (substituteAll {
+      src = ./dont_fetch_dependencies.patch;
+      inherit cxxopts ghc_filesystem;
+      catch2_src = catch2.src;
+      pybind11_src = pybind11.src;
+    })
+  ];
+
+  nativeBuildInputs = [ cmake setuptools-scm ];
+
+  buildInputs = [ pybind11 ];
+
+  checkInputs = [
+    psutil
+    pytestCheckHook
+  ];
+
+
+  # CMake needs to be run by setuptools rather than by its hook
+  dontConfigure = true;
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    description = "Chia proof of space library";
+    homepage = "https://www.chia.net/";
+    license = licenses.asl20;
+    maintainers = teams.chia.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/chiapos/dont_fetch_dependencies.patch b/nixpkgs/pkgs/development/python-modules/chiapos/dont_fetch_dependencies.patch
new file mode 100644
index 000000000000..05bd212e9a6c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/chiapos/dont_fetch_dependencies.patch
@@ -0,0 +1,41 @@
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 5d7862b..c2d06a1 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -21,23 +21,20 @@ include(${CMAKE_INSTALL_PREFIX}/share/cmake/pybind11/pybind11Config.cmake)
+ else()
+ FetchContent_Declare(
+   pybind11-src
+-  GIT_REPOSITORY https://github.com/pybind/pybind11.git
+-  GIT_TAG        v2.7.1
++  SOURCE_DIR @pybind11_src@
+ )
+ FetchContent_MakeAvailable(pybind11-src)
+ endif()
+ 
+ FetchContent_Declare(
+   cxxopts
+-  GIT_REPOSITORY https://github.com/jarro2783/cxxopts.git
+-  GIT_TAG        v2.2.1
++  SOURCE_DIR @cxxopts@
+ )
+ FetchContent_MakeAvailable(cxxopts)
+ 
+ FetchContent_Declare(
+   gulrak
+-  GIT_REPOSITORY https://github.com/gulrak/filesystem.git
+-  GIT_TAG        v1.5.6
++  SOURCE_DIR @ghc_filesystem@
+ )
+ FetchContent_MakeAvailable(gulrak)
+ 
+@@ -150,8 +147,7 @@ ENDIF()
+ 
+ FetchContent_Declare(
+   Catch2
+-  GIT_REPOSITORY https://github.com/catchorg/Catch2.git
+-  GIT_TAG        v2.13.7
++  SOURCE_DIR     @catch2_src@
+ )
+ FetchContent_MakeAvailable(Catch2)
+ 
diff --git a/nixpkgs/pkgs/development/python-modules/chiavdf/default.nix b/nixpkgs/pkgs/development/python-modules/chiavdf/default.nix
new file mode 100644
index 000000000000..525bd1748846
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/chiavdf/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, setuptools-scm
+, substituteAll
+, cmake
+, boost
+, gmp
+, pybind11
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "chiavdf";
+  version = "1.0.7";
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-956517eGqRSLg+Y4ybmASiZoypgpYn/D9lbPA4Rcfts=";
+  };
+
+  patches = [
+    # prevent CMake from trying to get libraries on the Internet
+    (substituteAll {
+      src = ./dont_fetch_dependencies.patch;
+      pybind11_src = pybind11.src;
+    })
+  ];
+
+  # x86 instructions are needed for this component
+  BUILD_VDF_CLIENT = lib.optionalString (!stdenv.isx86_64) "N";
+
+  nativeBuildInputs = [ cmake setuptools-scm ];
+
+  buildInputs = [ boost gmp pybind11 ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  # CMake needs to be run by setuptools rather than by its hook
+  dontConfigure = true;
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    description = "Chia verifiable delay function utilities";
+    homepage = "https://www.chia.net/";
+    license = licenses.asl20;
+    maintainers = teams.chia.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/chiavdf/dont_fetch_dependencies.patch b/nixpkgs/pkgs/development/python-modules/chiavdf/dont_fetch_dependencies.patch
new file mode 100644
index 000000000000..9b49db81fcf5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/chiavdf/dont_fetch_dependencies.patch
@@ -0,0 +1,14 @@
+diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
+index c975128..a9f6910 100644
+--- a/src/CMakeLists.txt
++++ b/src/CMakeLists.txt
+@@ -31,8 +31,7 @@ include(FetchContent)
+ 
+ FetchContent_Declare(
+   pybind11-src
+-  GIT_REPOSITORY https://github.com/pybind/pybind11.git
+-  GIT_TAG        v2.6.2
++  SOURCE_DIR @pybind11_src@
+ )
+ FetchContent_MakeAvailable(pybind11-src)
+ 
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..c939022a29bb
--- /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 = "source/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..3410789c21cc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/chispa/default.nix
@@ -0,0 +1,27 @@
+{ buildPythonPackage, fetchFromGitHub, lib, poetry-core, pyspark }:
+
+buildPythonPackage rec {
+  pname = "chispa";
+  version = "0.8.3";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    repo = "chispa";
+    owner = "MrPowers";
+    rev = "v${version}";
+    sha256 = "sha256-1ePx8VbU8pMd5EsZhFp6qyMptlUxpoCvJfuDm9xXOdc=";
+  };
+
+  checkInputs = [ pyspark ];
+
+  nativeBuildInputs = [ poetry-core ];
+
+  pythonImportsCheck = [ "chispa" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/MrPowers/chispa";
+    description = "PySpark test helper methods with beautiful error messages";
+    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..2a07a4eb6dce
--- /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;
+    sha256 = "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..275f4cd5c858
--- /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;
+    sha256 = "sha256-H9UMvUAfKa3/7rGLBIniMtFqwadFisa8MW3qtq5TX7A=";
+  };
+
+  checkInputs = [ 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..61e1760f3727
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ci-py/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27
+, pytest, pytest-runner, pytestCheckHook }:
+
+buildPythonPackage rec {
+  version = "1.0.0";
+  pname = "ci-py";
+
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "12ax07n81vxbyayhwzi1q6x7gfmwmvrvwm1n4ii6qa6fqlp9pzj7";
+  };
+
+  nativeBuildInputs = [ pytest-runner ];  # pytest-runner included in setup-requires
+  checkInputs = [ pytest pytestCheckHook ];
+
+  pythonImportsCheck = [ "ci" ];
+
+  meta = with lib; {
+    description = "Library for working with Continuous Integration services";
+    homepage = "https://github.com/grantmcconnaughey/ci.py";
+    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..45d80c26b8b3
--- /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 = "2022.2.11";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "8efe29dab44a7d275702f3160746015bd55c87b2eed85991dd57dda42594e6c6";
+  };
+
+  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; [ superherointj ];
+  };
+}
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..d6c6832debb7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/circuitbreaker/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, mock
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "circuitbreaker";
+  version = "1.4.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "fabfuel";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-l0ASt9CQmgJmWpRrghElbff/gaNOmxNh+Wj0C0p4jE0=";
+  };
+
+  checkInputs = [
+    mock
+    pytestCheckHook
+  ];
+
+  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/cirq-aqt/default.nix b/nixpkgs/pkgs/development/python-modules/cirq-aqt/default.nix
new file mode 100644
index 000000000000..a240ce47d7e5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cirq-aqt/default.nix
@@ -0,0 +1,29 @@
+{ buildPythonPackage
+, cirq-core
+, requests
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "cirq-aqt";
+  inherit (cirq-core) version src meta;
+
+  sourceRoot = "source/${pname}";
+
+  postPatch = ''
+    substituteInPlace requirements.txt \
+      --replace "requests~=2.18" "requests"
+  '';
+
+  propagatedBuildInputs = [
+    cirq-core
+    requests
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  # cirq's importlib hook doesn't work here
+  #pythonImportsCheck = [ "cirq_aqt" ];
+}
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..6684037b3568
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cirq-core/default.nix
@@ -0,0 +1,99 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, fetchpatch
+, 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 = "0.15.0";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "quantumlib";
+    repo = "cirq";
+    rev = "v${version}";
+    sha256 = "sha256-E36zXpv+9WBNYvv/shItS7Q34gYqUyADlqWd+m4Jpps=";
+  };
+
+  sourceRoot = "source/${pname}";
+
+  postPatch = ''
+    substituteInPlace requirements.txt \
+      --replace "matplotlib~=3.0" "matplotlib" \
+      --replace "networkx~=2.4" "networkx" \
+      --replace "numpy~=1.16" "numpy" \
+      --replace "sympy<1.10" "sympy"
+  '';
+
+  propagatedBuildInputs = [
+    duet
+    matplotlib
+    networkx
+    numpy
+    pandas
+    requests
+    scipy
+    sortedcontainers
+    sympy
+    tqdm
+    typing-extensions
+  ] ++ lib.optionals withContribRequires [
+    autoray
+    opt-einsum
+    ply
+    pylatex
+    pyquil
+    quimb
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    pytest-asyncio
+    freezegun
+  ];
+
+  disabledTestPaths = lib.optionals (!withContribRequires) [
+    # requires external (unpackaged) libraries, so untested.
+    "cirq/contrib/"
+  ];
+  disabledTests = [
+    "test_metadata_search_path" # tries to import flynt, which isn't in Nixpkgs
+    "test_benchmark_2q_xeb_fidelities" # fails due pandas MultiIndex. Maybe issue with pandas version in nix?
+  ];
+
+  meta = with lib; {
+    broken = (stdenv.isLinux && stdenv.isAarch64);
+    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 ];
+  };
+}
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..4aa20a237110
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cirq-google/default.nix
@@ -0,0 +1,37 @@
+{ buildPythonPackage
+, cirq-core
+, google-api-core
+, protobuf
+# test inputs
+, pytestCheckHook
+, freezegun
+}:
+
+buildPythonPackage rec {
+  pname = "cirq-google";
+  inherit (cirq-core) version src meta;
+
+  sourceRoot = "source/${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"
+  '';
+
+  propagatedBuildInputs = [
+    cirq-core
+    google-api-core
+    protobuf
+  ];
+
+  checkInputs = [
+    freezegun
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # unittest.mock.InvalidSpecError: Cannot autospec attr 'QuantumEngineServiceClient'
+    "test_get_engine_sampler_explicit_project_id"
+    "test_get_engine_sampler"
+  ];
+}
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..24ced1859580
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cirq-ionq/default.nix
@@ -0,0 +1,29 @@
+{ buildPythonPackage
+, cirq-core
+, requests
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "cirq-ionq";
+  inherit (cirq-core) version src meta;
+
+  sourceRoot = "source/${pname}";
+
+  postPatch = ''
+    substituteInPlace requirements.txt \
+      --replace "requests~=2.18" "requests"
+  '';
+
+  propagatedBuildInputs = [
+    cirq-core
+    requests
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  # cirq's importlib hook doesn't work here
+  #pythonImportsCheck = [ "cirq_ionq" ];
+}
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..0743ee02dc74
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cirq-pasqal/default.nix
@@ -0,0 +1,29 @@
+{ buildPythonPackage
+, cirq-core
+, requests
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "cirq-pasqal";
+  inherit (cirq-core) version src meta;
+
+  sourceRoot = "source/${pname}";
+
+  postPatch = ''
+    substituteInPlace requirements.txt \
+      --replace "requests~=2.18" "requests"
+  '';
+
+  propagatedBuildInputs = [
+    cirq-core
+    requests
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  # cirq's importlib hook doesn't work here
+  #pythonImportsCheck = [ "cirq_pasqal" ];
+}
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..f33ce69fc550
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cirq-rigetti/default.nix
@@ -0,0 +1,80 @@
+{ 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 = "source/${pname}";
+
+  postPatch = ''
+    substituteInPlace requirements.txt \
+      --replace "attrs~=20.3.0" "attrs" \
+      --replace "certifi~=2021.5.30" "certifi" \
+      --replace "h11~=0.9.0" "h11" \
+      --replace "httpcore~=0.11.1" "httpcore" \
+      --replace "httpx~=0.15.5" "httpx" \
+      --replace "idna~=2.10" "idna" \
+      --replace "pyjwt~=1.7.1" "pyjwt" \
+      --replace "qcs-api-client~=0.8.0" "qcs-api-client" \
+      --replace "iso8601~=0.1.14" "iso8601" \
+      --replace "rfc3986~=1.5.0" "rfc3986" \
+      --replace "pyquil~=3.0.0" "pyquil" \
+      --replace "pydantic~=1.8.2" "pydantic"
+    # 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
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  # 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..aa61157fe0d7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cirq-web/default.nix
@@ -0,0 +1,22 @@
+{ buildPythonPackage
+, cirq-core
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "cirq-web";
+  inherit (cirq-core) version src meta;
+
+  sourceRoot = "source/${pname}";
+
+  propagatedBuildInputs = [
+    cirq-core
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  # cirq's importlib hook doesn't work here
+  #pythonImportsCheck = [ "cirq_web" ];
+}
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..0531020a2139
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cirq/default.nix
@@ -0,0 +1,43 @@
+{ buildPythonPackage
+, cirq-aqt
+, cirq-core
+, 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-ionq
+    cirq-google
+    cirq-rigetti
+    cirq-pasqal
+    cirq-web
+  ];
+
+  # pythonImportsCheck = [ "cirq" "cirq.Circuit" ];  # cirq's importlib hook doesn't work here
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  # Don't run submodule or development tool tests
+  disabledTestPaths = [
+    "cirq-aqt"
+    "cirq-core"
+    "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..535c46fc40aa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ciscoconfparse/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, buildPythonPackage
+, dnspython
+, fetchFromGitHub
+, loguru
+, passlib
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+, toml
+}:
+
+buildPythonPackage rec {
+  pname = "ciscoconfparse";
+  version = "1.6.40";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "mpenning";
+    repo = pname;
+    rev = version;
+    hash = "sha256-2j1AlCIwTxIjotZ0fSt1zhsgPfJTqJukZ6KQvh74NJ8=";
+  };
+
+  postPatch = ''
+    patchShebangs tests
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    passlib
+    dnspython
+    loguru
+    toml
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    "tests/parse_test.py"
+  ];
+
+  disabledTests = [
+    # Tests require network access
+    "test_dns_lookup"
+    "test_reverse_dns_lookup"
+  ];
+
+  pythonImportsCheck = [
+    "ciscoconfparse"
+  ];
+
+  meta = with lib; {
+    description = "Parse, Audit, Query, Build, and Modify Cisco IOS-style configurations";
+    homepage = "https://github.com/mpenning/ciscoconfparse";
+    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..e210e974414d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ciso8601/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytz
+, unittest2
+, isPy27
+}:
+
+buildPythonPackage rec {
+  pname = "ciso8601";
+  version = "2.2.0";
+
+  src = fetchFromGitHub {
+    owner = "closeio";
+    repo = "ciso8601";
+    rev = "v${version}";
+    sha256 = "sha256-TqB1tQDgCkXu+QuzP6yBEH/xHxhhD/kGR2S0I8Osc5E=";
+  };
+
+  checkInputs = [
+    pytz
+  ] ++ lib.optional (isPy27) [
+    unittest2
+  ];
+
+  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..b404fa4a5cbd
--- /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 ];
+
+  checkInputs = [ 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..65cd8d1469b4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ckcc-protocol/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, click
+, ecdsa
+, hidapi
+, fetchPypi
+, pyaes
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "ckcc-protocol";
+  version = "1.3.2";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-4y5pe0CFD3C1+N0kP/2j9Wser2zkn8Uf4203ci45Rq0=";
+  };
+
+  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 = [ maintainers.hkjn ];
+  };
+}
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..78457c2da6ce
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/claripy/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, cachetools
+, decorator
+, fetchFromGitHub
+, future
+, nose
+, pysmt
+, pythonOlder
+, pytestCheckHook
+, six
+, z3
+}:
+
+buildPythonPackage rec {
+  pname = "claripy";
+  version = "9.2.14";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "angr";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-802ToJGxwJSFcnl3suQMPNz0/7HnqvqxCpy9u7iU6EE=";
+  };
+
+  propagatedBuildInputs = [
+    cachetools
+    decorator
+    future
+    pysmt
+    z3
+  ];
+
+  checkInputs = [
+    nose
+    pytestCheckHook
+    six
+  ];
+
+  postPatch = ''
+    # Use upstream z3 implementation
+    substituteInPlace setup.cfg \
+      --replace "z3-solver >= 4.8.5.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/classify-imports/default.nix b/nixpkgs/pkgs/development/python-modules/classify-imports/default.nix
new file mode 100644
index 000000000000..3e0245ab58d1
--- /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.1.0";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "asottile";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-w/+Sf2ZVSDmFNPICJfAKzfukcznWyFBhi7hjIELtYGI=";
+  };
+
+  pythonImportsCheck = [
+    "classify_imports"
+  ];
+
+  checkInputs = [
+    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..fc5a6b0e54bc
--- /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 ];
+  checkInputs = [ nose ];
+
+  # gcc doesn't approve of this code, so disable -Werror
+  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..1932856fd956
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cle/default.nix
@@ -0,0 +1,86 @@
+{ lib
+, buildPythonPackage
+, cffi
+, fetchFromGitHub
+, minidump
+, nose
+, pefile
+, pyelftools
+, pytestCheckHook
+, pythonOlder
+, pyvex
+, pyxbe
+, sortedcontainers
+}:
+
+let
+  # The binaries are following the argr projects release cycle
+  version = "9.2.14";
+
+  # Binary files from https://github.com/angr/binaries (only used for testing and only here)
+  binaries = fetchFromGitHub {
+    owner = "angr";
+    repo = "binaries";
+    rev = "v${version}";
+    hash = "sha256-LpYi5Ty6OBcW0zokCliMDhujJ7tPPl1XdPs5ad1tv5s=";
+  };
+
+in
+buildPythonPackage rec {
+  pname = "cle";
+  inherit version;
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "angr";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-ueR5reEmaI9drFMQn/CBHCW7DmsTWWYi1zCNaUQ2y7g=";
+  };
+
+  propagatedBuildInputs = [
+    cffi
+    minidump
+    pefile
+    pyelftools
+    pyvex
+    pyxbe
+    sortedcontainers
+  ];
+
+  checkInputs = [
+    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"
+    # 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/cleo/default.nix b/nixpkgs/pkgs/development/python-modules/cleo/default.nix
new file mode 100644
index 000000000000..e79983b1bb29
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cleo/default.nix
@@ -0,0 +1,28 @@
+{ lib, buildPythonPackage, fetchPypi
+, clikit }:
+
+buildPythonPackage rec {
+  pname = "cleo";
+  version = "0.8.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3d0e22d30117851b45970b6c14aca4ab0b18b1b53c8af57bed13208147e4069f";
+  };
+
+  propagatedBuildInputs = [
+    clikit
+  ];
+
+  # 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/cleo";
+    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..21993af3eb53
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/clevercsv/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, cchardet
+, chardet
+, cleo
+, clikit
+, pandas
+, regex
+, tabview
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "clevercsv";
+  version = "0.7.1";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "alan-turing-institute";
+    repo = "CleverCSV";
+    rev = "v${version}";
+    sha256 = "sha256-ynS3G2ZcEqVlC2d6n5ZQ1Em5lh/dWESj9jEO8C4WzZQ=";
+  };
+
+  propagatedBuildInputs = [
+    cchardet
+    chardet
+    cleo
+    clikit
+    pandas
+    regex
+    tabview
+  ];
+
+  pythonImportsCheck = [
+    "clevercsv"
+    "clevercsv.cparser"
+  ];
+
+  checkPhase = ''
+    # 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
+    ${python.interpreter} -m unittest discover -v -f -s ./tests/test_unit
+  '';
+
+  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/master/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..15f0249fd801
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cli-helpers/default.nix
@@ -0,0 +1,62 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27
+, backports_csv
+, configobj
+, mock
+, pytest
+, tabulate
+, terminaltables
+, wcwidth
+}:
+
+buildPythonPackage rec {
+  pname = "cli_helpers";
+  version = "2.2.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-DMwc/Noaxk3H7YPXATBVzxnll50p5Wwh87aS3gFVWq4=";
+  };
+
+  propagatedBuildInputs = [
+    configobj
+    terminaltables
+    tabulate
+    wcwidth
+  ] ++ (lib.optionals isPy27 [ backports_csv ]);
+
+  # namespace collision between backport.csv and backports.configparser
+  doCheck = !isPy27;
+
+  checkInputs = [ pytest mock ];
+
+  checkPhase = ''
+    py.test
+  '';
+
+  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/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..62e0ed2d3b60
--- /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
+  ];
+
+  checkInputs = [
+    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; [ jtojnar ];
+  };
+}
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..3ed81e598d17
--- /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 ];
+
+  checkInputs = [ 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..b63788c6060c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/click-help-colors/default.nix
@@ -0,0 +1,27 @@
+{ lib, fetchPypi, buildPythonPackage
+, click, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "click-help-colors";
+  version = "0.9.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "78cbcf30cfa81c5fc2a52f49220121e1a8190cd19197d9245997605d3405824d";
+  };
+
+  propagatedBuildInputs = [ click ];
+
+  checkInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "click_help_colors" ];
+
+  meta = with lib; {
+    description = "Colorization of help messages in Click";
+    homepage    = "https://github.com/r-m-n/click-help-colors";
+    license     = licenses.mit;
+    platforms   = platforms.unix;
+    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..c0b8c89ea648
--- /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;
+    sha256 = "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-option-group/default.nix b/nixpkgs/pkgs/development/python-modules/click-option-group/default.nix
new file mode 100644
index 000000000000..cf39ba808452
--- /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.3";
+  format = "setuptools";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "click-contrib";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1w0692s8fabncpggpwl2d4dfqjjlmcia271rrb8hcz0r6nvw98ak";
+  };
+
+  propagatedBuildInputs = [
+    click
+  ];
+
+  checkInputs = [
+    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..31ae00a348df
--- /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
+  ];
+
+  checkInputs = [
+    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..5934adab7a7f
--- /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
+  ];
+
+  checkInputs = [
+    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-spinner/default.nix b/nixpkgs/pkgs/development/python-modules/click-spinner/default.nix
new file mode 100644
index 000000000000..e0d862ab1310
--- /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=";
+  };
+
+  checkInputs = [
+    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; [ jtojnar ];
+  };
+}
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..529ee08e4f8e
--- /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;
+    sha256 = "sha256-rc/mI8AqWVwQfDFAcvZ6Inj+TrQLcsDRoskDzHivNDk=";
+  };
+
+  checkInputs = [ 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..81bcf03130e1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/click/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, importlib-metadata
+, pytestCheckHook
+
+# large-rebuild downstream dependencies and applications
+, flask
+, black
+, magic-wormhole
+, mitmproxy
+}:
+
+buildPythonPackage rec {
+  pname = "click";
+  version = "8.1.3";
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-doLcivswKXABZ0V16gDRgU2AjWo2r0Fagr1IHTe6e44=";
+  };
+
+  propagatedBuildInputs = lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  passthru.tests = {
+    inherit black flask magic-wormhole mitmproxy;
+  };
+
+  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; [ SuperSandro2000 ];
+  };
+}
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..8aeb73bb25b2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/clickclick/default.nix
@@ -0,0 +1,30 @@
+{ lib, buildPythonPackage, fetchFromGitHub, isPy36, 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";
+  };
+
+  checkInputs = [ pytestCheckHook pytest-cov ];
+  propagatedBuildInputs = [ flake8 click pyyaml six ];
+
+  # test_cli asserts on exact quoting style of output
+  disabledTests = [
+    "test_cli"
+  ] ++ lib.optionals isPy36 [
+    "test_choice_default"
+  ];
+
+  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..d0f81a20c6d3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/clickgen/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, pillow
+, libX11
+, libXcursor
+, libpng
+, python
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "clickgen";
+  version = "1.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "ful1e5";
+    repo = "clickgen";
+    rev = "v${version}";
+    sha256 = "sha256-01c8SVy+J004dq5KCUe62w7i/xUTxTfl/IpvUtGQgw0=";
+  };
+
+  buildInputs = [ libXcursor libX11 libpng ];
+
+  propagatedBuildInputs = [ pillow ];
+
+  checkInputs = [ pytestCheckHook ];
+
+  postBuild = ''
+    # Needs to build xcursorgen.so
+    cd src/xcursorgen
+    make
+    cd ../..
+  '';
+
+  postInstall = ''
+    install -m644 src/xcursorgen/xcursorgen.so $out/${python.sitePackages}/clickgen/xcursorgen.so
+    # 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..4e632cb34038
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/clickhouse-cityhash/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "clickhouse-cityhash";
+  version = "1.0.2.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0z8nl0ly2p1h6nygwxs6y40q8y424w40fkjv3jyf8vvcg4h7sdrg";
+  };
+
+  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..4806f965f092
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/clickhouse-cli/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, click
+, prompt-toolkit
+, pygments
+, requests
+, sqlparse
+}:
+
+buildPythonPackage rec {
+  pname = "clickhouse-cli";
+  version = "0.3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-pa3vkIyNblS1LOwBReTqg8JAR2Ii32a2QIHWjau0uZE=";
+  };
+
+  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-driver/default.nix b/nixpkgs/pkgs/development/python-modules/clickhouse-driver/default.nix
new file mode 100644
index 000000000000..826ce08c1e06
--- /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.2";
+
+  # pypi source doesn't contain tests
+  src = fetchFromGitHub {
+    owner = "mymarilyn";
+    repo = "clickhouse-driver";
+    rev = version;
+    sha256 = "0sx4jbadx9frzhqnj8b9w9l508x1r7j7b9883h7xq93lf00rxkfz";
+  };
+
+  propagatedBuildInputs = [
+    setuptools
+    pytz
+    tzlocal
+    clickhouse-cityhash
+    zstd
+    lz4
+  ];
+
+  checkInputs = [
+    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..39c5a497c8d8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cliff/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, autopage
+, cmd2
+, installShellFiles
+, openstackdocstheme
+, pbr
+, prettytable
+, pyparsing
+, pyyaml
+, stevedore
+, sphinx
+, callPackage
+}:
+
+buildPythonPackage rec {
+  pname = "cliff";
+  version = "3.10.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-BFruPzxkRxll161QfOhHSk4vIIFfu1QFp3D4WWoqAKA=";
+  };
+
+  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
+    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..b981e78be0c7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cliff/tests.nix
@@ -0,0 +1,33 @@
+{ buildPythonPackage
+, cliff
+, docutils
+, stestr
+, testscenarios
+}:
+
+buildPythonPackage rec {
+  pname = "cliff";
+  inherit (cliff) version;
+
+  src = cliff.src;
+
+  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;
+
+  checkInputs = [
+    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..9a7be23938c0
--- /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;
+    sha256 = "sha256-eVE8FrD0YHoRreY9CrNb8v4v4KrG83ZU0oFz+V+p+Q0=";
+  };
+
+  propagatedBuildInputs = [
+    h5py
+    numba
+    numpy
+    scipy
+    sparse
+  ];
+
+  checkInputs = [
+    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; [ costrouc ];
+  };
+}
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..7806da7fb162
--- /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;
+    sha256 = "sha256-0f9+I6ozX93Vn0l7+WR0mpddDZymJQ3+Krovt6co22Y=";
+  };
+
+  propagatedBuildInputs = [
+    click
+  ];
+
+  checkInputs = [ pytest glibcLocales ];
+
+  checkPhase = ''
+    LC_ALL=en_US.utf-8 pytest tests
+  '';
+
+  meta = with lib; {
+    description = "Click params for commmand 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..1f6be754be19
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/clikit/default.nix
@@ -0,0 +1,31 @@
+{ lib, buildPythonPackage, fetchPypi
+, isPy27, pythonAtLeast
+, pylev, pastel, typing ? null, enum34 ? null, crashtest }:
+
+buildPythonPackage rec {
+  pname = "clikit";
+  version = "0.6.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0ngdkmb73gkp5y00q7r9k1cdlfn0wyzws2wrqlshc4hlkbdyabj4";
+  };
+
+  propagatedBuildInputs = [
+    pylev pastel
+  ]
+    ++ lib.optionals (pythonAtLeast "3.6") [ crashtest ]
+    ++ lib.optionals isPy27 [ typing enum34 ];
+
+  # 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/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..45733c4ae7f1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/clint/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+, mock
+, blessings
+, nose
+, nose_progressive
+, 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;
+  checkInputs = [ mock nose nose_progressive 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..a0e5dcb7142f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/clintermission/default.nix
@@ -0,0 +1,29 @@
+{ lib, buildPythonApplication, fetchFromGitHub, isPy3k, prompt-toolkit }:
+
+buildPythonApplication rec {
+  pname = "clintermission";
+  version = "0.2.0";
+
+  src = fetchFromGitHub {
+    owner = "sebageek";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "09wl0rpw6c9hab51rs957z64b0v9j4fcbqbn726wnapf4z5w6yxv";
+  };
+
+  propagatedBuildInputs = [ prompt-toolkit ];
+
+  disabled = !isPy3k;
+
+  # repo contains no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "clintermission" ];
+
+  meta = with lib; {
+    description = "Non-fullscreen command-line selection menu";
+    homepage = "https://github.com/sebageek/clintermission";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..1b0caeaaf266
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/clize/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+
+# propagtes
+, sigtools
+, six
+, attrs
+, od
+, docutils
+
+# extras: datetime
+, python-dateutil
+
+# tests
+, pygments
+, unittest2
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "clize";
+  version = "4.2.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3177a028e4169d8865c79af82bdd441b24311d4bd9c0ae8803641882d340a51d";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "docutils ~= 0.17.0" "docutils"
+  '';
+
+  propagatedBuildInputs = [
+    attrs
+    docutils
+    od
+    sigtools
+    six
+  ];
+
+  passthru.optional-dependencies = {
+    datetime = [
+      python-dateutil
+    ];
+  };
+
+  # repeated_test no longer exists in nixpkgs
+  # also see: https://github.com/epsy/clize/issues/74
+  doCheck = false;
+  checkInputs = [
+    pytestCheckHook
+    python-dateutil
+    pygments
+    unittest2
+  ];
+
+  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..697296d9a200
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/clldutils/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, isPy27
+, attrs
+, colorlog
+, csvw
+, python-dateutil
+, tabulate
+, mock
+, postgresql
+, pytestCheckHook
+, pytest-mock
+}:
+
+buildPythonPackage rec {
+  pname = "clldutils";
+  version = "3.9.0";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "clld";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "07ljq7v1zvaxyl6xn4a2p4097lgd5j9bz71lf05y5bz8k024mxbr";
+  };
+
+  patchPhase = ''
+    substituteInPlace setup.cfg --replace "--cov" ""
+  '';
+
+  propagatedBuildInputs = [
+    python-dateutil
+    tabulate
+    colorlog
+    attrs
+    csvw
+  ];
+
+  checkInputs = [
+    mock
+    postgresql
+    pytestCheckHook
+    pytest-mock
+  ];
+
+  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; [ ];
+  };
+}
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..2c657a6bfa30
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cloudflare/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, attrs
+, beautifulsoup4
+, requests
+, future
+, pyyaml
+, jsonlines
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "cloudflare";
+  version = "2.9.12";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-w+ciURz9sJcWmhhjJfvoorFYUBFp0PaLZ55zb2sMwDA=";
+  };
+
+  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";
+    license = licenses.mit;
+    maintainers = with maintainers; [ costrouc ];
+  };
+}
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..d33f4dbee358
--- /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.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-uyM+h2pYSR2VkKZ2+Tx6VHOgj3R9Wrnff5zlZLPnk44=";
+  };
+
+  checkInputs = [
+    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..6f693f369cda
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cloudscraper/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, requests
+, requests-toolbelt
+, pyparsing
+}:
+
+buildPythonPackage rec {
+  pname = "cloudscraper";
+  version = "1.2.60";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-DTQTsv/59895UTsMmqxYtSfFosUWPRx8wMT4zKHQ9Oc=";
+  };
+
+  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";
+    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..1d5a2047a7c3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cloudsmith-api/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, certifi
+, six
+, python-dateutil
+, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "cloudsmith-api";
+  version = "1.61.3";
+
+  format = "wheel";
+
+  src = fetchPypi {
+    pname = "cloudsmith_api";
+    inherit format version;
+    sha256 = "sha256-Y8CnbX9rhtk8sebJKo5kyqFwCkJgBjz3dgm58VHRPhY=";
+  };
+
+  propagatedBuildInputs = [
+    certifi
+    six
+    python-dateutil
+    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; [ jtojnar ];
+  };
+}
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..20d822d8ee77
--- /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.5.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "salesforce";
+    repo = pname;
+    rev = version;
+    hash = "sha256-HdZHRK/Q544z9ySbjNIjqiXzel0UTsnb9tuXawbkwZg=";
+  };
+
+  propagatedBuildInputs = [
+    boto3
+    botocore
+    cached-property
+    click
+    click-option-group
+    jinja2
+    markdown
+    policy-sentry
+    pyyaml
+    schema
+  ];
+
+  checkInputs = [
+    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..c4b4de4832ab
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cloup/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, click
+, setuptools-scm
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "cloup";
+  version = "0.15.1";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-gAi0gKd9ihEseHAvZGda299Z+tw545HzuovKycTUzYY=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    click
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "cloup" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/janLuke/cloup";
+    description = "Click extended with option groups, constraints, aliases, help themes";
+    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/clustershell/default.nix b/nixpkgs/pkgs/development/python-modules/clustershell/default.nix
new file mode 100644
index 000000000000..890c20b0d25a
--- /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.8.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ff6fba688a06e5e577315d899f0dab3f4fe479cef99d444a4e651af577b7d081";
+  };
+
+  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 ];
+
+  checkInputs = [
+    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.isLinux && stdenv.isAarch64) || 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/clvm-rs/default.nix b/nixpkgs/pkgs/development/python-modules/clvm-rs/default.nix
new file mode 100644
index 000000000000..7ea85e41476e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/clvm-rs/default.nix
@@ -0,0 +1,52 @@
+{ stdenv
+, lib
+, fetchFromGitHub
+, buildPythonPackage
+, rustPlatform
+, pythonOlder
+, openssl
+, perl
+, pkgs
+}:
+
+buildPythonPackage rec {
+  pname = "clvm_rs";
+  version = "0.1.19";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Chia-Network";
+    repo = "clvm_rs";
+    rev = version;
+    sha256 = "sha256-mCKY/PqNOUTaRsFDxQBvbTD6wC4qzP0uv5FldYkwl6c=";
+  };
+
+  cargoDeps = rustPlatform.fetchCargoTarball {
+    inherit src;
+    name = "${pname}-${version}";
+    sha256 = "sha256-TmrR8EeySsGWXohMdo3dCX4oT3l9uLVv5TUeRxCBQeE=";
+  };
+
+  format = "pyproject";
+
+  buildAndTestSubdir = "wheel";
+
+  nativeBuildInputs = [
+    perl # used by openssl-sys to configure
+  ] ++ (with rustPlatform; [
+    cargoSetupHook
+    maturinBuildHook
+  ]);
+
+  buildInputs = [ openssl ];
+
+  pythonImportsCheck = [ "clvm_rs" ];
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    homepage = "https://chialisp.com/";
+    description = "Rust implementation of clvm";
+    license = licenses.asl20;
+    maintainers = teams.chia.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/clvm-tools-rs/default.nix b/nixpkgs/pkgs/development/python-modules/clvm-tools-rs/default.nix
new file mode 100644
index 000000000000..3d88084169a1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/clvm-tools-rs/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, rustPlatform
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "clvm-tools-rs";
+  version = "0.1.19";
+  disabled = pythonOlder "3.7";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "Chia-Network";
+    repo = "clvm_tools_rs";
+    rev = version;
+    sha256 = "sha256-LQbFBZBLUAjyqIAWIn+N8tUrBMskRoKvMMg5gfTyVU8=";
+  };
+
+  cargoDeps = rustPlatform.fetchCargoTarball {
+    inherit src;
+    name = "${pname}-${version}";
+    sha256 = "sha256-LcDWpMM+PUElsXO82H6QVOp338+NduC/j3pXQKSni3I=";
+  };
+
+  nativeBuildInputs = with rustPlatform; [
+    cargoSetupHook
+    maturinBuildHook
+  ];
+
+  pythonImportsCheck = [ "clvm_tools_rs" ];
+
+  meta = with lib; {
+    homepage = "https://chialisp.com/";
+    description = "Rust port of clvm_tools";
+    license = licenses.asl20;
+    maintainers = teams.chia.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/clvm-tools/default.nix b/nixpkgs/pkgs/development/python-modules/clvm-tools/default.nix
new file mode 100644
index 000000000000..188330998734
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/clvm-tools/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, clvm
+, setuptools-scm
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "clvm_tools";
+  version = "0.4.4";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Chia-Network";
+    repo = "clvm_tools";
+    rev = version;
+    sha256 = "sha256-Fv7NTUEjbEDALyc+WLDQ7yJOdODZCwLobN+vUvaBWMY=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    clvm
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "clvm_tools"
+  ];
+
+  disabledTests = [
+    "test_cmd_unknown-1_txt"
+  ];
+
+  # give a hint to setuptools-scm on package version
+  SETUPTOOLS_SCM_PRETEND_VERSION="v${version}";
+
+  meta = with lib; {
+    description = "Tools for clvm development";
+    homepage = "https://www.chialisp.com/";
+    license = licenses.asl20;
+    maintainers = teams.chia.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/clvm/default.nix b/nixpkgs/pkgs/development/python-modules/clvm/default.nix
new file mode 100644
index 000000000000..2853bfe53182
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/clvm/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, blspy
+, setuptools-scm
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "clvm";
+  version = "0.9.7";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Chia-Network";
+    repo = "clvm";
+    rev = version;
+    sha256 = "sha256-kTmuiy0IbTGjDokZjxp3p8lr/0uVxG/0pRN2hETLBtA=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  # give a hint to setuptools-scm on package version
+  SETUPTOOLS_SCM_PRETEND_VERSION = "v${version}";
+
+  propagatedBuildInputs = [
+    blspy
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # all tests in this file have a circular dependency on clvm-tools
+    "tests/cmds_test.py"
+  ];
+
+  pythonImportsCheck = [
+    "clvm"
+  ];
+
+  meta = with lib; {
+    description = "Chia Lisp virtual machine";
+    homepage = "https://www.chia.net/";
+    license = licenses.asl20;
+    maintainers = teams.chia.members;
+  };
+}
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..a6e3d442675f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cma/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, numpy
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "cma";
+  version = "3.2.2";
+
+  src = fetchFromGitHub {
+    owner = "CMA-ES";
+    repo = "pycma";
+    rev = "refs/tags/r${version}";
+    sha256 = "sha256-STF7jtLqI2KiWvvI9/reRjP1XyW8l4/qy9uAPpE9mTs=";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  checkPhase = ''
+    ${python.executable} -m cma.test
+  '';
+
+  meta = with lib; {
+    description = "CMA-ES, Covariance Matrix Adaptation Evolution Strategy for non-linear numerical optimization in Python";
+    homepage = "https://github.com/CMA-ES/pycma";
+    license = licenses.bsd3;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..d609508822e4
--- /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 = "0.8.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-/oWbDpjSIrS0WAIgB9qsJ1fpcPBnHUXlXQGTHBtLs8s=";
+  };
+
+  propagatedNativeBuildInputs = [
+    cffi
+  ];
+
+  propagatedBuildInputs = [
+    cffi
+  ];
+
+  checkInputs = [
+    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/default.nix b/nixpkgs/pkgs/development/python-modules/cmd2/default.nix
new file mode 100644
index 000000000000..ada33a8594ef
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cmd2/default.nix
@@ -0,0 +1,78 @@
+{ 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.2";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-Bz5VXAWFOw9pZfPQMym6vfnjil8s6gKOYaZM1+63StU=";
+  };
+
+  LC_ALL = "en_US.UTF-8";
+
+  buildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    attrs
+    colorama
+    pyperclip
+    wcwidth
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    typing-extensions
+    importlib-metadata
+  ];
+
+  checkInputs = [
+    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";
+    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/cmigemo/default.nix b/nixpkgs/pkgs/development/python-modules/cmigemo/default.nix
new file mode 100644
index 000000000000..7c88449b6c18
--- /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
+  '';
+
+  checkInputs = [ 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/Cargo.lock b/nixpkgs/pkgs/development/python-modules/cmsis-pack-manager/Cargo.lock
new file mode 100644
index 000000000000..2d6cb8fd9934
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cmsis-pack-manager/Cargo.lock
@@ -0,0 +1,2047 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 3
+
+[[package]]
+name = "addr2line"
+version = "0.17.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b9ecd88a8c8378ca913a680cd98f0f13ac67383d35993f86c90a70e3f137816b"
+dependencies = [
+ "gimli",
+]
+
+[[package]]
+name = "adler"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
+
+[[package]]
+name = "ansi_term"
+version = "0.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2"
+dependencies = [
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "app_dirs"
+version = "1.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e73a24bad9bd6a94d6395382a6c69fe071708ae4409f763c5475e14ee896313d"
+dependencies = [
+ "ole32-sys",
+ "shell32-sys",
+ "winapi 0.2.8",
+ "xdg",
+]
+
+[[package]]
+name = "atty"
+version = "0.2.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8"
+dependencies = [
+ "hermit-abi",
+ "libc",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "autocfg"
+version = "0.1.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0dde43e75fd43e8a1bf86103336bc699aa8d17ad1be60c76c0bdfd4828e19b78"
+dependencies = [
+ "autocfg 1.1.0",
+]
+
+[[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.66"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cab84319d616cfb654d03394f38ab7e6f0919e181b1b57e1fd15e7fb4077d9a7"
+dependencies = [
+ "addr2line",
+ "cc",
+ "cfg-if 1.0.0",
+ "libc",
+ "miniz_oxide",
+ "object",
+ "rustc-demangle",
+]
+
+[[package]]
+name = "base-x"
+version = "0.2.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4cbbc9d0964165b47557570cce6c952866c2678457aca742aafc9fb771d30270"
+
+[[package]]
+name = "base64"
+version = "0.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e"
+dependencies = [
+ "byteorder",
+]
+
+[[package]]
+name = "bitflags"
+version = "1.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
+
+[[package]]
+name = "bumpalo"
+version = "3.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "37ccbd214614c6783386c1af30caf03192f17891059cecc394b4fb119e363de3"
+
+[[package]]
+name = "byteorder"
+version = "1.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610"
+
+[[package]]
+name = "bytes"
+version = "0.4.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "206fdffcfa2df7cbe15601ef46c813fce0965eb3286db6b56c583b814b51c81c"
+dependencies = [
+ "byteorder",
+ "either",
+ "iovec",
+]
+
+[[package]]
+name = "cc"
+version = "1.0.73"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11"
+
+[[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.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73"
+dependencies = [
+ "libc",
+ "num-integer",
+ "num-traits",
+ "time 0.1.44",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "clap"
+version = "2.34.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c"
+dependencies = [
+ "ansi_term",
+ "atty",
+ "bitflags",
+ "strsim",
+ "textwrap",
+ "unicode-width",
+ "vec_map",
+]
+
+[[package]]
+name = "cloudabi"
+version = "0.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f"
+dependencies = [
+ "bitflags",
+]
+
+[[package]]
+name = "cmsis-cffi"
+version = "0.3.0"
+dependencies = [
+ "cmsis-pack",
+ "ctor",
+ "failure",
+ "log",
+ "simplelog",
+]
+
+[[package]]
+name = "cmsis-cli"
+version = "0.3.0"
+dependencies = [
+ "app_dirs",
+ "clap",
+ "cmsis-pack",
+ "failure",
+ "log",
+ "pbr",
+ "simplelog",
+]
+
+[[package]]
+name = "cmsis-pack"
+version = "0.3.0"
+dependencies = [
+ "failure",
+ "futures",
+ "log",
+ "minidom",
+ "quick-xml",
+ "reqwest",
+ "rustc-demangle",
+ "serde",
+ "serde_derive",
+ "serde_json",
+ "time 0.2.27",
+ "tokio-core",
+]
+
+[[package]]
+name = "const_fn"
+version = "0.4.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fbdcdcb6d86f71c5e97409ad45898af11cbc995b4ee8112d59095a28d376c935"
+
+[[package]]
+name = "cookie"
+version = "0.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "888604f00b3db336d2af898ec3c1d5d0ddf5e6d462220f2ededc33a87ac4bbd5"
+dependencies = [
+ "time 0.1.44",
+ "url 1.7.2",
+]
+
+[[package]]
+name = "cookie_store"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "46750b3f362965f197996c4448e4a0935e791bf7d6631bfce9ee0af3d24c919c"
+dependencies = [
+ "cookie",
+ "failure",
+ "idna 0.1.5",
+ "log",
+ "publicsuffix",
+ "serde",
+ "serde_json",
+ "time 0.1.44",
+ "try_from",
+ "url 1.7.2",
+]
+
+[[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 = "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 0.8.11",
+]
+
+[[package]]
+name = "crossbeam-deque"
+version = "0.7.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c20ff29ded3204c5106278a81a38f4b482636ed4fa1e6cfbeef193291beb29ed"
+dependencies = [
+ "crossbeam-epoch",
+ "crossbeam-utils 0.7.2",
+ "maybe-uninit",
+]
+
+[[package]]
+name = "crossbeam-epoch"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "058ed274caafc1f60c4997b5fc07bf7dc7cca454af7c6e81edffe5f33f70dace"
+dependencies = [
+ "autocfg 1.1.0",
+ "cfg-if 0.1.10",
+ "crossbeam-utils 0.7.2",
+ "lazy_static",
+ "maybe-uninit",
+ "memoffset",
+ "scopeguard",
+]
+
+[[package]]
+name = "crossbeam-queue"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "774ba60a54c213d409d5353bda12d49cd68d14e45036a285234c8d6f91f92570"
+dependencies = [
+ "cfg-if 0.1.10",
+ "crossbeam-utils 0.7.2",
+ "maybe-uninit",
+]
+
+[[package]]
+name = "crossbeam-utils"
+version = "0.7.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8"
+dependencies = [
+ "autocfg 1.1.0",
+ "cfg-if 0.1.10",
+ "lazy_static",
+]
+
+[[package]]
+name = "crossbeam-utils"
+version = "0.8.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "51887d4adc7b564537b15adcfb307936f8075dfcd5f00dde9a9f1d29383682bc"
+dependencies = [
+ "cfg-if 1.0.0",
+ "once_cell",
+]
+
+[[package]]
+name = "ct-logs"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4d3686f5fa27dbc1d76c751300376e167c5a43387f44bb451fd1c24776e49113"
+dependencies = [
+ "sct",
+]
+
+[[package]]
+name = "ctor"
+version = "0.1.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f877be4f7c9f246b183111634f75baa039715e3f46ce860677d3b19a69fb229c"
+dependencies = [
+ "quote",
+ "syn",
+]
+
+[[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 0.3.9",
+]
+
+[[package]]
+name = "discard"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "212d0f5754cb6769937f4501cc0e67f4f4483c8d2c3e1e922ee9edbe4ab4c7c0"
+
+[[package]]
+name = "dtoa"
+version = "0.4.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "56899898ce76aaf4a0f24d914c97ea6ed976d42fec6ad33fcbb0a1103e07b2b0"
+
+[[package]]
+name = "either"
+version = "1.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3f107b87b6afc2a64fd13cac55fe06d6c8859f12d4b14cbcdd2c67d0976781be"
+
+[[package]]
+name = "encoding_rs"
+version = "0.8.31"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9852635589dc9f9ea1b6fe9f05b50ef208c85c834a562f0c6abb1c475736ec2b"
+dependencies = [
+ "cfg-if 1.0.0",
+]
+
+[[package]]
+name = "failure"
+version = "0.1.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d32e9bd16cc02eae7db7ef620b392808b89f6a5e16bb3497d159c6b92a0f4f86"
+dependencies = [
+ "backtrace",
+ "failure_derive",
+]
+
+[[package]]
+name = "failure_derive"
+version = "0.1.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aa4da3c766cd7a0db8242e326e9e4e081edd567072893ed320008189715366a4"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+ "synstructure",
+]
+
+[[package]]
+name = "flate2"
+version = "1.0.24"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f82b0f4c27ad9f8bfd1f3208d882da2b09c301bc1c828fd3a00d0216d2fbbff6"
+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.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191"
+dependencies = [
+ "matches",
+ "percent-encoding 2.1.0",
+]
+
+[[package]]
+name = "fuchsia-cprng"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba"
+
+[[package]]
+name = "fuchsia-zircon"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82"
+dependencies = [
+ "bitflags",
+ "fuchsia-zircon-sys",
+]
+
+[[package]]
+name = "fuchsia-zircon-sys"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7"
+
+[[package]]
+name = "futures"
+version = "0.1.31"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3a471a38ef8ed83cd6e40aa59c1ffe17db6855c18e3604d9c4ed8c08ebc28678"
+
+[[package]]
+name = "futures-cpupool"
+version = "0.1.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4"
+dependencies = [
+ "futures",
+ "num_cpus",
+]
+
+[[package]]
+name = "getrandom"
+version = "0.2.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4eb1a864a501629691edf6c15a593b7a51eebaa1e8468e9ddc623de7c9b58ec6"
+dependencies = [
+ "cfg-if 1.0.0",
+ "libc",
+ "wasi 0.11.0+wasi-snapshot-preview1",
+]
+
+[[package]]
+name = "gimli"
+version = "0.26.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "22030e2c5a68ec659fde1e949a745124b48e6fa8b045b7ed5bd1fe4ccc5c4e5d"
+
+[[package]]
+name = "h2"
+version = "0.1.26"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a5b34c246847f938a410a03c5458c7fee2274436675e76d8b903c08efc29c462"
+dependencies = [
+ "byteorder",
+ "bytes",
+ "fnv",
+ "futures",
+ "http",
+ "indexmap",
+ "log",
+ "slab",
+ "string",
+ "tokio-io",
+]
+
+[[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 = "http"
+version = "0.1.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d6ccf5ede3a895d8856620237b2f02972c1bbc78d2965ad7fe8838d4a0ed41f0"
+dependencies = [
+ "bytes",
+ "fnv",
+ "itoa 0.4.8",
+]
+
+[[package]]
+name = "http-body"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6741c859c1b2463a423a1dbce98d418e6c3c3fc720fb0d45528657320920292d"
+dependencies = [
+ "bytes",
+ "futures",
+ "http",
+ "tokio-buf",
+]
+
+[[package]]
+name = "httparse"
+version = "1.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "496ce29bb5a52785b44e0f7ca2847ae0bb839c9bd28f69acac9b99d461c0c04c"
+
+[[package]]
+name = "hyper"
+version = "0.12.36"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c843caf6296fc1f93444735205af9ed4e109a539005abb2564ae1d6fad34c52"
+dependencies = [
+ "bytes",
+ "futures",
+ "futures-cpupool",
+ "h2",
+ "http",
+ "http-body",
+ "httparse",
+ "iovec",
+ "itoa 0.4.8",
+ "log",
+ "net2",
+ "rustc_version",
+ "time 0.1.44",
+ "tokio",
+ "tokio-buf",
+ "tokio-executor",
+ "tokio-io",
+ "tokio-reactor",
+ "tokio-tcp",
+ "tokio-threadpool",
+ "tokio-timer",
+ "want",
+]
+
+[[package]]
+name = "hyper-rustls"
+version = "0.17.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "719d85c7df4a7f309a77d145340a063ea929dcb2e025bae46a80345cffec2952"
+dependencies = [
+ "bytes",
+ "ct-logs",
+ "futures",
+ "hyper",
+ "rustls",
+ "tokio-io",
+ "tokio-rustls",
+ "webpki",
+ "webpki-roots",
+]
+
+[[package]]
+name = "idna"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e"
+dependencies = [
+ "matches",
+ "unicode-bidi",
+ "unicode-normalization",
+]
+
+[[package]]
+name = "idna"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8"
+dependencies = [
+ "matches",
+ "unicode-bidi",
+ "unicode-normalization",
+]
+
+[[package]]
+name = "indexmap"
+version = "1.9.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "10a35a97730320ffe8e2d410b5d3b69279b98d2c14bdb8b70ea89ecf7888d41e"
+dependencies = [
+ "autocfg 1.1.0",
+ "hashbrown",
+]
+
+[[package]]
+name = "iovec"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "itoa"
+version = "0.4.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4"
+
+[[package]]
+name = "itoa"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "112c678d4050afce233f4f2852bb2eb519230b3cf12f33585275537d7e41578d"
+
+[[package]]
+name = "js-sys"
+version = "0.3.59"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "258451ab10b34f8af53416d1fdab72c22e805f0c92a1136d59470ec0b11138b2"
+dependencies = [
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "kernel32-sys"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d"
+dependencies = [
+ "winapi 0.2.8",
+ "winapi-build",
+]
+
+[[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.126"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836"
+
+[[package]]
+name = "lock_api"
+version = "0.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c4da24a77a3d8a6d4862d95f72e6fdb9c09a643ecdb402d754004a557f2bec75"
+dependencies = [
+ "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 = "matches"
+version = "0.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f"
+
+[[package]]
+name = "maybe-uninit"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00"
+
+[[package]]
+name = "memchr"
+version = "2.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
+
+[[package]]
+name = "memoffset"
+version = "0.5.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "043175f069eda7b85febe4a74abbaeff828d9f8b448515d3151a14a3542811aa"
+dependencies = [
+ "autocfg 1.1.0",
+]
+
+[[package]]
+name = "mime"
+version = "0.3.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d"
+
+[[package]]
+name = "mime_guess"
+version = "2.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef"
+dependencies = [
+ "mime",
+ "unicase",
+]
+
+[[package]]
+name = "minidom"
+version = "0.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fe549115a674f5ec64c754d85e37d6f42664bd0ef4ffb62b619489ad99c6cb1a"
+dependencies = [
+ "quick-xml",
+]
+
+[[package]]
+name = "miniz_oxide"
+version = "0.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6f5c75688da582b8ffc1f1799e9db273f32133c49e048f614d22ec3256773ccc"
+dependencies = [
+ "adler",
+]
+
+[[package]]
+name = "mio"
+version = "0.6.23"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4afd66f5b91bf2a3bc13fad0e21caedac168ca4c707504e75585648ae80e4cc4"
+dependencies = [
+ "cfg-if 0.1.10",
+ "fuchsia-zircon",
+ "fuchsia-zircon-sys",
+ "iovec",
+ "kernel32-sys",
+ "libc",
+ "log",
+ "miow",
+ "net2",
+ "slab",
+ "winapi 0.2.8",
+]
+
+[[package]]
+name = "mio-uds"
+version = "0.6.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "afcb699eb26d4332647cc848492bbc15eafb26f08d0304550d5aa1f612e066f0"
+dependencies = [
+ "iovec",
+ "libc",
+ "mio",
+]
+
+[[package]]
+name = "miow"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ebd808424166322d4a38da87083bfddd3ac4c131334ed55856112eb06d46944d"
+dependencies = [
+ "kernel32-sys",
+ "net2",
+ "winapi 0.2.8",
+ "ws2_32-sys",
+]
+
+[[package]]
+name = "net2"
+version = "0.2.37"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "391630d12b68002ae1e25e8f974306474966550ad82dac6886fb8910c19568ae"
+dependencies = [
+ "cfg-if 0.1.10",
+ "libc",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "num-integer"
+version = "0.1.45"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9"
+dependencies = [
+ "autocfg 1.1.0",
+ "num-traits",
+]
+
+[[package]]
+name = "num-traits"
+version = "0.2.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd"
+dependencies = [
+ "autocfg 1.1.0",
+]
+
+[[package]]
+name = "num_cpus"
+version = "1.13.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1"
+dependencies = [
+ "hermit-abi",
+ "libc",
+]
+
+[[package]]
+name = "object"
+version = "0.29.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "21158b2c33aa6d4561f1c0a6ea283ca92bc54802a93b263e910746d679a7eb53"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "ole32-sys"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5d2c49021782e5233cd243168edfa8037574afed4eba4bbaf538b3d8d1789d8c"
+dependencies = [
+ "winapi 0.2.8",
+ "winapi-build",
+]
+
+[[package]]
+name = "once_cell"
+version = "1.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "18a6dbe30758c9f83eb00cbea4ac95966305f5a7772f3f42ebfc7fc7eddbd8e1"
+
+[[package]]
+name = "parking_lot"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f842b1982eb6c2fe34036a4fbfb06dd185a3f5c8edfaacdf7d1ea10b07de6252"
+dependencies = [
+ "lock_api",
+ "parking_lot_core",
+ "rustc_version",
+]
+
+[[package]]
+name = "parking_lot_core"
+version = "0.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b876b1b9e7ac6e1a74a6da34d25c42e17e8862aa409cbbbdcfc8d86c6f3bc62b"
+dependencies = [
+ "cfg-if 0.1.10",
+ "cloudabi",
+ "libc",
+ "redox_syscall 0.1.57",
+ "rustc_version",
+ "smallvec",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "pbr"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ff5751d87f7c00ae6403eb1fcbba229b9c76c9a30de8c1cf87182177b168cea2"
+dependencies = [
+ "crossbeam-channel",
+ "libc",
+ "time 0.1.44",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "percent-encoding"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831"
+
+[[package]]
+name = "percent-encoding"
+version = "2.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e"
+
+[[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.42"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c278e965f1d8cf32d6e0e96de3d3e79712178ae67986d9cf9151f51e95aac89b"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "publicsuffix"
+version = "1.5.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "95b4ce31ff0a27d93c8de1849cf58162283752f065a90d508f1105fa6c9a213f"
+dependencies = [
+ "idna 0.2.3",
+ "url 2.2.2",
+]
+
+[[package]]
+name = "quick-xml"
+version = "0.17.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fe1e430bdcf30c9fdc25053b9c459bb1a4672af4617b6c783d7d91dc17c6bbb0"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3bcdf212e9776fbcb2d23ab029360416bb1706b1aea2d1a5ba002727cbcab804"
+dependencies = [
+ "proc-macro2",
+]
+
+[[package]]
+name = "rand"
+version = "0.6.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca"
+dependencies = [
+ "autocfg 0.1.8",
+ "libc",
+ "rand_chacha",
+ "rand_core 0.4.2",
+ "rand_hc",
+ "rand_isaac",
+ "rand_jitter",
+ "rand_os",
+ "rand_pcg",
+ "rand_xorshift",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "rand_chacha"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef"
+dependencies = [
+ "autocfg 0.1.8",
+ "rand_core 0.3.1",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b"
+dependencies = [
+ "rand_core 0.4.2",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc"
+
+[[package]]
+name = "rand_hc"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4"
+dependencies = [
+ "rand_core 0.3.1",
+]
+
+[[package]]
+name = "rand_isaac"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08"
+dependencies = [
+ "rand_core 0.3.1",
+]
+
+[[package]]
+name = "rand_jitter"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1166d5c91dc97b88d1decc3285bb0a99ed84b05cfd0bc2341bdf2d43fc41e39b"
+dependencies = [
+ "libc",
+ "rand_core 0.4.2",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "rand_os"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071"
+dependencies = [
+ "cloudabi",
+ "fuchsia-cprng",
+ "libc",
+ "rand_core 0.4.2",
+ "rdrand",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "rand_pcg"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44"
+dependencies = [
+ "autocfg 0.1.8",
+ "rand_core 0.4.2",
+]
+
+[[package]]
+name = "rand_xorshift"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c"
+dependencies = [
+ "rand_core 0.3.1",
+]
+
+[[package]]
+name = "rdrand"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2"
+dependencies = [
+ "rand_core 0.3.1",
+]
+
+[[package]]
+name = "redox_syscall"
+version = "0.1.57"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce"
+
+[[package]]
+name = "redox_syscall"
+version = "0.2.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "534cfe58d6a18cc17120fbf4635d53d14691c1fe4d951064df9bd326178d7d5a"
+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.15",
+ "thiserror",
+]
+
+[[package]]
+name = "reqwest"
+version = "0.9.24"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f88643aea3c1343c804950d7bf983bd2067f5ab59db6d613a08e05572f2714ab"
+dependencies = [
+ "base64",
+ "bytes",
+ "cookie",
+ "cookie_store",
+ "encoding_rs",
+ "flate2",
+ "futures",
+ "http",
+ "hyper",
+ "hyper-rustls",
+ "log",
+ "mime",
+ "mime_guess",
+ "rustls",
+ "serde",
+ "serde_json",
+ "serde_urlencoded",
+ "time 0.1.44",
+ "tokio",
+ "tokio-executor",
+ "tokio-io",
+ "tokio-rustls",
+ "tokio-threadpool",
+ "tokio-timer",
+ "url 1.7.2",
+ "uuid",
+ "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 0.3.9",
+]
+
+[[package]]
+name = "rustc-demangle"
+version = "0.1.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342"
+
+[[package]]
+name = "rustc_version"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a"
+dependencies = [
+ "semver",
+]
+
+[[package]]
+name = "rustls"
+version = "0.16.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b25a18b1bf7387f0145e7f8324e700805aade3842dd3db2e74e4cdeb4677c09e"
+dependencies = [
+ "base64",
+ "log",
+ "ring",
+ "sct",
+ "webpki",
+]
+
+[[package]]
+name = "ryu"
+version = "1.0.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f3f6f92acf49d1b98f7a81226834412ada05458b7364277387724a237f062695"
+
+[[package]]
+name = "scoped-tls"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "332ffa32bf586782a3efaeb58f127980944bbc8c4d6913a86107ac2a5ab24b28"
+
+[[package]]
+name = "scopeguard"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
+
+[[package]]
+name = "sct"
+version = "0.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b362b83898e0e69f38515b82ee15aa80636befe47c3b6d3d89a911e78fc228ce"
+dependencies = [
+ "ring",
+ "untrusted",
+]
+
+[[package]]
+name = "semver"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403"
+dependencies = [
+ "semver-parser",
+]
+
+[[package]]
+name = "semver-parser"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
+
+[[package]]
+name = "serde"
+version = "1.0.140"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fc855a42c7967b7c369eb5860f7164ef1f6f81c20c7cc1141f2a604e18723b03"
+dependencies = [
+ "serde_derive",
+]
+
+[[package]]
+name = "serde_derive"
+version = "1.0.140"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6f2122636b9fe3b81f1cb25099fcf2d3f542cdb1d45940d56c713158884a05da"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "serde_json"
+version = "1.0.82"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "82c2c1fdcd807d1098552c5b9a36e425e42e9fbd7c6a37a8425f390f781f7fa7"
+dependencies = [
+ "itoa 1.0.2",
+ "ryu",
+ "serde",
+]
+
+[[package]]
+name = "serde_urlencoded"
+version = "0.5.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "642dd69105886af2efd227f75a520ec9b44a820d65bc133a9131f7d229fd165a"
+dependencies = [
+ "dtoa",
+ "itoa 0.4.8",
+ "serde",
+ "url 1.7.2",
+]
+
+[[package]]
+name = "sha1"
+version = "0.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c1da05c97445caa12d05e848c4a4fcbbea29e748ac28f7e80e9b010392063770"
+dependencies = [
+ "sha1_smol",
+]
+
+[[package]]
+name = "sha1_smol"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ae1a47186c03a32177042e55dbc5fd5aee900b8e0069a8d70fba96a9375cd012"
+
+[[package]]
+name = "shell32-sys"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9ee04b46101f57121c9da2b151988283b6beb79b34f5bb29a58ee48cb695122c"
+dependencies = [
+ "winapi 0.2.8",
+ "winapi-build",
+]
+
+[[package]]
+name = "simplelog"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2b2736f58087298a448859961d3f4a0850b832e72619d75adc69da7993c2cd3c"
+dependencies = [
+ "chrono",
+ "log",
+ "termcolor",
+]
+
+[[package]]
+name = "slab"
+version = "0.4.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef"
+dependencies = [
+ "autocfg 1.1.0",
+]
+
+[[package]]
+name = "smallvec"
+version = "0.6.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b97fcaeba89edba30f044a10c6a3cc39df9c3f17d7cd829dd1446cab35f890e0"
+dependencies = [
+ "maybe-uninit",
+]
+
+[[package]]
+name = "spin"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d"
+
+[[package]]
+name = "standback"
+version = "0.2.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e113fb6f3de07a243d434a56ec6f186dfd51cb08448239fe7bcae73f87ff28ff"
+dependencies = [
+ "version_check",
+]
+
+[[package]]
+name = "stdweb"
+version = "0.4.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d022496b16281348b52d0e30ae99e01a73d737b2f45d38fed4edf79f9325a1d5"
+dependencies = [
+ "discard",
+ "rustc_version",
+ "stdweb-derive",
+ "stdweb-internal-macros",
+ "stdweb-internal-runtime",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "stdweb-derive"
+version = "0.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c87a60a40fccc84bef0652345bbbbbe20a605bf5d0ce81719fc476f5c03b50ef"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "serde",
+ "serde_derive",
+ "syn",
+]
+
+[[package]]
+name = "stdweb-internal-macros"
+version = "0.2.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "58fa5ff6ad0d98d1ffa8cb115892b6e69d67799f6763e162a1c9db421dc22e11"
+dependencies = [
+ "base-x",
+ "proc-macro2",
+ "quote",
+ "serde",
+ "serde_derive",
+ "serde_json",
+ "sha1",
+ "syn",
+]
+
+[[package]]
+name = "stdweb-internal-runtime"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "213701ba3370744dcd1a12960caa4843b3d68b4d1c0a5d575e0d65b2ee9d16c0"
+
+[[package]]
+name = "string"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d24114bfcceb867ca7f71a0d3fe45d45619ec47a6fbfa98cb14e14250bfa5d6d"
+dependencies = [
+ "bytes",
+]
+
+[[package]]
+name = "strsim"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"
+
+[[package]]
+name = "syn"
+version = "1.0.98"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c50aef8a904de4c23c788f104b7dddc7d6f79c647c7c8ce4cc8f73eb0ca773dd"
+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 = "termcolor"
+version = "1.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755"
+dependencies = [
+ "winapi-util",
+]
+
+[[package]]
+name = "textwrap"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060"
+dependencies = [
+ "unicode-width",
+]
+
+[[package]]
+name = "thiserror"
+version = "1.0.31"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bd829fe32373d27f76265620b5309d0340cb8550f523c1dda251d6298069069a"
+dependencies = [
+ "thiserror-impl",
+]
+
+[[package]]
+name = "thiserror-impl"
+version = "1.0.31"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0396bc89e626244658bef819e22d0cc459e795a5ebe878e6ec336d1674a8d79a"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "time"
+version = "0.1.44"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255"
+dependencies = [
+ "libc",
+ "wasi 0.10.0+wasi-snapshot-preview1",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "time"
+version = "0.2.27"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4752a97f8eebd6854ff91f1c1824cd6160626ac4bd44287f7f4ea2035a02a242"
+dependencies = [
+ "const_fn",
+ "libc",
+ "standback",
+ "stdweb",
+ "time-macros",
+ "version_check",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "time-macros"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "957e9c6e26f12cb6d0dd7fc776bb67a706312e7299aed74c8dd5b17ebb27e2f1"
+dependencies = [
+ "proc-macro-hack",
+ "time-macros-impl",
+]
+
+[[package]]
+name = "time-macros-impl"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fd3c141a1b43194f3f56a1411225df8646c55781d5f26db825b3d98507eb482f"
+dependencies = [
+ "proc-macro-hack",
+ "proc-macro2",
+ "quote",
+ "standback",
+ "syn",
+]
+
+[[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.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c"
+
+[[package]]
+name = "tokio"
+version = "0.1.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5a09c0b5bb588872ab2f09afa13ee6e9dac11e10a0ec9e8e3ba39a5a5d530af6"
+dependencies = [
+ "bytes",
+ "futures",
+ "mio",
+ "num_cpus",
+ "tokio-codec",
+ "tokio-current-thread",
+ "tokio-executor",
+ "tokio-fs",
+ "tokio-io",
+ "tokio-reactor",
+ "tokio-sync",
+ "tokio-tcp",
+ "tokio-threadpool",
+ "tokio-timer",
+ "tokio-udp",
+ "tokio-uds",
+]
+
+[[package]]
+name = "tokio-buf"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8fb220f46c53859a4b7ec083e41dec9778ff0b1851c0942b211edb89e0ccdc46"
+dependencies = [
+ "bytes",
+ "either",
+ "futures",
+]
+
+[[package]]
+name = "tokio-codec"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "25b2998660ba0e70d18684de5d06b70b70a3a747469af9dea7618cc59e75976b"
+dependencies = [
+ "bytes",
+ "futures",
+ "tokio-io",
+]
+
+[[package]]
+name = "tokio-core"
+version = "0.1.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "87b1395334443abca552f63d4f61d0486f12377c2ba8b368e523f89e828cffd4"
+dependencies = [
+ "bytes",
+ "futures",
+ "iovec",
+ "log",
+ "mio",
+ "scoped-tls",
+ "tokio",
+ "tokio-executor",
+ "tokio-io",
+ "tokio-reactor",
+ "tokio-timer",
+]
+
+[[package]]
+name = "tokio-current-thread"
+version = "0.1.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b1de0e32a83f131e002238d7ccde18211c0a5397f60cbfffcb112868c2e0e20e"
+dependencies = [
+ "futures",
+ "tokio-executor",
+]
+
+[[package]]
+name = "tokio-executor"
+version = "0.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fb2d1b8f4548dbf5e1f7818512e9c406860678f29c300cdf0ebac72d1a3a1671"
+dependencies = [
+ "crossbeam-utils 0.7.2",
+ "futures",
+]
+
+[[package]]
+name = "tokio-fs"
+version = "0.1.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "297a1206e0ca6302a0eed35b700d292b275256f596e2f3fea7729d5e629b6ff4"
+dependencies = [
+ "futures",
+ "tokio-io",
+ "tokio-threadpool",
+]
+
+[[package]]
+name = "tokio-io"
+version = "0.1.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "57fc868aae093479e3131e3d165c93b1c7474109d13c90ec0dda2a1bbfff0674"
+dependencies = [
+ "bytes",
+ "futures",
+ "log",
+]
+
+[[package]]
+name = "tokio-reactor"
+version = "0.1.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09bc590ec4ba8ba87652da2068d150dcada2cfa2e07faae270a5e0409aa51351"
+dependencies = [
+ "crossbeam-utils 0.7.2",
+ "futures",
+ "lazy_static",
+ "log",
+ "mio",
+ "num_cpus",
+ "parking_lot",
+ "slab",
+ "tokio-executor",
+ "tokio-io",
+ "tokio-sync",
+]
+
+[[package]]
+name = "tokio-rustls"
+version = "0.10.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2d7cf08f990090abd6c6a73cab46fed62f85e8aef8b99e4b918a9f4a637f0676"
+dependencies = [
+ "bytes",
+ "futures",
+ "iovec",
+ "rustls",
+ "tokio-io",
+ "webpki",
+]
+
+[[package]]
+name = "tokio-sync"
+version = "0.1.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "edfe50152bc8164fcc456dab7891fa9bf8beaf01c5ee7e1dd43a397c3cf87dee"
+dependencies = [
+ "fnv",
+ "futures",
+]
+
+[[package]]
+name = "tokio-tcp"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "98df18ed66e3b72e742f185882a9e201892407957e45fbff8da17ae7a7c51f72"
+dependencies = [
+ "bytes",
+ "futures",
+ "iovec",
+ "mio",
+ "tokio-io",
+ "tokio-reactor",
+]
+
+[[package]]
+name = "tokio-threadpool"
+version = "0.1.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "df720b6581784c118f0eb4310796b12b1d242a7eb95f716a8367855325c25f89"
+dependencies = [
+ "crossbeam-deque",
+ "crossbeam-queue",
+ "crossbeam-utils 0.7.2",
+ "futures",
+ "lazy_static",
+ "log",
+ "num_cpus",
+ "slab",
+ "tokio-executor",
+]
+
+[[package]]
+name = "tokio-timer"
+version = "0.2.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "93044f2d313c95ff1cb7809ce9a7a05735b012288a888b62d4434fd58c94f296"
+dependencies = [
+ "crossbeam-utils 0.7.2",
+ "futures",
+ "slab",
+ "tokio-executor",
+]
+
+[[package]]
+name = "tokio-udp"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e2a0b10e610b39c38b031a2fcab08e4b82f16ece36504988dcbd81dbba650d82"
+dependencies = [
+ "bytes",
+ "futures",
+ "log",
+ "mio",
+ "tokio-codec",
+ "tokio-io",
+ "tokio-reactor",
+]
+
+[[package]]
+name = "tokio-uds"
+version = "0.2.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ab57a4ac4111c8c9dbcf70779f6fc8bc35ae4b2454809febac840ad19bd7e4e0"
+dependencies = [
+ "bytes",
+ "futures",
+ "iovec",
+ "libc",
+ "log",
+ "mio",
+ "mio-uds",
+ "tokio-codec",
+ "tokio-io",
+ "tokio-reactor",
+]
+
+[[package]]
+name = "try-lock"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642"
+
+[[package]]
+name = "try_from"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "283d3b89e1368717881a9d51dad843cc435380d8109c9e47d38780a324698d8b"
+dependencies = [
+ "cfg-if 0.1.10",
+]
+
+[[package]]
+name = "unicase"
+version = "2.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6"
+dependencies = [
+ "version_check",
+]
+
+[[package]]
+name = "unicode-bidi"
+version = "0.3.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992"
+
+[[package]]
+name = "unicode-ident"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "15c61ba63f9235225a22310255a29b806b907c9b8c964bcbd0a2c70f3f2deea7"
+
+[[package]]
+name = "unicode-normalization"
+version = "0.1.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "854cbdc4f7bc6ae19c820d44abdc3277ac3e1b2b93db20a636825d9322fb60e6"
+dependencies = [
+ "tinyvec",
+]
+
+[[package]]
+name = "unicode-width"
+version = "0.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973"
+
+[[package]]
+name = "unicode-xid"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "957e51f3646910546462e67d5f7599b9e4fb8acdd304b087a6494730f9eebf04"
+
+[[package]]
+name = "untrusted"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a"
+
+[[package]]
+name = "url"
+version = "1.7.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a"
+dependencies = [
+ "idna 0.1.5",
+ "matches",
+ "percent-encoding 1.0.1",
+]
+
+[[package]]
+name = "url"
+version = "2.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c"
+dependencies = [
+ "form_urlencoded",
+ "idna 0.2.3",
+ "matches",
+ "percent-encoding 2.1.0",
+]
+
+[[package]]
+name = "uuid"
+version = "0.7.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "90dbc611eb48397705a6b0f6e917da23ae517e4d127123d2cf7674206627d32a"
+dependencies = [
+ "rand",
+]
+
+[[package]]
+name = "vec_map"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191"
+
+[[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.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b6395efa4784b027708f7451087e647ec73cc74f5d9bc2e418404248d679a230"
+dependencies = [
+ "futures",
+ "log",
+ "try-lock",
+]
+
+[[package]]
+name = "wasi"
+version = "0.10.0+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f"
+
+[[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.82"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fc7652e3f6c4706c8d9cd54832c4a4ccb9b5336e2c3bd154d5cccfbf1c1f5f7d"
+dependencies = [
+ "cfg-if 1.0.0",
+ "wasm-bindgen-macro",
+]
+
+[[package]]
+name = "wasm-bindgen-backend"
+version = "0.2.82"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "662cd44805586bd52971b9586b1df85cdbbd9112e4ef4d8f41559c334dc6ac3f"
+dependencies = [
+ "bumpalo",
+ "log",
+ "once_cell",
+ "proc-macro2",
+ "quote",
+ "syn",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-macro"
+version = "0.2.82"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b260f13d3012071dfb1512849c033b1925038373aea48ced3012c09df952c602"
+dependencies = [
+ "quote",
+ "wasm-bindgen-macro-support",
+]
+
+[[package]]
+name = "wasm-bindgen-macro-support"
+version = "0.2.82"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5be8e654bdd9b79216c2929ab90721aa82faf65c48cdf08bdc4e7f51357b80da"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+ "wasm-bindgen-backend",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-shared"
+version = "0.2.82"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6598dd0bd3c7d51095ff6531a5b23e02acdc81804e30d8f07afb77b7215a140a"
+
+[[package]]
+name = "web-sys"
+version = "0.3.59"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ed055ab27f941423197eb86b2035720b1a3ce40504df082cac2ecc6ed73335a1"
+dependencies = [
+ "js-sys",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "webpki"
+version = "0.21.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b8e38c0608262c46d4a56202ebabdeb094cef7e560ca7a226c6bf055188aa4ea"
+dependencies = [
+ "ring",
+ "untrusted",
+]
+
+[[package]]
+name = "webpki-roots"
+version = "0.17.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a262ae37dd9d60f60dd473d1158f9fbebf110ba7b6a5051c8160460f6043718b"
+dependencies = [
+ "webpki",
+]
+
+[[package]]
+name = "winapi"
+version = "0.2.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a"
+
+[[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-build"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc"
+
+[[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 0.3.9",
+]
+
+[[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 = "winreg"
+version = "0.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b2986deb581c4fe11b621998a5e53361efe6b48a151178d0cd9eeffa4dc6acc9"
+dependencies = [
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "ws2_32-sys"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e"
+dependencies = [
+ "winapi 0.2.8",
+ "winapi-build",
+]
+
+[[package]]
+name = "xdg"
+version = "2.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0c4583db5cbd4c4c0303df2d15af80f0539db703fa1c68802d4cbbd2dd0f88f6"
+dependencies = [
+ "dirs",
+]
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..8c5c8c7afed1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cmsis-pack-manager/default.nix
@@ -0,0 +1,77 @@
+{ lib
+, fetchPypi
+, rustPlatform
+, stdenv
+, Security
+, writeShellScriptBin
+, buildPythonPackage
+, setuptools-scm
+, appdirs
+, milksnake
+, pyyaml
+, hypothesis
+, jinja2
+, mock
+, pytestCheckHook
+}:
+let
+  pname = "cmsis-pack-manager";
+  version = "0.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-NeUG6PFI2eTwq5SNtAB6ZMA1M3z1JmMND29V9/O5sgw=";
+  };
+
+  native = rustPlatform.buildRustPackage {
+    name = "${pname}-${version}-native";
+
+    inherit src;
+
+    buildInputs = lib.optionals stdenv.isDarwin [
+      Security
+    ];
+
+    sourceRoot = "${pname}-${version}/rust";
+    cargoLock.lockFile = ./Cargo.lock;
+
+    postPatch = ''
+      cp ${./Cargo.lock} Cargo.lock
+    '';
+
+    cargoBuildFlags = [ "--lib" ];
+  };
+in
+buildPythonPackage rec {
+  inherit pname version src;
+
+  # The cargo build is already run in a separate derivation
+  postPatch = ''
+    substituteInPlace setup.py \
+        --replace "'cargo', 'build'," "'true',"
+  '';
+
+  nativeBuildInputs = [ setuptools-scm ];
+  propagatedBuildInputs = [ appdirs milksnake pyyaml ];
+
+  checkInputs = [ hypothesis jinja2 mock pytestCheckHook ];
+
+  preBuild = ''
+    mkdir -p rust/target/release/deps
+    ln -s ${native}/lib/libcmsis_cffi${stdenv.hostPlatform.extensions.sharedLibrary} rust/target/release/deps/
+  '';
+
+  preCheck = ''
+    # Otherwise the test uses a dummy library (missing all symbols)
+    ln -sf ../build/lib/cmsis_pack_manager/_native__lib${stdenv.hostPlatform.extensions.sharedLibrary} cmsis_pack_manager/_native__lib${stdenv.hostPlatform.extensions.sharedLibrary}
+  '';
+
+  pythonImportsCheck = [ "cmsis_pack_manager" ];
+
+  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/cntk/default.nix b/nixpkgs/pkgs/development/python-modules/cntk/default.nix
new file mode 100644
index 000000000000..b1bba8cf1e0f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cntk/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, buildPythonPackage
+, pkgs
+, numpy
+, scipy
+, mpi
+, enum34
+, protobuf
+, pip
+, python
+, swig
+}:
+
+let
+  cntk = pkgs.cntk;
+in
+buildPythonPackage {
+  inherit (cntk) name version src;
+
+  nativeBuildInputs = [ swig mpi ];
+  buildInputs = [ cntk mpi ];
+  propagatedBuildInputs = [ numpy scipy enum34 protobuf pip ];
+
+  CNTK_LIB_PATH = "${cntk}/lib";
+  CNTK_COMPONENT_VERSION = cntk.version;
+  CNTK_VERSION = cntk.version;
+  CNTK_VERSION_BANNER = cntk.version;
+
+  postPatch = ''
+    cd bindings/python
+    sed -i 's,"libmpi.so.12","${mpi}/lib/libmpi.so",g' cntk/train/distributed.py
+
+    # Remove distro and libs checks; they aren't compatible with NixOS and besides we guarantee
+    # compatibility by providing a package.
+    cat <<EOF > cntk/cntk_py_init.py
+    def cntk_check_distro_info():
+      pass
+    def cntk_check_libs():
+      pass
+    EOF
+  '';
+
+  postInstall = ''
+    rm -rf $out/${python.sitePackages}/cntk/libs
+    ln -s ${cntk}/lib $out/${python.sitePackages}/cntk/libs
+    # It's not installed for some reason.
+    cp cntk/cntk_py.py $out/${python.sitePackages}/cntk
+  '';
+
+  # Actual tests are broken.
+  checkPhase = ''
+    cd $NIX_BUILD_TOP
+    ${python.interpreter} -c "import cntk"
+  '';
+
+  meta = {
+    inherit (cntk.meta) homepage description license maintainers platforms;
+    # doesn't support Python 3.7
+    broken = lib.versionAtLeast python.version "3.7";
+  };
+}
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..36e4bcf2760d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cnvkit/default.nix
@@ -0,0 +1,80 @@
+{ lib
+, fetchFromGitHub
+, fetchpatch
+, rPackages
+, buildPythonPackage
+, biopython
+, numpy
+, scipy
+, scikit-learn
+, pandas
+, matplotlib
+, reportlab
+, pysam
+, future
+, pillow
+, pomegranate
+, pyfaidx
+, python
+, R
+}:
+
+buildPythonPackage rec {
+  pname = "CNVkit";
+  version = "0.9.9";
+
+  src = fetchFromGitHub {
+    owner = "etal";
+    repo = "cnvkit";
+    rev = "v${version}";
+    sha256 = "1q4l7jhr1k135an3n9aa9wsid5lk6fwxb0hcldrr6v6y76zi4gj1";
+  };
+
+  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
+  ];
+
+  checkInputs = [ 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";
+    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..643072269a36
--- /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;
+    sha256 = "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/cock/default.nix b/nixpkgs/pkgs/development/python-modules/cock/default.nix
new file mode 100644
index 000000000000..384e2c42fea5
--- /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.10.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-B6r6+b+x5vEp4+yfhV03dfjlVjRbW2W6Pm91PC0Tb+o=";
+  };
+
+  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..b7301cf1e73a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/coconut/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonApplication
+, fetchFromGitHub
+, cpyparsing
+, ipykernel
+, mypy
+, pexpect
+, pygments
+, pytestCheckHook
+, prompt-toolkit
+, tkinter
+, watchdog
+}:
+
+buildPythonApplication rec {
+  pname = "coconut";
+  version = "1.6.0";
+
+  src = fetchFromGitHub {
+    owner = "evhub";
+    repo = "coconut";
+    rev = "v${version}";
+    sha256 = "/397YGV6QWWmKfqr5hSvqRoPOu7Hx1Pak6rVPR3etzw=";
+  };
+
+  propagatedBuildInputs = [ cpyparsing ipykernel mypy pygments prompt-toolkit watchdog ];
+
+  checkInputs = [ pexpect pytestCheckHook tkinter ];
+
+  # Currently most tests have performance issues
+  pytestFlagsArray = [
+    "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..83ed76ac8669
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cocotb/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, setuptools
+, setuptools-scm
+, cocotb-bus
+, pytestCheckHook
+, swig
+, verilog
+}:
+
+buildPythonPackage rec {
+  pname = "cocotb";
+  version = "1.6.2";
+
+  # - we need to use the tarball from PyPi
+  #   or the full git checkout (with .git)
+  # - using fetchFromGitHub will cause a build failure,
+  #   because it does not include required metadata
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-SY+1727DbWMg6CnmHw8k/VP0dwBRYszn+YyyvZXgvUs=";
+  };
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  buildInputs = [ setuptools ];
+
+  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
+  ];
+
+  checkInputs = [ cocotb-bus pytestCheckHook swig verilog ];
+
+  checkPhase = ''
+    export PATH=$out/bin:$PATH
+  '';
+
+  meta = with lib; {
+    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 ];
+  };
+}
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..20c80872fd0f
--- /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.12";
+
+  src = fetchFromGitHub {
+    owner = "codecov";
+    repo = "codecov-python";
+    rev = "v${version}";
+    sha256 = "0bdk1cp3hxydpx9knqfv88ywwzw7yqhywi0inxjd6x53qh75prqy";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    coverage
+  ];
+
+  checkInputs = [
+    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..34e872249824
--- /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}";
+    sha256 = "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/codespell/default.nix b/nixpkgs/pkgs/development/python-modules/codespell/default.nix
new file mode 100644
index 000000000000..95b64dda4b2d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/codespell/default.nix
@@ -0,0 +1,37 @@
+{ lib, buildPythonApplication, fetchFromGitHub, pytestCheckHook, pytest-dependency, aspell-python, aspellDicts, chardet }:
+
+buildPythonApplication rec {
+  pname = "codespell";
+  version = "2.1.0";
+
+  src = fetchFromGitHub {
+    owner = "codespell-project";
+    repo = "codespell";
+    rev = "v${version}";
+    sha256 = "sha256-BhYVztSr2MalILEcOcvMl07CObYa73o3kW8S/idqAO8=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "--cov=codespell_lib" "" \
+      --replace "--cov-report=" ""
+  '';
+
+  checkInputs = [ aspell-python chardet pytestCheckHook pytest-dependency ];
+
+  preCheck = ''
+    export ASPELL_CONF="dict-dir ${aspellDicts.en}/lib/aspell"
+  '';
+
+  # tries to run not fully installed script
+  disabledTests = [ "test_command" ];
+
+  pythonImportsCheck = [ "codespell_lib" ];
+
+  meta = with lib; {
+    description = "Fix common misspellings in source code";
+    homepage = "https://github.com/codespell-project/codespell";
+    license = with licenses; [ gpl2Only cc-by-sa-30 ];
+    maintainers = with maintainers; [ johnazoidberg SuperSandro2000 ];
+  };
+}
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/coincurve/default.nix b/nixpkgs/pkgs/development/python-modules/coincurve/default.nix
new file mode 100644
index 000000000000..5d259f250b5f
--- /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 = "17.0.0";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "ofek";
+    repo = "coincurve";
+    rev = "v${version}";
+    sha256 = "sha256-7H4/TDxteuMTrj1PdfpA5rc7CegJAOjqn1PteImfGiQ=";
+  };
+
+  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
+  '';
+
+  checkInputs = [
+    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; [ SuperSandro2000 ];
+  };
+}
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..8a4933d19541
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/colander/default.nix
@@ -0,0 +1,21 @@
+{ lib, buildPythonPackage, fetchPypi
+, translationstring, iso8601, enum34 }:
+
+buildPythonPackage rec {
+  pname = "colander";
+  version = "1.8.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "259592a0d6a89cbe63c0c5771f9c0c2522387415af8d715f599583eac659f7d4";
+  };
+
+  propagatedBuildInputs = [ translationstring iso8601 enum34 ];
+
+  meta = with lib; {
+    description = "A simple schema-based serialization and deserialization library";
+    homepage = "https://docs.pylonsproject.org/projects/colander/en/latest/";
+    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..20f45f1fa75f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/colanderalchemy/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, colander
+, sqlalchemy
+}:
+
+buildPythonPackage rec {
+  pname = "ColanderAlchemy";
+  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..867226c327b4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/collections-extended/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, hypothesis
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "collections-extended";
+  version = "2.0.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "mlenzen";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-cK13+CQUELKSiLpG747+C+RB5b6luu0mWLLXTT+uGH4=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  checkInputs = [
+    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..76f9063ab9a4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/colorama/default.nix
@@ -0,0 +1,24 @@
+{ lib, fetchPypi, buildPythonPackage }:
+
+buildPythonPackage rec {
+  pname = "colorama";
+  version = "0.4.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-5sa0M0/FCYimOdm5iqQpoLV9puF7mkTwRR+TC2lnt6Q=";
+  };
+
+  # No tests in archive
+  doCheck = false;
+
+  pythonImportsCheck = [ "colorama" ];
+
+  meta = with lib; {
+    description = "Cross-platform colored terminal text";
+    homepage = "https://github.com/tartley/colorama";
+    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..33e7942dfc89
--- /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.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "21c522346a7aa81a603729f2996c22ac3f7822f4c8c303c59761e27d2dfcf3db";
+  };
+
+  propagatedBuildInputs = [
+    param
+    pyct
+  ];
+
+  checkInputs = [
+    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; [ costrouc ];
+  };
+}
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..35d1d5a896c2
--- /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;
+    sha256 = "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..2aebcfb6ddfb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/colored/default.nix
@@ -0,0 +1,24 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "colored";
+  version = "1.4.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b7b48b9f40e8a65bbb54813d5d79dd008dc8b8c5638d5bbfd30fc5a82e6def7a";
+  };
+
+  # No proper test suite
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://gitlab.com/dslackw/colored";
+    description = "Simple library for color and formatting to terminal";
+    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..3ffdc6ffdd0e
--- /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
+  ];
+
+  checkInputs = [
+    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..9ea380cd1d55
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/colorful/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "colorful";
+  version = "0.5.4";
+
+  # No tests in the Pypi package.
+  src = fetchFromGitHub {
+    owner = "timofurrer";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1fcz5v8b318a3dsdha4c874jsf3wmcw3f25bv2csixclyzacli98";
+  };
+
+  checkInputs = [ pytestCheckHook ];
+
+  meta = with lib; {
+    description = "Terminal string styling done right, in Python.";
+    homepage = "https://github.com/timofurrer/colorful";
+    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..690a54813f41
--- /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.6.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-NE9zIEAJ5Mg8W2vrALPEXccPza48gNuRngpBcdAG/eg=";
+  };
+
+  checkInputs = [ 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..70dd66e8f813
--- /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; [ globin ];
+  };
+}
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..7f9f9f1a9ce7
--- /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";
+    sha256 = "sha256-eACVPIQFgiGiVmQ/PjUxP/UH/hBOsCywz5PlgpA4dk4=";
+  };
+
+  propagatedBuildInputs = [ networkx numpy ];
+
+  checkInputs = [ 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..4e74d9592a9b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/colorzero/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pkginfo
+, sphinxHook
+, sphinx-rtd-theme
+, 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" ""
+  '';
+
+  outputs = [
+    "out"
+    "doc"
+  ];
+
+  nativeBuildInputs = [
+    pkginfo
+    sphinx-rtd-theme
+    sphinxHook
+  ];
+
+  pythonImportsCheck = [
+    "colorzero"
+  ];
+
+  checkInputs = [
+    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..f7419666f535
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/colour/default.nix
@@ -0,0 +1,19 @@
+{ lib, buildPythonPackage, fetchPypi, d2to1 }:
+
+buildPythonPackage rec {
+  pname = "colour";
+  version = "0.1.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "af20120fefd2afede8b001fbef2ea9da70ad7d49fafdb6489025dae8745c3aee";
+  };
+
+  buildInputs = [ d2to1 ];
+
+  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/cometblue-lite/default.nix b/nixpkgs/pkgs/development/python-modules/cometblue-lite/default.nix
new file mode 100644
index 000000000000..01d24bc7cb7b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cometblue-lite/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, bluepy
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "cometblue-lite";
+  version = "0.4.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "neffs";
+    repo = "python-cometblue_lite";
+    rev = version;
+    sha256 = "sha256-kK6P8almFQac/bt7we02Q96RIB/s9wAqb+dn09tFx7k=";
+  };
+
+  propagatedBuildInputs = [
+    bluepy
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "cometblue_lite"
+  ];
+
+  meta = with lib; {
+    description = "Python 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/commandparse/default.nix b/nixpkgs/pkgs/development/python-modules/commandparse/default.nix
new file mode 100644
index 000000000000..68da870f4e2d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/commandparse/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "commandparse";
+  version = "1.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "06mcxc0vs5qdcywalgyx5zm18z4xcsrg5g0wsqqv5qawkrvmvl53";
+  };
+
+  # 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..c1d3b8916d91
--- /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}";
+    sha256 = "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 ];
+
+  checkInputs = [ 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; [ SuperSandro2000 ];
+  };
+}
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..42bf9d15a675
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/commoncode/default.nix
@@ -0,0 +1,81 @@
+{ lib
+, stdenv
+, attrs
+, beautifulsoup4
+, buildPythonPackage
+, click
+, fetchPypi
+, intbitset
+, pytest-xdist
+, pytestCheckHook
+, pythonAtLeast
+, pythonOlder
+, requests
+, saneyaml
+, setuptools-scm
+, text-unidecode
+, typing
+}:
+
+buildPythonPackage rec {
+  pname = "commoncode";
+  version = "30.2.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-7kcDWfw4M7boe0ABO4ob1d+XO1YxS924mtGETvHoNf0=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "intbitset >= 2.3.0, < 3.0" "intbitset >= 2.3.0"
+  '';
+
+  dontConfigure = true;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    attrs
+    beautifulsoup4
+    click
+    intbitset
+    requests
+    saneyaml
+    text-unidecode
+  ] ++ lib.optionals (pythonOlder "3.7") [
+    typing
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    pytest-xdist
+  ];
+
+  disabledTests = 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";
+    license = licenses.asl20;
+    maintainers = teams.determinatesystems.members;
+  };
+}
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..56ddf7663078
--- /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;
+
+  checkInputs = [  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..1892337dc2d9
--- /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
+  '';
+
+  checkInputs = [ 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/compreffor/default.nix b/nixpkgs/pkgs/development/python-modules/compreffor/default.nix
new file mode 100644
index 000000000000..183645053771
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/compreffor/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools-scm
+, fonttools
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "compreffor";
+  version = "0.5.2";
+
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-rsC0HJCl3IGqEqUqfCwRRNwzjtfGDlxcCkeOU3On22Q=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    fonttools
+  ];
+
+  checkInputs = [
+    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; [ jtojnar ];
+  };
+}
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..d75df29421d3
--- /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.20";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-n6KtYUdKE3tWQnAr0z8hgVWYqsuh51E5s3zrLO3aj58=";
+  };
+
+  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 = teams.chia.members;
+  };
+}
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..5f1b56cbcde4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/conda/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, 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";
+
+  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/configargparse/default.nix b/nixpkgs/pkgs/development/python-modules/configargparse/default.nix
new file mode 100644
index 000000000000..7c1594e9e805
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/configargparse/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, mock
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "configargparse";
+  version = "1.5.3";
+
+  src = fetchFromGitHub {
+    owner = "bw2";
+    repo = "ConfigArgParse";
+    rev = "v${version}";
+    sha256 = "1dsai4bilkp2biy9swfdx2z0k4akw4lpvx12flmk00r80hzgbglz";
+  };
+
+  checkInputs = [
+    mock
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "configargparse" ];
+
+  meta = with lib; {
+    description = "A drop-in replacement for argparse";
+    homepage = "https://github.com/bw2/ConfigArgParse";
+    license = licenses.mit;
+    maintainers = [ 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..9856be48ac3d
--- /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;
+    sha256 = "sha256-aoDKBuDxJCeXbVwCXhse6FCbDDM30/Xa8p9qRvDkWBk=";
+  };
+
+  propagatedBuildInputs = [ mergedict ];
+
+  checkInputs = [ 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..ff07a0f8b646
--- /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;
+    sha256 = "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..3ea89db527e9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/configobj/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, mock
+, pytestCheckHook
+, pythonOlder
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "configobj";
+  version = "5.0.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "DiffSK";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-HMLYzVMnxvMpb3ORsbKy18oU/NkuRT0isK6NaUk6J3U=";
+  };
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  checkInputs = [
+    mock
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "configobj"
+  ];
+
+  meta = with lib; {
+    description = "Config file reading, writing and validation";
+    homepage = "https://pypi.python.org/pypi/configobj";
+    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..9467003e9dd9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/configparser/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, setuptools-scm }:
+
+buildPythonPackage rec {
+  pname = "configparser";
+  version = "5.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1b35798fdf1713f1c3139016cfcbc461f09edbf099d1fb658d4b7479fcaa3daa";
+  };
+
+  # No tests available
+  doCheck = false;
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  preConfigure = ''
+    export LC_ALL=${if stdenv.isDarwin then "en_US" else "C"}.UTF-8
+  '';
+
+  meta = with lib; {
+    description = "Updated configparser from Python 3.7 for Python 2.6+.";
+    license = licenses.mit;
+    homepage = "https://github.com/jaraco/configparser";
+  };
+}
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..2cd66636b016
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/configshell/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, pyparsing
+, six
+, urwid
+}:
+
+buildPythonPackage rec {
+  pname = "configshell";
+  version = "1.1.29";
+
+  src = fetchFromGitHub {
+    owner = "open-iscsi";
+    repo = "${pname}-fb";
+    rev = "v${version}";
+    sha256 = "0mjj3c9335sph8rhwww7j4zvhyk896fbmx887vibm89w3jpvjjr9";
+  };
+
+  propagatedBuildInputs = [
+    pyparsing
+    six
+    urwid
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "pyparsing >=2.0.2,<3.0" "pyparsing >=2.0.2"
+  '';
+
+  # 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/confluent-kafka/default.nix b/nixpkgs/pkgs/development/python-modules/confluent-kafka/default.nix
new file mode 100644
index 000000000000..f3a24d70fbf0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/confluent-kafka/default.nix
@@ -0,0 +1,23 @@
+{ lib, buildPythonPackage, fetchPypi, isPy3k, rdkafka, requests, avro3k, avro ? null, futures ? null, enum34 ? null }:
+
+buildPythonPackage rec {
+  version = "1.9.2";
+  pname = "confluent-kafka";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-L7l70l1Da9Wf4HmIWqd6Oi8jz6zpxjWdRwAFNmWEkmI=";
+  };
+
+  buildInputs = [ rdkafka requests ] ++ (if isPy3k then [ avro3k ] else [ enum34 avro futures ]) ;
+
+  # No tests in PyPi Tarball
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Confluent's Apache Kafka client for Python";
+    homepage = "https://github.com/confluentinc/confluent-kafka-python";
+    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..e28621f26a99
--- /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 = "flit";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "beetbox";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-zdH5DNXnuAfYTuaG9EIKiXL2EbLSfzYjPSkC3G06bU8=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    pyyaml
+  ];
+
+  checkInputs = [
+    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..cfcb1d946824
--- /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;
+    sha256 = "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..3bac60d0e7d7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/connexion/default.nix
@@ -0,0 +1,74 @@
+{ lib
+, aiohttp
+, aiohttp-jinja2
+, aiohttp-remotes
+, aiohttp-swagger
+, buildPythonPackage
+, clickclick
+, decorator
+, fetchFromGitHub
+, flask
+, inflection
+, jsonschema
+, openapi-spec-validator
+, pytest-aiohttp
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, requests
+, swagger-ui-bundle
+, testfixtures
+}:
+
+buildPythonPackage rec {
+  pname = "connexion";
+  version = "2.14.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "spec-first";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-5+OZvJG68jZZsfOuOqsCUSPLV6vvjk9msJzjsCwo0jw=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    aiohttp-jinja2
+    aiohttp-swagger
+    clickclick
+    flask
+    inflection
+    jsonschema
+    openapi-spec-validator
+    pyyaml
+    requests
+    swagger-ui-bundle
+  ];
+
+  checkInputs = [
+    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";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ elohmeier ];
+  };
+}
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..2977051d87b2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cons/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, logical-unification
+, pytestCheckHook
+, pytest-html
+}:
+
+buildPythonPackage rec {
+  pname = "cons";
+  version = "0.4.5";
+
+  src = fetchFromGitHub {
+    owner = "pythological";
+    repo = "python-cons";
+    rev = "fbeedfc8a3d1bff4ba179d492155cdd55538365e";
+    sha256 = "sha256-ivHFep9iYPvyiBIZKMAzqrLGnQkeuxd0meYMZwZFFH0=";
+  };
+
+  propagatedBuildInputs = [
+    logical-unification
+  ];
+
+  checkInputs = [
+    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";
+    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..a31930bd0c4b
--- /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
+  ];
+
+  checkInputs = [
+    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..b75eca716365
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/constantly/default.nix
@@ -0,0 +1,20 @@
+{ lib, buildPythonPackage, fetchPypi
+}:
+buildPythonPackage rec {
+  pname = "constantly";
+  version = "15.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0dgwdla5kfpqz83hfril716inm41hgn9skxskvi77605jbmp4qsq";
+  };
+
+  pythonImportsCheck = [ "constantly" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/twisted/constantly";
+    description = "symbolic constant support";
+    license = licenses.mit;
+    maintainers = [ ];
+  };
+}
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..ce6e0a65b342
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/construct/default.nix
@@ -0,0 +1,35 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub, pythonOlder
+, pytestCheckHook, pytest-benchmark, numpy, arrow, ruamel-yaml
+, lz4, cloudpickle
+}:
+
+buildPythonPackage rec {
+  pname   = "construct";
+  version = "2.10.68";
+
+  disabled = pythonOlder "3.6";
+
+  # no tests in PyPI tarball
+  src = fetchFromGitHub {
+    owner  = pname;
+    repo   = pname;
+    rev    = "v${version}";
+    sha256 = "sha256-bp/YyRFP0rrBHPyhiqnn6o1iC5l61oedShZ2phGeqaw=";
+  };
+
+  # not an explicit dependency, but it's imported by an entrypoint
+  propagatedBuildInputs = [
+    lz4
+  ];
+
+  checkInputs = [ pytestCheckHook numpy arrow ruamel-yaml cloudpickle ];
+
+  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/";
+    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..1dcf4e9b7a72
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/container-inspector/default.nix
@@ -0,0 +1,56 @@
+{ 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;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    attrs
+    click
+    dockerfile-parse
+    commoncode
+  ];
+
+  checkInputs = [
+    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";
+    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..6aea2570cb87
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/contextlib2/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "contextlib2";
+  version = "21.6.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-qx4r/h0B2Wjht+jZAjvFHvNQm7ohe7cwzuOCfh7oKGk=";
+  };
+
+  checkPhase = ''
+    runHook preCheck
+    ${python.interpreter} -m unittest discover
+    runHook postCheck
+  '';
+
+  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..7cf41e9fcbdc
--- /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";
+    sha256 = "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" ];
+
+  checkInputs = [ 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/contextvars/default.nix b/nixpkgs/pkgs/development/python-modules/contextvars/default.nix
new file mode 100644
index 000000000000..1eda85a6ffe2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/contextvars/default.nix
@@ -0,0 +1,21 @@
+{ lib, buildPythonPackage, fetchPypi, isPy36, immutables }:
+
+buildPythonPackage rec {
+  pname = "contextvars";
+  version = "2.4";
+  disabled = !isPy36;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f38c908aaa59c14335eeea12abea5f443646216c4e29380d7bf34d2018e2c39e";
+  };
+
+  propagatedBuildInputs = [ immutables ];
+
+  meta = {
+    description = "A backport of the Python 3.7 contextvars module for Python 3.6";
+    homepage = "https://github.com/MagicStack/contextvars";
+    license = with lib.licenses; [ asl20 ];
+    maintainers = with lib.maintainers; [ catern ];
+  };
+}
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..b20066c51d8b
--- /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
+  ];
+
+  checkInputs = [
+    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..fdad4febcdaf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cookiecutter/default.nix
@@ -0,0 +1,43 @@
+{ lib, buildPythonPackage, fetchPypi, isPyPy
+, pytest, pytest-cov, pytest-mock, freezegun
+, jinja2, future, binaryornot, click, jinja2_time, requests
+, python-slugify
+, pyyaml
+}:
+
+buildPythonPackage rec {
+  pname = "cookiecutter";
+  version = "2.1.1";
+
+  # not sure why this is broken
+  disabled = isPyPy;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-85gr6NnFPawSYYZAE/3sf4Ov0uQu3m9t0GnF4UnFQNU=";
+  };
+
+  checkInputs = [ pytest pytest-cov pytest-mock freezegun ];
+  propagatedBuildInputs = [
+    binaryornot
+    jinja2
+    click
+    pyyaml
+    jinja2_time
+    python-slugify
+    requests
+  ];
+
+  # 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..a4e35dac346a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cookies/default.nix
@@ -0,0 +1,19 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "cookies";
+  version = "2.2.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "13pfndz8vbk4p2a44cfbjsypjarkrall71pgc97glk5fiiw9idnn";
+  };
+
+  doCheck = false;
+
+  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..c7a24a0c3e90
--- /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";
+  };
+
+  checkInputs = [ 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..12e1a46025a9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/coqpit/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "coqpit";
+  version = "0.0.16";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "coqui-ai";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-f1FLjR4VzSOA/VaeseVA4F1NWVJIvokIZIDW1k7fNqU=";
+  };
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "coqpit"
+    "coqpit.coqpit"
+  ];
+
+  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/coqui-trainer/default.nix b/nixpkgs/pkgs/development/python-modules/coqui-trainer/default.nix
new file mode 100644
index 000000000000..da8255a3b5a3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/coqui-trainer/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, fetchpatch
+, fetchFromGitHub
+, pythonAtLeast
+
+, coqpit
+, fsspec
+, pytorch-bin
+, tensorboardx
+, protobuf
+
+, pytestCheckHook
+, soundfile
+, torchvision-bin
+}:
+
+let
+  pname = "coqui-trainer";
+  version = "0.0.13";
+in
+buildPythonPackage {
+  inherit pname version;
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "coqui-ai";
+    repo = "Trainer";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-tRm/TElGjVTgCrI80wCt4F1hO82CsDPz2ynJzQKmbIs=";
+  };
+
+  propagatedBuildInputs = [
+    coqpit
+    fsspec
+    pytorch-bin
+    soundfile
+    tensorboardx
+    protobuf
+  ];
+
+  # only one test and that requires training data from the internet
+  doCheck = false;
+
+  checkInputs = [
+    pytestCheckHook
+    torchvision-bin
+  ];
+
+  pythonImportsCheck = [
+    "trainer"
+  ];
+
+  meta = with lib; {
+    description = "A general purpose model trainer, as flexible as it gets";
+    homepage = "https://github.com/coqui-ai/Trainer";
+    license = licenses.asl20;
+    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..ad9fd3d7ef73
--- /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
+  ];
+
+  checkInputs = [ 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/coreschema/default.nix b/nixpkgs/pkgs/development/python-modules/coreschema/default.nix
new file mode 100644
index 000000000000..d22e7f4ecd91
--- /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 ];
+
+  checkInputs = [ 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..9062ad22fd83
--- /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 = [ maintainers.costrouc ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/coronavirus/default.nix b/nixpkgs/pkgs/development/python-modules/coronavirus/default.nix
new file mode 100644
index 000000000000..ddf87816b8f7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/coronavirus/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, aiohttp
+}:
+
+buildPythonPackage rec {
+  pname = "coronavirus";
+  version = "1.1.1";
+
+  src = fetchFromGitHub {
+    owner = "nabucasa";
+    repo = pname;
+    rev = version;
+    sha256 = "0mx6ifp8irj3669c67hs9r79k8gar6j4aq7d4ji21pllyhyahdwm";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  # no tests are present
+  doCheck = false;
+  pythonImportsCheck = [ "coronavirus" ];
+
+  meta = with lib; {
+    description = "Python client for getting Corona virus info";
+    homepage = "https://github.com/nabucasa/coronavirus";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..e7c016be06bb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/corsair-scan/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, click
+, fetchFromGitHub
+, mock
+, pytestCheckHook
+, pythonOlder
+, requests
+, tldextract
+, urllib3
+, validators
+}:
+
+buildPythonPackage rec {
+  pname = "corsair-scan";
+  version = "0.2.0";
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "Santandersecurityresearch";
+    repo = "corsair_scan";
+    rev = "v${version}";
+    sha256 = "09jsv5bag7mjy0rxsxjzmg73rjl7qknzr0d7a7himd7v6a4ikpmk";
+  };
+
+  propagatedBuildInputs = [
+    validators
+    requests
+    urllib3
+    tldextract
+    click
+  ];
+
+  checkInputs = [
+    mock
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "'pytest-runner'," ""
+  '';
+
+  pythonImportsCheck = [ "corsair_scan" ];
+
+  meta = with lib; {
+    description = "Python module to check for Cross-Origin Resource Sharing (CORS) misconfigurations";
+    homepage = "https://github.com/Santandersecurityresearch/corsair_scan";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..20ccfd6e0a90
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cot/default.nix
@@ -0,0 +1,87 @@
+{ 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
+  ];
+
+  checkInputs = [
+    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"
+  ] ++ 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..6893458d5cc7
--- /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 = "6.4.2";
+  # uses f strings
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-bDzP6Jw28+W5g3ue5QdHIxAWTzUsn+MyEgt2TJ1grb4=";
+  };
+
+  # No tests in archive
+  doCheck = false;
+  checkInputs = [ 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..72e8f6d45a72
--- /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";
+  };
+
+  checkInputs = [
+    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..52031bab74f7
--- /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";
+
+  checkInputs = [
+    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..7602132c24ae
--- /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;
+    sha256 = "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..5b7e092c42a5
--- /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;
+    sha256 = "sha256-g7Q78XsQhawVxd69tCFU8Ti5KCNLIURzWJgfadDW/hs=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  checkInputs = [ 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..cea3df8eeae1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cpyparsing/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchFromGitHub, cython, pexpect, python }:
+
+buildPythonPackage rec {
+  pname = "cpyparsing";
+  version = "2.4.7.1.1.0";
+
+  src = fetchFromGitHub {
+    owner = "evhub";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1rqj89mb4dz0xk8djh506nrlqfqqdva9qgb5llrvvwjqv3vqnrj4";
+  };
+
+  nativeBuildInputs = [ cython ];
+
+  checkInputs = [ pexpect ];
+
+  checkPhase = "${python.interpreter} tests/cPyparsing_test.py";
+
+  meta = with lib; {
+    homepage = "https://github.com/evhub/cpyparsing";
+    description = "Cython PyParsing implementation";
+    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..ff156187a303
--- /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";
+
+  checkInputs = [ 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..a88cc233ad56
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cramjam/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, rustPlatform
+, stdenv
+, libiconv
+, brotli
+, lz4
+, memory_profiler
+, numpy
+, pytest-benchmark
+, pytestCheckHook
+, python-snappy
+, zstd
+}:
+
+buildPythonPackage rec {
+  pname = "cramjam";
+  version = "2.4.0";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "milesgranger";
+    repo = "pyrus-cramjam";
+    rev = "v${version}";
+    sha256 = "sha256-00KvbiTf8PxYWljLKTRZmPIAbb+PnBleDM4p0AzZhHw=";
+  };
+
+  cargoDeps = rustPlatform.fetchCargoTarball {
+    inherit src;
+    sha256 = "sha256-4y/jeEZjVUbaXtBx5l3Hrbnj3iNYX089K4xexRP+5v0=";
+  };
+
+  nativeBuildInputs = with rustPlatform; [
+    cargoSetupHook
+    maturinBuildHook
+  ];
+  buildInputs = lib.optional stdenv.isDarwin libiconv;
+
+  checkInputs = [
+    brotli
+    lz4
+    memory_profiler
+    numpy
+    pytest-benchmark
+    pytestCheckHook
+    python-snappy
+    zstd
+  ];
+  pytestFlagsArray = [ "--benchmark-disable" ];
+  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..5b084cdd8c84
--- /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.3.1";
+  disabled = !(pythonAtLeast "3.6");
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "42ca7b6ce88b6c7433e2ce47ea884e91ec93104a4b754998be498a8e6c3d37dd";
+  };
+
+  # 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..a7d7dc3ec603
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/crate/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, urllib3
+, geojson
+, isPy3k
+, sqlalchemy
+, pytestCheckHook
+, stdenv
+}:
+
+buildPythonPackage rec {
+  pname = "crate";
+  version = "0.27.1";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-YYzn13yaTTVt4mxbE8wbymGrisraMRRHodydawSy/Uc=";
+  };
+
+  propagatedBuildInputs = [
+    urllib3
+    sqlalchemy
+    geojson
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # network access
+    "test_layer_from_uri"
+  ];
+
+  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";
+    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/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..f4a85fba599f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/crc32c/default.nix
@@ -0,0 +1,20 @@
+{ lib, buildPythonPackage, fetchFromGitHub }:
+
+buildPythonPackage rec {
+  version = "2.2.post0";
+  pname = "crc32c";
+
+  src = fetchFromGitHub {
+    owner = "ICRAR";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-0FgNOVpgJTxRALuufZ7Dt1TwuX+zqw35yCq8kmq4RTc=";
+  };
+
+  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..a75a0c9611b4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/crccheck/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchPypi, isPy3k
+, nose }:
+
+let
+  pname = "crccheck";
+  version = "1.1";
+in buildPythonPackage {
+  inherit pname version;
+
+  checkInputs = [ nose ];
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "45962231cab62b82d05160553eebd9b60ef3ae79dc39527caef52e27f979fa96";
+  };
+
+  disabled = !isPy3k;
+
+  meta = with lib; {
+    description = "Python library for CRCs and checksums";
+    homepage = "https://sourceforge.net/projects/crccheck/";
+    license = licenses.gpl3Plus;
+    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..082369baf73a
--- /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 = "http://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..6b3348472a42
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/criticality-score/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildPythonPackage, fetchPypi, PyGithub, python-gitlab }:
+
+buildPythonPackage rec {
+  pname = "criticality_score";
+  version = "1.0.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0i811a27i87z3j1rw0dwrnw8v0ckbd918ms6shjawhs4cnb1c6x8";
+  };
+
+  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";
+    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..5c2b0e8ba880
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cron-descriptor/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, python
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "cron_descriptor";
+  version = "1.2.30";
+
+  src = fetchFromGitHub {
+    owner = "Salamek";
+    repo = "cron-descriptor";
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-Qei9f0HlIu5sautMEASvxdUqZyXKvHDWJgd3oST1gJo=";
+  };
+
+  # remove tests_require, as we don't do linting anyways
+  postPatch = ''
+    sed -i "/'pep8\|flake8\|pep8-naming',/d" setup.py
+  '';
+
+  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..8f21b00697c0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/croniter/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python-dateutil
+, pytestCheckHook
+, pytz
+, tzlocal
+}:
+
+buildPythonPackage rec {
+  pname = "croniter";
+  version = "1.3.5";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-dZL8DooA2Cr5jfonaLdZg7b7TCrcj20NfJMacVt87+4=";
+  };
+
+  propagatedBuildInputs = [
+    python-dateutil
+  ];
+
+  checkInputs = [
+    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";
+    license = licenses.mit;
+    maintainers = with maintainers; [ costrouc ];
+  };
+}
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..35208bbd7b7b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cronsim/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "cronsim";
+  version = "2.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-nwlSAbD+y0l9jyVSVShzWeC7nC5RZRD/kAhCi3Nd9xY=";
+  };
+
+  checkInputs = [
+    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..14e153cd8b28
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/crossplane/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildPythonPackage, pytestCheckHook, fetchFromGitHub }:
+
+buildPythonPackage rec {
+  pname = "crossplane";
+  version = "0.5.7";
+
+  src = fetchFromGitHub {
+    owner = "nginxinc";
+    repo = "crossplane";
+    rev = "v${version}";
+    sha256 = "0lv3frfvnvz5wjxwh3mwy8nbypv4i62v4bvy5fv7vd6kmbxy1q9l";
+  };
+
+  checkInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "crossplane" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/nginxinc/crossplane";
+    description = "NGINX configuration file parser and builder";
+    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..8b02eaa58961
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/crownstone-cloud/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, aiohttp
+, asynctest
+, buildPythonPackage
+, fetchFromGitHub
+, 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 = version;
+    sha256 = "sha256-CS1zeQiWPnsGCWixCsN9sz08mPORW5sVqIpSFPh0Qt0=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    asynctest
+    certifi
+  ];
+
+  checkInputs = [
+    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..ffc3e8a7667a
--- /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.1.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "crownstone";
+    repo = "crownstone-lib-python-core";
+    rev = version;
+    sha256 = "sha256-SdrvJE76/UrwcJ2Os1WO9cv9++LKu4eKRn1W4qrK8Lw=";
+  };
+
+  propagatedBuildInputs = [
+    pyaes
+  ];
+
+  checkInputs = [
+    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..2c4226c6a3ef
--- /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.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "crownstone";
+    repo = "crownstone-lib-python-sse";
+    rev = version;
+    sha256 = "sha256-O1joOH7HCXYCro26p6foMMpg0UXfOgXD0BXuN50OK7U=";
+  };
+
+  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..163f6a6cec28
--- /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.5.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "crownstone";
+    repo = "crownstone-lib-python-uart";
+    rev = version;
+    sha256 = "sha256-WcEwAqHy3tuRlx1nyc+BKAb+PLD2B55fGSgb8dsbXbM=";
+  };
+
+  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/cryptography/cryptography-py27-warning.patch b/nixpkgs/pkgs/development/python-modules/cryptography/cryptography-py27-warning.patch
new file mode 100644
index 000000000000..8233af78a9de
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cryptography/cryptography-py27-warning.patch
@@ -0,0 +1,14 @@
+Delete the warning that breaks tests of dependent projects.
+
+--- a/src/cryptography/__init__.py
++++ b/src/cryptography/__init__.py
+@@ -33,9 +32,0 @@ __all__ = [
+-
+-if sys.version_info[0] == 2:
+-    warnings.warn(
+-        "Python 2 is no longer supported by the Python core team. Support for "
+-        "it is now deprecated in cryptography, and will be removed in the "
+-        "next release.",
+-        CryptographyDeprecationWarning,
+-        stacklevel=2,
+-    )
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..1442b784cb37
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cryptography/default.nix
@@ -0,0 +1,99 @@
+{ lib
+, stdenv
+, callPackage
+, buildPythonPackage
+, fetchPypi
+, rustPlatform
+, setuptools-rust
+, openssl
+, Security
+, packaging
+, six
+, isPyPy
+, cffi
+, pytestCheckHook
+, pytest-benchmark
+, pytest-subtests
+, pythonOlder
+, pretend
+, libiconv
+, iso8601
+, pytz
+, hypothesis
+}:
+
+let
+  cryptography-vectors = callPackage ./vectors.nix { };
+in
+buildPythonPackage rec {
+  pname = "cryptography";
+  version = "37.0.4"; # Also update the hash in vectors.nix
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Y/nBfA4kdMy+vJMCzi8HtVs7P8shHe0YpC1XZPXBCoI=";
+  };
+
+  cargoDeps = rustPlatform.fetchCargoTarball {
+    inherit src;
+    sourceRoot = "${pname}-${version}/${cargoRoot}";
+    name = "${pname}-${version}";
+    hash = "sha256-f8r6QclTwkgK20CNe9i65ZOqvSUeDc4Emv6BFBhh1hI=";
+  };
+
+  cargoRoot = "src/rust";
+
+  outputs = [ "out" "dev" ];
+
+  nativeBuildInputs = lib.optionals (!isPyPy) [
+    cffi
+  ] ++ [
+    rustPlatform.cargoSetupHook
+    setuptools-rust
+  ] ++ (with rustPlatform; [ rust.cargo rust.rustc ]);
+
+  buildInputs = [ openssl ]
+    ++ lib.optionals stdenv.isDarwin [ Security libiconv ];
+
+  propagatedBuildInputs = lib.optionals (!isPyPy) [
+    cffi
+  ];
+
+  checkInputs = [
+    cryptography-vectors
+    hypothesis
+    iso8601
+    pretend
+    pytestCheckHook
+    pytest-benchmark
+    pytest-subtests
+    pytz
+  ];
+
+  pytestFlagsArray = [
+    "--disable-pytest-warnings"
+  ];
+
+  disabledTestPaths = 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.
+      Our goal is for it to be your "cryptographic standard library". It
+      supports Python 2.7, Python 3.5+, and PyPy 5.4+.
+    '';
+    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..3059d01a4091
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cryptography/vectors.nix
@@ -0,0 +1,26 @@
+{ buildPythonPackage, fetchPypi, lib, cryptography }:
+
+buildPythonPackage rec {
+  pname = "cryptography-vectors";
+  # The test vectors must have the same version as the cryptography package
+  inherit (cryptography) version;
+
+  src = fetchPypi {
+    pname = "cryptography_vectors";
+    inherit version;
+    hash = "sha256-WmFABRDiiTelZUtAxupOPlk8Wq8MIIHFuRLw58+IPqg=";
+  };
+
+  # 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/";
+    # Source: 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..2fd90b23bee0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cryptolyzer/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, certvalidator
+, attrs
+, six
+, urllib3
+, cryptoparser
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "cryptolyzer";
+  version = "0.8.1";
+
+  src = fetchPypi {
+    pname = "CryptoLyzer";
+    inherit version;
+    sha256 = "sha256-FbxSjKxhzlpj3IezuLCQvoeZMG1q+OE/yn5vB/XE1rI=";
+  };
+
+  propagatedBuildInputs = [
+    certvalidator
+    attrs
+    six
+    urllib3
+    cryptoparser
+    requests
+  ];
+
+  doCheck = false; # Tests require networking
+
+  pythonImportsCheck = [ "cryptolyzer" ];
+
+  meta = with lib; {
+    description = "Fast and flexible cryptographic protocol analyzer";
+    homepage = "https://gitlab.com/coroner/cryptolyzer";
+    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..cfac7f20376e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cryptoparser/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, attrs
+, six
+, asn1crypto
+, python-dateutil
+}:
+
+buildPythonPackage rec {
+  pname = "cryptoparser";
+  version = "0.8.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-kJg8d1PoGIC0feefbJM8oyXcRyMGdg1wWkQUl/nSNCo=";
+  };
+
+  propagatedBuildInputs = [
+    attrs
+    six
+    asn1crypto
+    python-dateutil
+  ];
+
+  pythonImportsCheck = [ "cryptoparser" ];
+
+  meta = with lib; {
+    description = "Fast and flexible security protocol parser and generator";
+    homepage = "https://gitlab.com/coroner/cryptoparser";
+    license = licenses.mpl20;
+    maintainers = with maintainers; [ kranzes ];
+  };
+}
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..393dcd5e9d83
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/crytic-compile/default.nix
@@ -0,0 +1,27 @@
+{ lib, buildPythonPackage, fetchFromGitHub, pythonOlder, pysha3, setuptools }:
+
+buildPythonPackage rec {
+  pname = "crytic-compile";
+  version = "0.2.3";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "crytic";
+    repo = "crytic-compile";
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-l8a9QXERpkVrx7zHluMlb3zBvJSODsviNtJPzvL3hDo=";
+  };
+
+  propagatedBuildInputs = [ pysha3 setuptools ];
+
+  doCheck = false;
+  pythonImportsCheck = [ "crytic_compile" ];
+
+  meta = with lib; {
+    description = "Abstraction layer for smart contract build systems";
+    homepage = "https://github.com/crytic/crytic-compile";
+    license = licenses.agpl3Plus;
+    maintainers = with maintainers; [ SuperSandro2000 arturcygan ];
+  };
+}
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-parser/default.nix b/nixpkgs/pkgs/development/python-modules/css-parser/default.nix
new file mode 100644
index 000000000000..c4d3b101c87d
--- /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.7";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "25e096c63262dd249010ce36dab4cacd9595783ee09b5ed699ef12ab864ebbd1";
+  };
+
+  # 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/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..04b6dc36afab
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cssselect/default.nix
@@ -0,0 +1,17 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "cssselect";
+  version = "1.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f95f8dedd925fd8f54edb3d2dfb44c190d9d18512377d3c1e2388d16126879bc";
+  };
+
+  # AttributeError: 'module' object has no attribute 'tests'
+  doCheck = false;
+
+  meta = with lib; {
+  };
+}
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..5904f80ac2a2
--- /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.6.0";
+  format = "pyproject";
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-W11t6oGl6wyco58RbIV43UE3eAYMlMH1EZY3FhiQkyU=";
+  };
+
+  postPatch = ''
+    sed -i '/^addopts/d' pyproject.toml
+  '';
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [ tinycss2 ];
+
+  checkInputs = [ 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..0cb99dfee1c6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cssutils/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, buildPythonPackage
+, pythonAtLeast
+, pythonOlder
+, fetchpatch
+, fetchPypi
+, setuptools
+, setuptools-scm
+, importlib-metadata
+, cssselect
+, jaraco-test
+, lxml
+, mock
+, pytestCheckHook
+, importlib-resources
+}:
+
+buildPythonPackage rec {
+  pname = "cssutils";
+  version = "2.5.1";
+
+  disabled = pythonOlder "3.7";
+
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-tKTaWOeDJuyfSp01VQBN33BvPpn3oQJsGIDwk0NiuLQ=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  checkInputs = [
+    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/csvw/default.nix b/nixpkgs/pkgs/development/python-modules/csvw/default.nix
new file mode 100644
index 000000000000..7ae79f4ec59f
--- /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
+  ];
+
+  checkInputs = [
+    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/cucumber-tag-expressions/default.nix b/nixpkgs/pkgs/development/python-modules/cucumber-tag-expressions/default.nix
new file mode 100644
index 000000000000..f286cd4a7f02
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cucumber-tag-expressions/default.nix
@@ -0,0 +1,21 @@
+{ lib, fetchPypi, buildPythonPackage, pytest, pytest-html }:
+
+buildPythonPackage rec {
+  pname = "cucumber-tag-expressions";
+  version = "4.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "e314d5fed6eebb2f90380271f562248fb15e18636764faf40f4dde4b28b1f960";
+  };
+
+  checkInputs = [ pytest pytest-html ];
+  checkPhase = "pytest tests/*/*.py";
+
+  meta = with lib; {
+    homepage = "https://github.com/cucumber/tag-expressions-python";
+    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..42f1d77b12b9
--- /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
+  ];
+
+  checkInputs = [ 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; [ globin ];
+  };
+}
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..ffe017698df1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cupy/default.nix
@@ -0,0 +1,77 @@
+{ lib, buildPythonPackage
+, fetchPypi, isPy3k, cython
+, fastrlock, numpy, six, wheel, pytestCheckHook, mock, setuptools
+, cudaPackages
+, addOpenGLRunpath
+}:
+
+let
+  inherit (cudaPackages) cudatoolkit cudnn cutensor nccl;
+in buildPythonPackage rec {
+  pname = "cupy";
+  version = "10.6.0";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-9jWpfd4l4LSptJewdQaaurm/huHcKv48+XOZDCLTJV8=";
+  };
+
+  # 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
+    six
+    setuptools
+    wheel
+  ];
+
+  checkInputs = [
+    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/";
+    license = licenses.mit;
+    platforms = [ "x86_64-linux" ];
+    maintainers = with maintainers; [ hyphon81 ];
+
+    # See https://github.com/NixOS/nixpkgs/pull/179912#issuecomment-1206265922.
+    broken = true;
+  };
+}
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..7a66e4796648
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/curio/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, pytestCheckHook
+, sphinx
+, stdenv
+}:
+
+buildPythonPackage rec {
+  pname = "curio";
+  version = "1.5";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-rwghLlkLt9qOTMOcQgEnEUlNwg1iLxYhVbopbMLjvBA=";
+  };
+
+  checkInputs = [
+    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
+   ] ++ lib.optionals stdenv.isDarwin [
+     "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
+   ];
+
+  pythonImportsCheck = [ "curio" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/dabeaz/curio";
+    description = "Library for performing concurrent I/O with coroutines in Python";
+    license = licenses.bsd3;
+    maintainers = [ maintainers.marsam ];
+  };
+}
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..b05cb770a4bd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/curtsies/default.nix
@@ -0,0 +1,27 @@
+{ stdenv, lib, buildPythonPackage, fetchPypi, pythonOlder, blessings, mock, nose, pyte, cwcwidth, typing ? null}:
+
+buildPythonPackage rec {
+  pname = "curtsies";
+  version = "0.3.10";
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "11efbb153d9cb22223dd9a44041ea0c313b8411e246e7f684aa843f6aa9c1600";
+  };
+
+  propagatedBuildInputs = [ blessings cwcwidth ]
+    ++ lib.optionals (pythonOlder "3.5") [ typing ];
+
+  checkInputs = [ mock pyte nose ];
+
+  checkPhase = ''
+    nosetests tests
+  '';
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    description = "Curses-like terminal wrapper, with colored strings!";
+    homepage = "https://github.com/bpython/curtsies";
+    license = licenses.mit;
+    maintainers = with maintainers; [ flokli ];
+  };
+}
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/cvxopt/default.nix b/nixpkgs/pkgs/development/python-modules/cvxopt/default.nix
new file mode 100644
index 000000000000..dfae672f95e0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cvxopt/default.nix
@@ -0,0 +1,72 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPyPy
+, python
+, blas, lapack # build segfaults with 64-bit blas
+, suitesparse
+, glpk ? null
+, gsl ? null
+, fftw ? null
+, withGlpk ? true
+, withGsl ? true
+, withFftw ? true
+}:
+
+assert (!blas.isILP64) && (!lapack.isILP64);
+
+buildPythonPackage rec {
+  pname = "cvxopt";
+  version = "1.3.0";
+
+  disabled = isPyPy; # hangs at [translation:info]
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-ALGyMvnR+QLVeKnXWBS2f6AgdY1a5CLijKjO9iafpcY=";
+  };
+
+  buildInputs = [ blas lapack ];
+
+  # similar to Gsl, glpk, fftw there is also a dsdp interface
+  # but dsdp is not yet packaged in nixpkgs
+  preConfigure = ''
+    export CVXOPT_BLAS_LIB=blas
+    export CVXOPT_LAPACK_LIB=lapack
+    export CVXOPT_SUITESPARSE_LIB_DIR=${lib.getLib suitesparse}/lib
+    export CVXOPT_SUITESPARSE_INC_DIR=${lib.getDev suitesparse}/include
+  '' + lib.optionalString withGsl ''
+    export CVXOPT_BUILD_GSL=1
+    export CVXOPT_GSL_LIB_DIR=${gsl}/lib
+    export CVXOPT_GSL_INC_DIR=${gsl}/include
+  '' + lib.optionalString withGlpk ''
+    export CVXOPT_BUILD_GLPK=1
+    export CVXOPT_GLPK_LIB_DIR=${glpk}/lib
+    export CVXOPT_GLPK_INC_DIR=${glpk}/include
+  '' + lib.optionalString withFftw ''
+    export CVXOPT_BUILD_FFTW=1
+    export CVXOPT_FFTW_LIB_DIR=${fftw}/lib
+    export CVXOPT_FFTW_INC_DIR=${fftw.dev}/include
+  '';
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest discover -s tests
+  '';
+
+  meta = with lib; {
+    homepage = "http://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..033af1fb5d92
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cvxpy/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, stdenv
+, pythonOlder
+, buildPythonPackage
+, fetchPypi
+, cvxopt
+, ecos
+, numpy
+, osqp
+, scipy
+, scs
+, useOpenmp ? (!stdenv.isDarwin)
+  # Check inputs
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "cvxpy";
+  version = "1.2.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-bWdkJkPR3bLyr1m0Zrh9QsSi42eDGte0PDO1nu+ltQ4=";
+  };
+
+  propagatedBuildInputs = [
+    cvxopt
+    ecos
+    numpy
+    osqp
+    scipy
+    scs
+  ];
+
+  # Required flags from https://github.com/cvxgrp/cvxpy/releases/tag/v1.1.11
+  preBuild = lib.optionalString useOpenmp ''
+    export CFLAGS="-fopenmp"
+    export LDFLAGS="-lgomp"
+  '';
+
+  checkInputs = [ pytestCheckHook ];
+
+  pytestFlagsArray = [ "./cvxpy" ];
+
+   # Disable the slowest benchmarking tests, cuts test time in half
+  disabledTests = [
+    "test_tv_inpainting"
+    "test_diffcp_sdp_example"
+  ] ++ lib.optionals stdenv.isAarch64 [
+    "test_ecos_bb_mi_lp_2" # https://github.com/cvxgrp/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/cvxgrp/cvxpy/releases";
+    changelog = "https://github.com/cvxgrp/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..f6bab4ffc4bc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cwcwidth/default.nix
@@ -0,0 +1,39 @@
+{ lib, buildPythonPackage, fetchPypi, cython, pytestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "cwcwidth";
+  version = "0.1.7";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-wNZH4S46SxWogeHYT3lpN1FmSEieARJXI33CF51rGVE=";
+  };
+
+  nativeBuildInputs = [ cython ];
+
+  checkInputs = [ 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/cx_freeze/default.nix b/nixpkgs/pkgs/development/python-modules/cx_freeze/default.nix
new file mode 100644
index 000000000000..454e2e8f2ccf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cx_freeze/default.nix
@@ -0,0 +1,33 @@
+{ stdenv, lib, buildPythonPackage, pythonOlder, fetchPypi, ncurses, importlib-metadata }:
+
+buildPythonPackage rec {
+  pname = "cx_Freeze";
+  version = "6.11.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-jzowyeM5TykGVeNG07RgkQZWswrGNHqHSZu1rTZcbnw=";
+  };
+
+  disabled = pythonOlder "3.5";
+
+  propagatedBuildInputs = [
+    importlib-metadata # upstream has this for 3.8 as well
+    ncurses
+  ];
+
+  # timestamp need to come after 1980 for zipfiles and nix store is set to epoch
+  prePatch = ''
+    substituteInPlace cx_Freeze/freezer.py --replace "os.stat(module.file).st_mtime" "time.time()"
+  '';
+
+  # fails to find Console even though it exists on python 3.x
+  doCheck = false;
+
+  meta = with lib; {
+    broken = (stdenv.isLinux && stdenv.isAarch64);
+    description = "A set of scripts and modules for freezing Python scripts into executables";
+    homepage = "https://marcelotduarte.github.io/cx_Freeze/";
+    license = licenses.psfl;
+  };
+}
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..117b12145764
--- /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 = teams.determinatesystems.members;
+  };
+}
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..b9bd167c6a94
--- /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";
+  };
+
+  checkInputs = [ 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..cd69d5b1b5ed
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cyclonedx-python-lib/default.nix
@@ -0,0 +1,73 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, importlib-metadata
+, jsonschema
+, lxml
+, packageurl-python
+, poetry-core
+, python
+, pythonOlder
+, requirements-parser
+, sortedcontainers
+, setuptools
+, toml
+, types-setuptools
+, types-toml
+, xmldiff
+}:
+
+buildPythonPackage rec {
+  pname = "cyclonedx-python-lib";
+  version = "2.7.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "CycloneDX";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-c/KhoJOa121/h0n0GUazjUFChnUo05ThD+fuZXc5/Pk=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    importlib-metadata
+    packageurl-python
+    requirements-parser
+    setuptools
+    sortedcontainers
+    toml
+    types-setuptools
+    types-toml
+  ];
+
+  checkInputs = [
+    jsonschema
+    lxml
+    xmldiff
+  ];
+
+  pythonImportsCheck = [
+    "cyclonedx"
+  ];
+
+ checkPhase = ''
+   runHook preCheck
+   # Tests require network access
+   rm tests/test_output_json.py
+   ${python.interpreter} -m unittest discover -s tests -v
+   runHook postCheck
+ '';
+
+  meta = with lib; {
+    description = "Python library for generating CycloneDX SBOMs";
+    homepage = "https://github.com/CycloneDX/cyclonedx-python-lib";
+    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..d2d010e9b12f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cymem/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, cython
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "cymem";
+  version = "2.0.3";
+
+  src = fetchFromGitHub {
+    owner = "explosion";
+    repo = "cymem";
+    rev = "v${version}";
+    sha256 = "0cqz6whq4zginxjnh4cfqlsh535p4qz295ymvjchp71fv8mz11f6";
+  };
+
+  propagatedBuildInputs = [
+    cython
+  ];
+
+  prePatch = ''
+    substituteInPlace setup.py \
+      --replace "wheel>=0.32.0,<0.33.0" "wheel>=0.31.0"
+  '';
+
+  checkPhase = ''
+    cd cymem/tests
+    ${python.interpreter} -m unittest discover -p "*test*"
+  '';
+
+  meta = with lib; {
+    description = "Cython memory pool for RAII-style memory management";
+    homepage = "https://github.com/explosion/cymem";
+    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..a553aeab65c0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cypari2/default.nix
@@ -0,0 +1,66 @@
+{ 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.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "03cd45edab8716ebbfdb754e65fea72e873c73dc91aec098fe4a01e35324ac7a";
+  };
+
+  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://git.sagemath.org/sage.git/plain/build/pkgs/cypari/patches/trashcan.patch?id=b6ea17ef8e4d652de0a85047bac8d41e90b25555";
+      sha256 = "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"
+    ${python.pythonForBuild.pkgs.bootstrapped-pip}/bin/pip install . --no-index --no-warn-script-location --prefix="$out" --no-cache
+  '';
+
+  nativeBuildInputs = [
+    pari
+  ];
+
+  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..8ef0f4cac78c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cypherpunkpay/default.nix
@@ -0,0 +1,97 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, APScheduler
+, bitstring
+, cffi
+, ecdsa
+, monero
+, pypng
+, pyqrcode
+, pyramid
+, pyramid_jinja2
+, pysocks
+, requests
+, tzlocal
+, waitress
+, yoyo-migrations
+, pytestCheckHook
+, pytest-cov
+, webtest
+}:
+
+buildPythonPackage rec {
+  pname = "cypherpunkpay";
+  version = "1.0.16";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "CypherpunkPay";
+    repo = "CypherpunkPay";
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-X0DB0PVwR0gRnt3jixFzglWAOPKBMvqTOG6pK6OJ03w=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'monero = "^0.99"' 'monero = ">=0.99"' \
+      --replace 'pypng = "^0.0.20"' 'pypng = ">=0.0.20"' \
+      --replace 'tzlocal = "2.1"' 'tzlocal = ">=2.1"'
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    APScheduler
+    bitstring
+    cffi
+    ecdsa
+    monero
+    pypng
+    pyqrcode
+    pyramid
+    pyramid_jinja2
+    pysocks
+    requests
+    tzlocal
+    waitress
+    yoyo-migrations
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    pytest-cov
+    webtest
+  ];
+
+  disabledTestPaths = [
+    # performance test
+    "test/unit/tools/pbkdf2_test.py"
+    # tests require network connection
+    "test/network/explorers/bitcoin"
+    "test/network/net/http_client"
+    "test/network/prices"
+    # tests require bitcoind running
+    "test/network/full_node_clients"
+    # tests require lnd running
+    "test/network/ln"
+    # tests require tor running
+    "test/network/net/tor_client"
+    # tests require the full environment running
+    "test/acceptance/views"
+    "test/acceptance/views_admin"
+    "test/acceptance/views_donations"
+    "test/acceptance/views_dummystore"
+  ];
+
+  meta = with lib; {
+    description = "Modern self-hosted software for accepting Bitcoin";
+    homepage = "https://cypherpunkpay.org";
+    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/cytoolz/default.nix b/nixpkgs/pkgs/development/python-modules/cytoolz/default.nix
new file mode 100644
index 000000000000..42305b455799
--- /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.0";
+  disabled = isPy27 || isPyPy;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-wQWwX4XgP7zWAkQ3WWjmLkT+eYwVo1Mcki1TEBjSJBI=";
+  };
+
+  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
+  '';
+
+  checkInputs = [ pytestCheckHook ];
+
+  meta = {
+    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/d2to1/default.nix b/nixpkgs/pkgs/development/python-modules/d2to1/default.nix
new file mode 100644
index 000000000000..8a48ddcb13af
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/d2to1/default.nix
@@ -0,0 +1,25 @@
+{ buildPythonPackage
+, lib
+, fetchFromGitHub
+, nose
+}:
+buildPythonPackage rec {
+  pname = "d2to1";
+  version = "0.2.12.post1";
+
+  checkInputs = [ nose ];
+
+  src = fetchFromGitHub {
+    owner = "embray";
+    repo = pname;
+    rev = version;
+    sha256 = "1hzq51qbzsc27yy8swp08kf42mamag7qcabbrigzj4m6ivb5chi2";
+  };
+
+  meta = with lib;{
+    description = "Support for distutils2-like setup.cfg files as package metadata";
+    homepage = "https://github.com/embray/d2to1";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ makefu ];
+  };
+}
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..ba74695fb5ea
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dacite/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, pythonOlder
+, pythonAtLeast
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "dacite";
+  version = "1.6.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "konradhalas";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0nv2bnj3bq2v08ac4p583cnpjq2d6bv5isycgji5i5wg1y082a3d";
+  };
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = lib.optionals (pythonAtLeast "3.10") [
+    # https://github.com/konradhalas/dacite/issues/167
+    "test_from_dict_with_union_and_wrong_data"
+  ];
+
+  pythonImportsCheck = [
+    "dacite"
+  ];
+
+  meta = with lib; {
+    description = "Python helper to create data classes from dictionaries";
+    homepage = "https://github.com/konradhalas/dacite";
+    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..ac470b83f7b2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/daemonocle/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, click
+, psutil
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "daemonocle";
+  version = "1.0.2";
+
+  src = fetchFromGitHub {
+    owner = "jnrbsn";
+    repo = "daemonocle";
+    rev = "v${version}";
+    hash = "sha256-kDCbosXTIffuCzHcReXhiW4YPbxDW3OPnTbMC/EGJrM=";
+  };
+
+  propagatedBuildInputs = [ click psutil ];
+  checkInputs = [ pytestCheckHook ];
+
+  # One third of the tests fail on the sandbox with
+  # "psutil.NoSuchProcess: no process found with pid 0".
+  doCheck = false;
+  disabledTests = [ "sudo" ];
+  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 = [ maintainers.AluisioASG ];
+    platforms = platforms.unix;
+  };
+}
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..1cafda70872a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dalle-mini/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, einops
+, emoji
+, flax
+, ftfy
+, jax
+, jaxlib
+, pillow
+, transformers
+, unidecode
+, wandb
+}:
+
+buildPythonPackage rec {
+  pname = "dalle-mini";
+  version = "0.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-/wGIuYSWEUgJmeRN5K9/xuoCs+hpFX4/Tu1un1C4ljk=";
+  };
+
+  format = "setuptools";
+
+  buildInputs = [
+    jaxlib
+  ];
+
+  propagatedBuildInputs = [
+    einops
+    emoji
+    flax
+    ftfy
+    jax
+    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..90b108e3bc74
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/daphne/default.nix
@@ -0,0 +1,35 @@
+{ lib, stdenv, buildPythonPackage, isPy3k, fetchFromGitHub
+, asgiref, autobahn, twisted, pytest-runner
+, hypothesis, pytest, pytest-asyncio, service-identity, pyopenssl
+}:
+buildPythonPackage rec {
+  pname = "daphne";
+  version = "3.0.2";
+
+  disabled = !isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "django";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-KWkMV4L7bA2Eo/u4GGif6lmDNrZAzvYyDiyzyWt9LeI=";
+  };
+
+  nativeBuildInputs = [ pytest-runner ];
+
+  propagatedBuildInputs = [ asgiref autobahn twisted service-identity pyopenssl ];
+
+  checkInputs = [ hypothesis pytest pytest-asyncio ];
+
+  doCheck = !stdenv.isDarwin; # most tests fail on darwin
+
+  checkPhase = ''
+    py.test
+  '';
+
+  meta = with lib; {
+    description = "Django ASGI (HTTP/WebSocket) server";
+    license = licenses.bsd3;
+    homepage = "https://github.com/django/daphne";
+  };
+}
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..96a4eccbc582
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dasbus/default.nix
@@ -0,0 +1,21 @@
+{ lib, buildPythonPackage, fetchPypi, pygobject3, dbus }:
+
+buildPythonPackage rec {
+  pname = "dasbus";
+  version = "1.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-FJrY/Iw9KYMhq1AVm1R6soNImaieR+IcbULyyS5W6U0=";
+  };
+
+  propagatedBuildInputs = [ pygobject3 ];
+  checkInputs = [ dbus ];
+
+  meta = with lib; {
+    homepage = "https://github.com/rhinstaller/dasbus";
+    description = "DBus library in Python3";
+    license = licenses.lgpl21Only;
+    maintainers = with maintainers; [ fortuneteller2k ];
+  };
+}
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..259e760fee32
--- /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;
+    sha256 = "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..e327f4e76168
--- /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;
+    sha256 = "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..3d1fb2621d6e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dash/default.nix
@@ -0,0 +1,80 @@
+{ lib
+, buildPythonPackage
+, celery
+, dash-core-components
+, dash-html-components
+, dash-table
+, diskcache
+, fetchFromGitHub
+, flask
+, flask-compress
+, mock
+, multiprocess
+, plotly
+, psutil
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, redis
+}:
+
+buildPythonPackage rec {
+  pname = "dash";
+  version = "2.6.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "plotly";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-pZax5qkQ73SVhIKVR+q6xAm6hp+v7jSu6b9HBk5Rr8w=";
+  };
+
+  propagatedBuildInputs = [
+    plotly
+    flask
+    flask-compress
+    dash-core-components
+    dash-html-components
+    dash-table
+  ];
+
+  passthru.optional-dependencies = {
+    celery = [
+      celery
+      redis
+    ];
+    diskcache = [
+      diskcache
+      multiprocess
+      psutil
+    ];
+  };
+
+  checkInputs = [
+    pytestCheckHook
+    pytest-mock
+    mock
+    pyyaml
+  ];
+
+  disabledTestPaths = [
+    "tests/unit/test_browser.py"
+    "tests/unit/test_app_runners.py" # Use selenium
+    "tests/integration"
+  ];
+
+  pythonImportsCheck = [
+    "dash"
+  ];
+
+  meta = with lib; {
+    description = "Python framework for building analytical web applications";
+    homepage = "https://dash.plot.ly/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ antoinerg ];
+  };
+}
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..5ef21c545fa2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dask-gateway-server/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, colorlog
+, cryptography
+, fetchFromGitHub
+, go
+, pythonOlder
+, traitlets
+}:
+
+buildPythonPackage rec {
+  pname = "dask-gateway-server";
+  # update dask-gateway-server lock step with dask-gateway
+  version = "2022.4.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "dask";
+    repo = "dask-gateway";
+    rev = version;
+    hash = "sha256-Grjp7gt3Pos4cQSGV/Rynz6W/zebRI0OqDiWT4cTh8I=";
+  };
+
+  sourceRoot = "${src.name}/${pname}";
+
+  nativeBuildInputs = [
+    go
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    colorlog
+    cryptography
+    traitlets
+  ];
+
+  preBuild = ''
+    export HOME=$(mktemp -d)
+    export GO111MODULE=off
+  '';
+
+  # 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; [ costrouc ];
+  };
+}
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..f0e5a54c95bf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dask-gateway/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, aiohttp
+, dask
+, distributed
+}:
+
+buildPythonPackage rec {
+  pname = "dask-gateway";
+  # update dask-gateway lock step with dask-gateway-server
+  version = "2022.6.1";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "dask";
+    repo = "dask-gateway";
+    rev = "refs/tags/${version}";
+    hash = "sha256-PsagZdEPpeuZH9hFL98xB5z6zOdd4Cx/skGQ0eOYkCA=";
+  };
+
+  sourceRoot = "source/dask-gateway";
+
+  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; [ costrouc ];
+  };
+}
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..bd9b468064dd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dask-glm/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, buildPythonPackage
+, cloudpickle
+, dask
+, distributed
+, fetchPypi
+, multipledispatch
+, pytestCheckHook
+, pythonOlder
+, scikit-learn
+, scipy
+, setuptools-scm
+, sparse
+}:
+
+buildPythonPackage rec {
+  pname = "dask-glm";
+  version = "0.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-WLhs6/BP5bnlgJLhxGfjLmDQHhG3H9xii6qp/G0a3uU=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    cloudpickle
+    distributed
+    multipledispatch
+    scikit-learn
+    scipy
+    sparse
+  ] ++ dask.optional-dependencies.array;
+
+  checkInputs = [
+    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"
+  ];
+
+  meta = with lib; {
+    description = "Generalized Linear Models with Dask";
+    homepage = "https://github.com/dask/dask-glm/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ costrouc ];
+  };
+}
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..1d2189f8a739
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dask-image/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, dask
+, fetchPypi
+, numpy
+, pims
+, pytestCheckHook
+, pythonOlder
+, scikitimage
+, scipy
+}:
+
+buildPythonPackage rec {
+  pname = "dask-image";
+  version = "2021.12.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Nb5JYmvQHD44khKBJqJ9XuMmahmKjjx+MNWervcS/Pk=";
+  };
+
+  propagatedBuildInputs = [
+    dask
+    numpy
+    scipy
+    pims
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    scikitimage
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "--flake8" ""
+  '';
+
+  pythonImportsCheck = [
+    "dask_image"
+  ];
+
+  meta = with lib; {
+    broken = (stdenv.isLinux && stdenv.isAarch64);
+    description = "Distributed image processing";
+    homepage = "https://github.com/dask/dask-image";
+    license = licenses.bsdOriginal;
+    maintainers = with maintainers; [ costrouc ];
+  };
+}
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..cc56413eea39
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dask-jobqueue/default.nix
@@ -0,0 +1,57 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, dask
+, distributed
+, docrep
+, fetchPypi
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "dask-jobqueue";
+  version = "0.7.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-XoQwazgJuFvhoEezhhGu2YvIp+VFAe7dhGIEVnuQ5kM=";
+  };
+
+  propagatedBuildInputs = [
+    dask
+    distributed
+    docrep
+  ];
+
+  checkInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    # Do not run entire tests suite (requires slurm, sge, etc.)
+    "dask_jobqueue/tests/test_jobqueue_core.py"
+  ];
+
+  disabledTests = [
+    "test_import_scheduler_options_from_config"
+    "test_security"
+  ];
+
+  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; [ costrouc ];
+  };
+}
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..ee3365955db5
--- /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 = "2022.5.27";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Y2nTk0GSvMGSP87oTD+4+8zsoQITeQEHC6Px2eOGzOQ=";
+  };
+
+  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; [ costrouc ];
+  };
+}
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..ecc5ebf60942
--- /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; [ costrouc ];
+  };
+}
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..6f4886d409fc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dask-yarn/default.nix
@@ -0,0 +1,49 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, distributed
+, dask
+, grpcio
+, skein
+}:
+
+buildPythonPackage rec {
+  pname = "dask-yarn";
+  version = "0.9";
+
+  src = fetchFromGitHub {
+    owner = "dask";
+    repo = pname;
+    rev = version;
+    hash = "sha256-/BTsxQSiVQrihrCa9DE7pueyg3aPAdjd/Dt4dpUwdtM=";
+  };
+
+  propagatedBuildInputs = [
+    distributed
+    dask
+    grpcio
+    skein
+  ];
+
+  checkInputs = [ pytestCheckHook ];
+  preCheck = ''
+    export HOME=$TMPDIR
+  '';
+  pythonImportsCheck = [ "dask_yarn" ];
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    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 ];
+  };
+}
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..8453b3e0ec9c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dask/default.nix
@@ -0,0 +1,135 @@
+{ lib
+, stdenv
+, bokeh
+, buildPythonPackage
+, cloudpickle
+, distributed
+, fastparquet
+, fetchFromGitHub
+, fetchpatch
+, fsspec
+, jinja2
+, numpy
+, packaging
+, pandas
+, partd
+, pyarrow
+, pytest-rerunfailures
+, pytest-xdist
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, scipy
+, toolz
+, zarr
+}:
+
+buildPythonPackage rec {
+  pname = "dask";
+  version = "2022.7.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "dask";
+    repo = pname;
+    rev = version;
+    hash = "sha256-O5/TNeta0V0v9WTpPmF/kJMJ40ANo6rcRtzurr5/SwA=";
+  };
+
+  propagatedBuildInputs = [
+    cloudpickle
+    fsspec
+    packaging
+    partd
+    pyyaml
+    toolz
+  ];
+
+  passthru.optional-dependencies = {
+    array = [
+      numpy
+    ];
+    complete = [
+      distributed
+    ];
+    dataframe = [
+      numpy
+      pandas
+    ];
+    distributed = [
+      distributed
+    ];
+    diagnostics = [
+      bokeh
+      jinja2
+    ];
+  };
+
+  checkInputs = [
+    fastparquet
+    pyarrow
+    pytestCheckHook
+    pytest-rerunfailures
+    pytest-xdist
+    scipy
+    zarr
+  ];
+
+  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 "version=versioneer.get_version()," "version='${version}'," \
+      --replace "cmdclass=versioneer.get_cmdclass()," ""
+
+    substituteInPlace setup.cfg \
+      --replace " --durations=10" "" \
+      --replace " -v" ""
+  '';
+
+  pytestFlagsArray = [
+    # Rerun failed tests up to three times
+    "--reruns 3"
+    # Don't run tests that require network access
+    "-m 'not network'"
+    # Ignore warning about pyarrow 5.0.0 feautres
+    "-W"
+    "ignore::FutureWarning"
+  ];
+
+  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"
+  ] ++ [
+    "test_chunksize_files"
+  ];
+
+  __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..24551340a0a8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/databases/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, sqlalchemy
+, aiocontextvars
+, aiopg
+, pythonOlder
+, pytestCheckHook
+, pymysql
+, asyncpg
+, aiomysql
+, aiosqlite
+}:
+
+buildPythonPackage rec {
+  pname = "databases";
+  version = "0.6.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "encode";
+    repo = pname;
+    rev = version;
+    hash = "sha256-kHsA9XpolGmtuAGzRTj61igooLG9/LBQyv7TtuqiJ/A=";
+  };
+
+  propagatedBuildInputs = [
+    aiopg
+    aiomysql
+    aiosqlite
+    asyncpg
+    pymysql
+    sqlalchemy
+  ] ++ lib.optionals (pythonOlder "3.7") [
+    aiocontextvars
+  ];
+
+  checkInputs = [
+    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";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ costrouc ];
+  };
+}
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..eafd7d2e8bc9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/databricks-cli/default.nix
@@ -0,0 +1,43 @@
+{ lib, buildPythonPackage, fetchPypi
+, click
+, oauthlib
+, requests
+, tabulate
+, six
+, configparser
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "databricks-cli";
+  version = "0.17.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-ZfFcPfL/uqREwF8zK7KKuIn6wMnaGFOx6W/e/sPGnAw=";
+  };
+
+  checkInputs = [
+    pytest
+  ];
+
+  checkPhase = "pytest tests";
+  # tests folder is missing in PyPI
+  doCheck = false;
+
+  propagatedBuildInputs = [
+    click
+    oauthlib
+    requests
+    tabulate
+    six
+    configparser
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/databricks/databricks-cli";
+    description = "A command line interface for Databricks";
+    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..7a494e55d8c6
--- /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 = "10.4.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-Dezqn6rZysRhDQFUuTgXdoJL9dn21Bx2QlryBG9MtR0=";
+  };
+
+  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/dataclasses-json/default.nix b/nixpkgs/pkgs/development/python-modules/dataclasses-json/default.nix
new file mode 100644
index 000000000000..2a4fd2cef42b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dataclasses-json/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, typing-inspect
+, marshmallow-enum
+, hypothesis
+, mypy
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "dataclasses-json";
+  version = "0.5.7";
+
+  src = fetchFromGitHub {
+    owner = "lidatong";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1xv9br6mm5pcwfy10ykbc1c0n83fqyj1pa81z272kqww7wpkkp6j";
+  };
+
+  propagatedBuildInputs = [
+    typing-inspect
+    marshmallow-enum
+  ];
+
+  checkInputs = [
+    hypothesis
+    mypy
+    pytestCheckHook
+  ];
+
+  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";
+    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..72ef9877d181
--- /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
+  ];
+
+  checkInputs = [
+    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/dataclasses/default.nix b/nixpkgs/pkgs/development/python-modules/dataclasses/default.nix
new file mode 100644
index 000000000000..c276e9d000b2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dataclasses/default.nix
@@ -0,0 +1,21 @@
+{ lib, buildPythonPackage, fetchPypi, isPy36 }:
+
+buildPythonPackage rec {
+  pname = "dataclasses";
+  version = "0.8";
+
+  # backport only works on Python 3.6, and is in the standard library in Python 3.7
+  disabled = !isPy36;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "8479067f342acf957dc82ec415d355ab5edb7e7646b90dc6e2fd1d96ad084c97";
+  };
+
+  meta = with lib; {
+    description = "An implementation of PEP 557: Data Classes";
+    homepage = "https://github.com/ericvsmith/dataclasses";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ catern ];
+  };
+}
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..4b6338412673
--- /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.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-VASUQKiW3lJH7i57eqVCX5OayDLDftshAfjTA26Jyqg=";
+  };
+
+  # 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..7d32650302f4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/datadog/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, hatchling
+, decorator
+, requests
+, typing ? null
+, configparser
+, click
+, freezegun
+, mock
+, pytestCheckHook
+, pytest-vcr
+, python-dateutil
+, vcrpy
+}:
+
+buildPythonPackage rec {
+  pname = "datadog";
+  version = "0.44.0";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-BxFw8MfvIlEdv3+b12xL5QDuLT1SBykApch7VJXSxzM=";
+  };
+
+  postPatch = ''
+    find . -name '*.pyc' -exec rm {} \;
+  '';
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [ decorator requests ]
+    ++ lib.optional (pythonOlder "3.5") typing
+    ++ lib.optional (pythonOlder "3.0") configparser;
+
+  checkInputs = [
+    click
+    freezegun
+    mock
+    pytestCheckHook
+    pytest-vcr
+    python-dateutil
+    vcrpy
+  ];
+
+  disabledTestPaths = [
+    "tests/performance"
+  ];
+
+  disabledTests = [
+    "test_default_settings_set"
+  ];
+
+  pythonImportsCheck = [ "datadog" ];
+
+  meta = with lib; {
+    description = "The Datadog Python library";
+    license = licenses.bsd3;
+    homepage = "https://github.com/DataDog/datadogpy";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/datafusion/Cargo.lock.patch b/nixpkgs/pkgs/development/python-modules/datafusion/Cargo.lock.patch
new file mode 100644
index 000000000000..e4e5eca8af4c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/datafusion/Cargo.lock.patch
@@ -0,0 +1,78 @@
+diff --git a/Cargo.lock b/Cargo.lock
+index fa84a54c..3d790e1c 100644
+--- a/Cargo.lock
++++ b/Cargo.lock
+@@ -57,9 +57,9 @@ checksum = "be4dc07131ffa69b8072d35f5007352af944213cde02545e2103680baed38fcd"
+ 
+ [[package]]
+ name = "arrow"
+-version = "6.0.0"
++version = "6.5.0"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+-checksum = "337e668497751234149fd607f5cb41a6ae7b286b6329589126fe67f0ac55d637"
++checksum = "216c6846a292bdd93c2b93c1baab58c32ff50e2ab5e8d50db333ab518535dd8b"
+ dependencies = [
+  "bitflags",
+  "chrono",
+@@ -212,9 +212,9 @@ dependencies = [
+ 
+ [[package]]
+ name = "comfy-table"
+-version = "4.1.1"
++version = "5.0.0"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+-checksum = "11e95a3e867422fd8d04049041f5671f94d53c32a9dcd82e2be268714942f3f3"
++checksum = "c42350b81f044f576ff88ac750419f914abb46a03831bb1747134344ee7a4e64"
+ dependencies = [
+  "strum",
+  "strum_macros",
+@@ -279,7 +279,7 @@ dependencies = [
+ 
+ [[package]]
+ name = "datafusion"
+-version = "5.1.0"
++version = "6.0.0"
+ dependencies = [
+  "ahash",
+  "arrow",
+@@ -310,7 +310,7 @@ dependencies = [
+ 
+ [[package]]
+ name = "datafusion-python"
+-version = "0.3.0"
++version = "0.4.0"
+ dependencies = [
+  "datafusion",
+  "pyo3",
+@@ -877,9 +877,9 @@ dependencies = [
+ 
+ [[package]]
+ name = "parquet"
+-version = "6.0.0"
++version = "6.5.0"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+-checksum = "d263b9b59ba260518de9e57bd65931c3f765fea0fabacfe84f40d6fde38e841a"
++checksum = "788d9953f4cfbe9db1beff7bebd54299d105e34680d78b82b1ddc85d432cac9d"
+ dependencies = [
+  "arrow",
+  "base64",
+@@ -1228,15 +1228,15 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
+ 
+ [[package]]
+ name = "strum"
+-version = "0.21.0"
++version = "0.22.0"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+-checksum = "aaf86bbcfd1fa9670b7a129f64fc0c9fcbbfe4f1bc4210e9e98fe71ffc12cde2"
++checksum = "f7ac893c7d471c8a21f31cfe213ec4f6d9afeed25537c772e08ef3f005f8729e"
+ 
+ [[package]]
+ name = "strum_macros"
+-version = "0.21.1"
++version = "0.22.0"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+-checksum = "d06aaeeee809dbc59eb4556183dd927df67db1540de5be8d3ec0b6636358a5ec"
++checksum = "339f799d8b549e3744c7ac7feb216383e4005d94bdb22561b3ab8f3b808ae9fb"
+ dependencies = [
+  "heck",
+  "proc-macro2",
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..4b36df22d183
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/datafusion/default.nix
@@ -0,0 +1,90 @@
+{ lib
+, stdenv
+, fetchurl
+, buildPythonPackage
+, fetchPypi
+, fetchFromGitHub
+, rustPlatform
+, maturin
+, pytestCheckHook
+, libiconv
+, numpy
+, pandas
+, pyarrow
+, pytest
+}:
+let
+  # le sigh, the perils of unrelated versions of software living in the same
+  # repo: there's no obvious way to map the top level source repo
+  # (arrow-datafusion) version to the version of contained repo
+  # (arrow-datafusion/python)
+  #
+  # A commit hash will do in a pinch, and ultimately the sha256 has the final
+  # say of what the content is when building
+  cargoLock = fetchurl {
+    url = "https://raw.githubusercontent.com/apache/arrow-datafusion/6.0.0/python/Cargo.lock";
+    sha256 = "sha256-xiv3drEU5jOGsEIh0U01ZQ1NBKobxO2ctp4mxy9iigw=";
+  };
+
+  postUnpack = ''
+    cp "${cargoLock}" $sourceRoot/Cargo.lock
+    chmod u+w $sourceRoot/Cargo.lock
+  '';
+in
+buildPythonPackage rec {
+  pname = "datafusion";
+  version = "0.4.0";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-+YqogteKfNhtI2QbVXv/5CIWm3PcOH653dwONm5ZcL8=";
+  };
+
+  inherit postUnpack;
+
+  # TODO: remove the patch hacking and postUnpack hooks after
+  # https://github.com/apache/arrow-datafusion/pull/1508 is merged
+  #
+  # the lock file isn't up to date as of 6.0.0 so we need to patch the source
+  # lockfile and the vendored cargo deps lockfile
+  patches = [ ./Cargo.lock.patch ];
+  cargoDeps = rustPlatform.fetchCargoTarball {
+    inherit src pname version postUnpack;
+    sha256 = "sha256-JGyDxpfBXzduJaMF1sbmRm7KJajHYdVSj+WbiSETiY0=";
+    patches = [ ./Cargo.lock.patch ];
+  };
+
+  nativeBuildInputs = with rustPlatform; [
+    cargoSetupHook
+    maturinBuildHook
+  ];
+
+  buildInputs = lib.optionals stdenv.isDarwin [ libiconv ];
+
+  propagatedBuildInputs = [
+    numpy
+    pandas
+    pyarrow
+  ];
+
+  checkInputs = [ pytest ];
+  pythonImportsCheck = [ "datafusion" ];
+
+  checkPhase = ''
+    runHook preCheck
+    pytest --pyargs "${pname}"
+    runHook postCheck
+  '';
+
+  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/";
+    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..145342a60a36
--- /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; [ costrouc ];
+  };
+}
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..b5d86acf2a00
--- /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
+  ];
+
+  checkInputs = [
+    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/dataset/default.nix b/nixpkgs/pkgs/development/python-modules/dataset/default.nix
new file mode 100644
index 000000000000..514876761ebf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dataset/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, alembic
+, banal
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, sqlalchemy
+}:
+
+buildPythonPackage rec {
+  pname = "dataset";
+  version = "1.5.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-TDZ6fAqFxOdI79o07uMAw/zD8HbHXDKQt0mnoFM1yEc=";
+  };
+
+  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 ];
+  };
+}
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..2c73d62de7df
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/datasets/default.nix
@@ -0,0 +1,76 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, dill
+, fetchFromGitHub
+, fsspec
+, huggingface-hub
+, importlib-metadata
+, multiprocess
+, numpy
+, packaging
+, pandas
+, pyarrow
+, pythonOlder
+, requests
+, responses
+, tqdm
+, xxhash
+}:
+
+buildPythonPackage rec {
+  pname = "datasets";
+  version = "2.3.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "huggingface";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-VBYCDEOK5KyYuvlybr37LgOchlEUAl/aqiC+J6WQbSA=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "responses<0.19" "responses"
+  '';
+
+  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-template-sql/default.nix b/nixpkgs/pkgs/development/python-modules/datasette-template-sql/default.nix
new file mode 100644
index 000000000000..84c88aea9338
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/datasette-template-sql/default.nix
@@ -0,0 +1,33 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, lib
+, datasette
+, pytestCheckHook
+, pytest-asyncio
+, sqlite-utils
+}:
+
+buildPythonPackage rec {
+  pname = "datasette-template-sql";
+  version = "1.0.2";
+
+  src = fetchFromGitHub {
+    owner = "simonw";
+    repo = pname;
+    rev = version;
+    sha256 = "1ag5f62y445jscxnklcfd84pjinkknmrpk1kmm2j121p7484hrsn";
+  };
+
+  propagatedBuildInputs = [ datasette ];
+
+  checkInputs = [ pytestCheckHook pytest-asyncio sqlite-utils ];
+
+  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 = [ 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..18c6943d1e67
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/datasette/default.nix
@@ -0,0 +1,112 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, aiofiles
+, asgi-csrf
+, click
+, click-default-group
+, itsdangerous
+, janus
+, jinja2
+, hupper
+, mergedeep
+, pint
+, pluggy
+, python-baseconv
+, pyyaml
+, uvicorn
+, httpx
+# Check Inputs
+, pytestCheckHook
+, pytest-asyncio
+, pytest-timeout
+, aiohttp
+, beautifulsoup4
+, asgiref
+, setuptools
+, trustme
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "datasette";
+  version = "0.61.1";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "simonw";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-HVzMyF4ujYK12UQ25il/XROPo+iBldsMxOTx+duoc5o=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace '"pytest-runner"' "" \
+      --replace "click>=7.1.1,<8.1.0" "click>=7.1.1,<8.2.0" \
+      --replace "click-default-group~=1.2.2" "click-default-group" \
+      --replace "hupper~=1.9" "hupper" \
+      --replace "Jinja2>=2.10.3,<3.1.0" "Jinja2" \
+      --replace "pint~=0.9" "pint" \
+      --replace "uvicorn~=0.11" "uvicorn"
+  '';
+
+  propagatedBuildInputs = [
+    aiofiles
+    asgi-csrf
+    asgiref
+    click
+    click-default-group
+    httpx
+    hupper
+    itsdangerous
+    janus
+    jinja2
+    mergedeep
+    pint
+    pluggy
+    python-baseconv
+    pyyaml
+    setuptools
+    uvicorn
+  ];
+
+  checkInputs = [
+    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/";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ costrouc ];
+  };
+}
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..82f0851b1ab3
--- /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.14.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-q8aOpuJD6aX9m9jPm9PY5vZGBJL6Jpf+pPHbcQVOJLg=";
+  };
+
+  propagatedBuildInputs = [
+    dask
+    bokeh
+    toolz
+    datashape
+    numba
+    numpy
+    pandas
+    pillow
+    xarray
+    colorcet
+    param
+    pyct
+    scipy
+  ] ++ dask.optional-dependencies.complete;
+
+  checkInputs = [
+    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; [ costrouc ];
+  };
+}
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..50bde25cf444
--- /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";
+  };
+
+  checkInputs = [ 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..2ebb488aba77
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/datatable/default.nix
@@ -0,0 +1,69 @@
+{ stdenv, lib, buildPythonPackage, fetchPypi, pythonOlder
+, pipInstallHook, writeText
+, blessed
+, docutils
+, libcxx
+, llvm
+, pytestCheckHook
+, typesentry
+, isPy310
+}:
+
+buildPythonPackage rec {
+  pname = "datatable";
+  version = "0.11.0";
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "19c602711e00f72e9ae296d8fa742d46da037c2d3a2d254bdf68f817a8da76bb";
+  };
+  # authors seem to have created their own build system
+  format = "other";
+
+  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"'
+    echo '${version}' > VERSION.txt
+
+    # don't make assumptions about architecture
+    sed -i '/-m64/d' ci/ext.py
+  '';
+  DT_RELEASE = "1";
+
+  buildPhase = ''
+    python ci/ext.py wheel
+  '';
+
+  propagatedBuildInputs = [ typesentry blessed ];
+  buildInputs = [ llvm pipInstallHook ];
+  checkInputs = [ docutils pytestCheckHook ];
+
+  LLVM = llvm;
+  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 ];
+    # uses custom build system and adds -Wunused-variable -Werror
+    # warning: ‘dt::expr::doc_first’ defined but not used [-Wunused-variable]
+    broken = isPy310;
+  };
+}
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..da6ffe3bd266
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/datauri/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "datauri";
+  version = "1.1.0";
+
+  src = fetchFromGitHub {
+    owner = "fcurella";
+    repo = "python-datauri";
+    rev = "v${version}";
+    sha256 = "sha256-Eevd/xxKgxvvsAfI/L/KShH+PfxffBGyVwKewLgyEu0=";
+  };
+
+  pythonImportsCheck = [
+    "datauri"
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # UnicodeDecodeError: 'utf-8' codec can't decode
+    "tests/test_file_ebcdic.txt"
+  ];
+
+  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/dateparser/default.nix b/nixpkgs/pkgs/development/python-modules/dateparser/default.nix
new file mode 100644
index 000000000000..7f92077c0c73
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dateparser/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, buildPythonPackage
+, isPy3k
+, fetchFromGitHub
+, python-dateutil
+, pytz
+, regex
+, tzlocal
+, hijri-converter
+, convertdate
+, fasttext
+, langdetect
+, parameterized
+, pytestCheckHook
+, GitPython
+, ruamel-yaml
+}:
+
+buildPythonPackage rec {
+  pname = "dateparser";
+  version = "1.1.1";
+
+  disabled = !isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "scrapinghub";
+    repo = "dateparser";
+    rev = "v${version}";
+    sha256 = "sha256-bDup3q93Zq+pvwsy/lQy2byOMjG6C/+7813hWQMbZRU=";
+  };
+
+  propagatedBuildInputs = [
+    # install_requires
+    python-dateutil pytz regex tzlocal
+    # extra_requires
+    hijri-converter convertdate fasttext langdetect
+  ];
+
+  checkInputs = [
+    parameterized
+    pytestCheckHook
+    GitPython
+    ruamel-yaml
+  ];
+
+  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; {
+    description = "Date parsing library designed to parse dates from HTML pages";
+    homepage = "https://github.com/scrapinghub/dateparser";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
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..d263414b4a26
--- /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;
+    sha256 = "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..faa3b1155483
--- /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;
+    sha256 = "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; [ SuperSandro2000 ];
+  };
+}
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..a74e53a939e1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/datrie/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, cython
+, pytestCheckHook
+, hypothesis
+}:
+
+buildPythonPackage rec {
+  pname = "datrie";
+  version = "0.8.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-UlsI9jjVz2EV32zNgY5aASmM0jCy2skcj/LmSZ0Ydl0=";
+  };
+
+  nativeBuildInputs = [
+    cython
+  ];
+
+  buildInputs = [
+    hypothesis
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py --replace '"pytest-runner", ' ""
+  '';
+
+  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..acd258c84561
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/db-dtypes/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, numpy
+, packaging
+, pandas
+, pyarrow
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "db-dtypes";
+  version = "1.0.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "googleapis";
+    repo = "python-db-dtypes-pandas";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-KkwXmJ9KwmslBPhBApm+bcY7Tu/J2ZK4sszBaMMDcpY=";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    packaging
+    pandas
+    pyarrow
+  ];
+
+  checkInputs = [
+    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";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..6c85d0def6e8
--- /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.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-aeutAP2y+bUmUOZ39TpXULP+egeBcjyDmtoCheGzw+0=";
+  };
+
+  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/dbus-client-gen/default.nix b/nixpkgs/pkgs/development/python-modules/dbus-client-gen/default.nix
new file mode 100644
index 000000000000..d750df12cd9c
--- /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";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-DrpIeB6kMXPP6PfCjyx7Lsi8yyvwSl9k1nnUGtvVGKg=";
+  };
+
+  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-next/default.nix b/nixpkgs/pkgs/development/python-modules/dbus-next/default.nix
new file mode 100644
index 000000000000..8406a862f56e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dbus-next/default.nix
@@ -0,0 +1,42 @@
+{ 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}";
+    sha256 = "sha256-EKEQZFRUe+E65Z6DNCJFL5uCI5kbXrN7Tzd4O0X5Cqo=";
+  };
+
+  checkInputs = [
+    dbus
+    pytest
+    pytest-cov
+    pytest-asyncio
+    pytest-timeout
+  ];
+
+  # test_peer_interface hits a timeout
+  checkPhase = ''
+    dbus-run-session --config-file=${dbus.daemon}/share/dbus-1/session.conf \
+      ${python.interpreter} -m pytest -sv --cov=dbus_next \
+      -k "not test_peer_interface"
+  '';
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    homepage = "https://github.com/altdesktop/python-dbus-next";
+    description = "A zero-dependency DBus library for Python with asyncio support";
+    license = licenses.mit;
+    maintainers = with maintainers; [ sfrijters ];
+  };
+}
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..81052c62caed
--- /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.pythonForBuild.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;
+  checkInputs = [ 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..8994e1d28cd2
--- /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.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "DBUtils";
+    hash = "sha256-+t65eeFAbcEj4tuZVfMU4NU2DzBOC9bPBHqqX8P99bM=";
+  };
+
+  checkInputs = [
+    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; [ SuperSandro2000 ];
+  };
+}
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..ee554a6e2bd7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dcmstack/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonAtLeast
+, nose
+, nibabel
+, pydicom
+}:
+
+buildPythonPackage rec {
+  pname = "dcmstack";
+  version = "0.8";
+
+  disabled = pythonAtLeast "3.8";
+  # https://github.com/moloney/dcmstack/issues/67
+
+  src = fetchFromGitHub {
+    owner = "moloney";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1n24pp3rqz7ss1z6276fxynnppraxadbl3b9p8ijrcqnpzbzih7p";
+  };
+
+  propagatedBuildInputs = [ nibabel pydicom ];
+
+  checkInputs = [ nose ];
+  checkPhase = ''
+    runHook preCheck
+    nosetests
+    runHook postCheck
+  '';
+
+  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/ddt/default.nix b/nixpkgs/pkgs/development/python-modules/ddt/default.nix
new file mode 100644
index 000000000000..f419a717f083
--- /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.5.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-2q1rxfx2GeWqfu1sOU4Fv4KUYWChPl3y4m3hdsuvNH4=";
+  };
+
+  propagatedBuildInputs = lib.optionals (!isPy3k) [
+    enum34
+  ];
+
+  checkInputs = [ 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..f762ec0ca0ec
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/deal-solver/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, flit-core
+, z3
+, astroid
+, pytestCheckHook
+, hypothesis
+}:
+
+buildPythonPackage rec {
+  pname = "deal-solver";
+  version = "0.1.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "life4";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-LXBAWbm8fT/jYNbzB95YeBL9fEknMNJvkTRMbc+nf6c=";
+  };
+
+  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
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    hypothesis
+  ];
+
+  pythonImportsCheck = [ "deal_solver" ];
+
+  meta = with lib; {
+    description = "Z3-powered solver (theorem prover) for deal";
+    homepage = "https://github.com/life4/deal-solver";
+    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..5f887848453b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/deal/default.nix
@@ -0,0 +1,100 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, flit-core
+, astroid
+, pytestCheckHook
+, docstring-parser
+, isort
+, marshmallow
+, pytest-cov
+, sphinx
+, hypothesis
+, vaa
+, deal-solver
+, pygments
+, typeguard
+, coverage
+, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "deal";
+  version = "4.23.3";
+  format = "pyproject";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "life4";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-duFxe2KSQQb7HB5KrrE32xzTb6QkQcrQssiuXLKao50=";
+  };
+
+  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
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+
+    docstring-parser
+    marshmallow
+    sphinx
+    hypothesis
+    vaa
+    urllib3
+  ];
+
+  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"
+  ];
+
+  disabledTestPaths = [
+    # needs internet access
+    "tests/test_runtime/test_offline.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..9830a8c0276e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/deap/default.nix
@@ -0,0 +1,35 @@
+{ lib, buildPythonPackage, fetchPypi, python, numpy, matplotlib, nose }:
+
+buildPythonPackage rec {
+  pname = "deap";
+  version = "1.3.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-h3LxsP/wQtXlFrCuusLHBiQwRap9DejguGWPOAGBzzE=";
+  };
+
+  postPatch = ''
+    sed -i '/use_2to3=True/d' setup.py
+  '';
+
+  propagatedBuildInputs = [ numpy matplotlib ];
+
+  preBuild = ''
+    2to3 -wn deap
+  '';
+
+  checkInputs = [ nose ];
+  checkPhase = ''
+    nosetests --verbosity=3
+  '';
+
+  meta = with lib; {
+    description = "DEAP is a novel evolutionary computation framework for rapid prototyping and testing of ideas.";
+    homepage = "https://github.com/DEAP/deap";
+    license = licenses.lgpl3;
+    maintainers = with maintainers; [ 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..1c8cee1d7186
--- /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 = "30.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    pname = "debian_inspector";
+    inherit version;
+    hash = "sha256-0PT5sT6adaqgYQtWjks12ys0z1C3n116aeJaEKR/Wxg=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  dontConfigure = true;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    chardet
+    attrs
+    commoncode
+  ];
+
+  checkInputs = [
+    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 = teams.determinatesystems.members;
+  };
+}
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..352779f13dd0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/debian/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, chardet
+}:
+
+buildPythonPackage rec {
+  pname = "python-debian";
+  version = "0.1.44";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-ZVkv47ZPbGyT2U4tJZnbXgwigx07z/B8t7ltOECxMz4=";
+  };
+
+  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.gpl2;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..ced1929bcd7a
--- /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;
+    sha256 = "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..21d49ac983ab
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/debtcollector/tests.nix
@@ -0,0 +1,29 @@
+{ buildPythonPackage
+, debtcollector
+, stestr
+}:
+
+buildPythonPackage rec {
+  pname = "debtcollector-tests";
+  inherit (debtcollector) version;
+
+  src = debtcollector.src;
+
+  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;
+
+  checkInputs = [
+    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..cc571f056314
--- /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 ];
+
+  checkInputs = [ 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..6d48c4bc5a70
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/debuglater/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, colorama
+, dill
+, fetchFromGitHub
+, numpy
+, pandas
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "debuglater";
+  version = "1.4.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "ploomber";
+    repo = pname;
+    rev = version;
+    hash = "sha256-6XIBPnH2LWc3GpSS8Eh2VG21v8+Em7cmvmQIJKzFi6M=";
+  };
+
+  propagatedBuildInputs = [
+    colorama
+  ];
+
+  passthru.optional-dependencies = {
+    all = [
+      dill
+    ];
+  };
+
+  checkInputs = [
+    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";
+    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..ca7e2d920107
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/debugpy/default.nix
@@ -0,0 +1,102 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, substituteAll
+, gdb
+, django
+, flask
+, gevent
+, psutil
+, pytest-timeout
+, pytest-xdist
+, pytestCheckHook
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "debugpy";
+  version = "1.6.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Microsoft";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-ERsqs+pCJfYQInOWPBhM/7hC5TTfQAksYJwFCcd+vlk=";
+  };
+
+  patches = [
+    # Hard code GDB path (used to attach to process)
+    (substituteAll {
+      src = ./hardcode-gdb.patch;
+      inherit gdb;
+    })
+
+    # 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
+  ];
+
+  # 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}")}
+  )'';
+
+  checkInputs = [
+    django
+    flask
+    gevent
+    psutil
+    pytest-timeout
+    pytest-xdist
+    pytestCheckHook
+    requests
+  ];
+
+  # Override default arguments in pytest.ini
+  pytestFlagsArray = [
+    "--timeout=0"
+  ];
+
+  # Fixes hanging tests on Darwin
+  __darwinAllowLocalNetworking = true;
+
+  pythonImportsCheck = [
+    "debugpy"
+  ];
+
+  meta = with lib; {
+    description = "An implementation of the Debug Adapter Protocol for Python";
+    homepage = "https://github.com/microsoft/debugpy";
+    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..0f51106988d9
--- /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 af242877..30b21a1e 100644
+--- a/tests/debug/session.py
++++ b/tests/debug/session.py
+@@ -622,6 +622,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..ad40a504c9dc
--- /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 462feae9..eb2aa945 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
+@@ -399,7 +399,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-version.patch b/nixpkgs/pkgs/development/python-modules/debugpy/hardcode-version.patch
new file mode 100644
index 000000000000..440513e26c1c
--- /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 5fc40070..775a08ec 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]
+ 
+@@ -141,13 +140,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 3c800898..27743245 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
+@@ -182,4 +180,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..1e0fd21320dc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/decli/default.nix
@@ -0,0 +1,23 @@
+{ buildPythonPackage
+, lib
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "decli";
+  version = "0.5.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-8s3lUDSnXIGcYwx2VahExhLyWYxCwhKZFgRl32rUY60=";
+  };
+
+  pythonImportsCheck = [ "decli" ];
+
+  meta = with lib; {
+    description = "Minimal, easy to use, declarative command line interface tool";
+    homepage = "https://github.com/Woile/decli";
+    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..e26c1a108188
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/decorator/default.nix
@@ -0,0 +1,21 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "decorator";
+  version = "5.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330";
+  };
+
+  meta = with lib; {
+    homepage = "https://pypi.python.org/pypi/decorator";
+    description = "Better living through Python with decorators";
+    license = lib.licenses.mit;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..c12bdac5fd0b
--- /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;
+    sha256 = "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-translator/default.nix b/nixpkgs/pkgs/development/python-modules/deep-translator/default.nix
new file mode 100644
index 000000000000..df94f0709f41
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/deep-translator/default.nix
@@ -0,0 +1,33 @@
+{ lib, buildPythonPackage, fetchPypi, beautifulsoup4, requests, click }:
+
+buildPythonPackage rec {
+  pname = "deep-translator";
+  version = "1.8.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-9YTDvrm5Q8k5G7qDF05651IxMV1BeTcgIAMSxU/bwM0=";
+  };
+
+  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 = "Flexible, free and unlimited Python tool to translate between different languages in a simple way using multiple translators";
+    homepage = "https://deep-translator.readthedocs.io";
+    license = licenses.mit;
+    maintainers = with maintainers; [ wolfangaukang ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/deep_merge/default.nix b/nixpkgs/pkgs/development/python-modules/deep_merge/default.nix
new file mode 100644
index 000000000000..2c59d4ab6955
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/deep_merge/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildPythonPackage, fetchPypi, nose }:
+
+buildPythonPackage rec {
+  pname = "deep_merge";
+  version = "0.0.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "tUQV+Qk0xC4zQRTihky01OczWzStOW41rYYQyWBlpH4=";
+  };
+
+  checkInputs = [
+    nose
+  ];
+
+  doCheck = false;
+
+  meta = with lib; {
+    description = "This library contains a simple utility for deep-merging dictionaries and the data structures they contain";
+    homepage = "https://github.com/halfak/deep_merge";
+    license = licenses.mit;
+    maintainers = [ maintainers.anhdle14 ];
+  };
+}
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..c0519332342e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/deepdiff/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, click
+, ordered-set
+, clevercsv
+, jsonpickle
+, numpy
+, pytestCheckHook
+, pyyaml
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "deepdiff";
+  version = "5.8.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "seperman";
+    repo = "deepdiff";
+    rev = "v${version}";
+    hash = "sha256-7eagu6lef5bc/4KU3y067LFOGtH6whda1ocBuRHS/kI=";
+  };
+
+  postPatch = ''
+    substituteInPlace requirements.txt \
+      --replace "ordered-set==4.0.2" "ordered-set"
+    substituteInPlace tests/test_command.py \
+      --replace '/tmp/' "$TMPDIR/"
+  '';
+
+  propagatedBuildInputs = [
+    click
+    ordered-set
+  ];
+
+  pythonImportsCheck = [
+    "deepdiff"
+  ];
+
+  checkInputs = [
+    clevercsv
+    jsonpickle
+    numpy
+    pytestCheckHook
+    pyyaml
+  ];
+
+  meta = with lib; {
+    description = "Deep Difference and Search of any Python object/data";
+    homepage = "https://github.com/seperman/deepdiff";
+    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..6ae9316a0f6d
--- /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"
+  ];
+
+  # checkInputs = [
+  #   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/deepmerge/default.nix b/nixpkgs/pkgs/development/python-modules/deepmerge/default.nix
new file mode 100644
index 000000000000..148599fe1666
--- /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.0.1";
+  disabled = isPy27;
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-S0R3ntPS+3kbsYH8JoNCNJb+pCirt683/rIyht5/Cho=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  checkInputs = [
+    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..0dde3c51c3ae
--- /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 ];
+
+  checkInputs = [ 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..0e5e9b456612
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/deepwave/default.nix
@@ -0,0 +1,69 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytorch
+, 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.14";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "ar4";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-k1MUrnIkllxGIpkEScTZBEDBBNHgJHxau1e/L8TOEKc=";
+  };
+
+  # 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 = [ pytorch pybind11 ];
+
+  checkInputs = [
+    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..f36a73fc27d1
--- /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;
+    sha256 = "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..65ff9a4c8c85
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/deezer-python/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, environs
+, fetchFromGitHub
+, poetry-core
+, pytest-mock
+, pytest-vcr
+, pytestCheckHook
+, pythonOlder
+, requests
+, tornado
+}:
+
+buildPythonPackage rec {
+  pname = "deezer-python";
+  version = "5.5.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "browniebroke";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-VwN/EkJ2LtbCqSelPVl33dD1MFSlypUXmyw4FnH0ee4=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  checkInputs = [
+    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";
+    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..1cfa630337f5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/defcon/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fontpens
+, fonttools
+, fs
+, lxml
+, pytestCheckHook
+, pythonOlder
+, setuptools-scm
+, unicodedata2
+}:
+
+buildPythonPackage rec {
+  pname = "defcon";
+  version = "0.10.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-ruOW5taeRa5lyCZHgTktTCkRaTSyc3rXbYIwtAwYKkQ=";
+    extension = "zip";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    fonttools
+  ];
+
+  checkInputs = [
+    fontpens
+    fs
+    lxml
+    pytestCheckHook
+    unicodedata2
+  ];
+
+  pythonImportsCheck = [
+    "defcon"
+  ];
+
+  meta = with lib; {
+    description = "A set of UFO based objects for use in font editing applications";
+    homepage = "https://github.com/robotools/defcon";
+    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..5698dcbe491b
--- /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
+  ];
+
+  checkInputs = [
+    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/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/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..847a5c6e5ad7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/delorean/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, babel
+, humanize
+, python-dateutil
+, tzlocal
+}:
+
+buildPythonPackage rec {
+  pname = "Delorean";
+  version = "1.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0d31ay7yq2w7xz7m3ssk5phjbm64b2k8hmgcif22719k29p7hrzy";
+  };
+
+  propagatedBuildInputs = [ babel humanize python-dateutil 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..a342538d4ace
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/deltachat/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, buildPythonPackage
+, isPy27
+, pkg-config
+, pkgconfig
+, setuptools-scm
+, libdeltachat
+, cffi
+, imap-tools
+, requests
+, pluggy
+, setuptools
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "deltachat";
+  inherit (libdeltachat) version src;
+  sourceRoot = "${src.name}/python";
+
+  disabled = isPy27;
+
+  nativeBuildInputs = [
+    pkg-config
+    pkgconfig
+    setuptools-scm
+  ];
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  buildInputs = [
+    libdeltachat
+  ];
+
+  propagatedBuildInputs = [
+    cffi
+    imap-tools
+    pluggy
+    requests
+    setuptools
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "deltachat"
+    "deltachat.account"
+    "deltachat.contact"
+    "deltachat.chat"
+    "deltachat.message"
+  ];
+
+  meta = with lib; {
+    description = "Python bindings for the Delta Chat Core library";
+    homepage = "https://github.com/deltachat/deltachat-core-rust/tree/master/python";
+    changelog = "https://github.com/deltachat/deltachat-core-rust/blob/${version}/python/CHANGELOG";
+    license = licenses.mpl20;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
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/demjson3/default.nix b/nixpkgs/pkgs/development/python-modules/demjson3/default.nix
new file mode 100644
index 000000000000..5887ec54c2ab
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/demjson3/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, python
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "demjson3";
+  version = "3.0.5";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "103dc4pzwg8791q3zll1vv4gcc17d9v3jvr9zj23cpv9hpfsp6mb";
+  };
+
+  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..08c794682713
--- /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=";
+  };
+
+  checkInputs = [
+    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..c842759b8d52
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/denonavr/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, asyncstdlib
+, attrs
+, buildPythonPackage
+, defusedxml
+, fetchFromGitHub
+, httpx
+, netifaces
+, pytest-asyncio
+, pytestCheckHook
+, pytest-httpx
+, pytest-timeout
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "denonavr";
+  version = "0.10.11";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "scarface-4711";
+    repo = pname;
+    rev = version;
+    hash = "sha256-RY1XRGuwSFL429foEjEN93fBucUyyYc6cmpzYmYRorc=";
+  };
+
+  propagatedBuildInputs = [
+    asyncstdlib
+    attrs
+    defusedxml
+    httpx
+    netifaces
+  ];
+
+  checkInputs = [
+    pytest-asyncio
+    pytestCheckHook
+    pytest-httpx
+    pytest-timeout
+  ];
+
+  pythonImportsCheck = [
+    "denonavr"
+  ];
+
+  meta = with lib; {
+    description = "Automation Library for Denon AVR receivers";
+    homepage = "https://github.com/scarface-4711/denonavr";
+    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..628e18931255
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dependency-injector/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fastapi
+, fetchFromGitHub
+, flask
+, httpx
+, mypy-boto3-s3
+, numpy
+, scipy
+, pydantic
+, pytestCheckHook
+, pyyaml
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "dependency-injector";
+  version = "4.35.3";
+
+  src = fetchFromGitHub {
+    owner = "ets-labs";
+    repo = "python-dependency-injector";
+    rev = version;
+    sha256 = "sha256-2qe4A2T3EagNCh1zSbPWblVN7p9NH8rNwQQVyESJTdk=";
+  };
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  checkInputs = [
+    aiohttp
+    fastapi
+    flask
+    httpx
+    mypy-boto3-s3
+    numpy
+    pydantic
+    scipy
+    pytestCheckHook
+    pyyaml
+  ];
+
+  postPatch = ''
+    substituteInPlace requirements.txt \
+      --replace "six>=1.7.0,<=1.15.0" "six"
+  '';
+
+  disabledTestPaths = [
+    # There is no unique identifier to disable the one failing test
+    "tests/unit/ext/test_aiohttp_py35.py"
+  ];
+
+  pythonImportsCheck = [ "dependency_injector" ];
+
+  meta = with lib; {
+    description = "Dependency injection microframework for Python";
+    homepage = "https://github.com/ets-labs/python-dependency-injector";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ gerschtli ];
+  };
+}
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..40c20a40c20c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/deprecated/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, wrapt
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "deprecated";
+  version = "1.2.13";
+
+  src = fetchPypi {
+    pname = "Deprecated";
+    inherit version;
+    sha256 = "sha256-Q6xTNdqQwxwkugKK9TapHUHVP55pAd2wIbzFcs5E440=";
+  };
+
+  propagatedBuildInputs = [
+    wrapt
+  ];
+
+  checkInputs = [
+    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..d77554c79ab8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/deprecation/default.nix
@@ -0,0 +1,45 @@
+{ lib, buildPythonPackage, fetchPypi
+, fetchpatch
+, packaging
+, python
+, pythonAtLeast
+, pythonOlder
+, unittest2
+}:
+
+buildPythonPackage rec {
+  pname = "deprecation";
+  version = "2.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1zqqjlgmhgkpzg9ss5ki8wamxl83xn51fs6gn2a8cxsx9vkbvcvj";
+  };
+
+  patches = lib.optionals (pythonAtLeast "3.10") [
+    # fixes for python 3.10 test suite
+    (fetchpatch {
+      url = "https://github.com/briancurtin/deprecation/pull/57/commits/e13e23068cb8d653a02a434a159e8b0b7226ffd6.patch";
+      sha256 = "sha256-/5zr2V1s5ULUZnbLXsgyHxZH4m7/a27QYuqQt2Savc8=";
+      includes = [ "tests/test_deprecation.py" ];
+    })
+  ];
+
+  propagatedBuildInputs = [ packaging ];
+
+  # avoiding mass rebuilds for python3.9, but no longer
+  # needed with patch
+  checkInputs = lib.optional (pythonOlder "3.10") [
+    unittest2
+  ];
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest discover
+  '';
+
+  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..cc7b6870ad82
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/derpconf/default.nix
@@ -0,0 +1,19 @@
+{ lib, buildPythonPackage, fetchPypi, six }:
+
+buildPythonPackage rec {
+  pname = "derpconf";
+  version = "0.8.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1bb152d8a1cf5c2a6d629bf29acd4af0c00811339642fc0a56172b0a83b31a15";
+  };
+
+  propagatedBuildInputs = [ six ];
+
+  meta = with lib; {
+    description = "derpconf abstracts loading configuration files for your app";
+    homepage = "https://github.com/globocom/derpconf";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/descartes/default.nix b/nixpkgs/pkgs/development/python-modules/descartes/default.nix
new file mode 100644
index 000000000000..a4df1fe20c99
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/descartes/default.nix
@@ -0,0 +1,27 @@
+{ lib, buildPythonPackage, fetchPypi,
+  matplotlib, shapely
+}:
+
+buildPythonPackage rec {
+  pname = "descartes";
+  version = "1.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0nq36w9ylvfwmwn5qd9c8fsp2jzsqpmy4xcr6pzxcpmg8qhm0nhk";
+  };
+
+  propagatedBuildInputs = [
+    matplotlib
+    shapely
+  ];
+
+  meta = with lib; {
+    description = "Python library to use Shapely or GeoJSON objects as matplotlib paths";
+    homepage = "https://bitbucket.org/sgillies/descartes/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ knedlsepp ];
+    # all tests are failing
+    broken = true;
+  };
+}
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..6a2d3bacb12e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/desktop-notifier/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, stdenv
+, packaging
+, importlib-resources
+, dbus-next
+}:
+
+buildPythonPackage rec {
+  pname = "desktop-notifier";
+  version = "3.4.0";
+  format = "pyproject";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "SamSchott";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-lOXoiWY6gyWBL4RLrvslqcMmwtjMTOaHJZzsDO+C/F4=";
+  };
+
+  propagatedBuildInputs = [
+    packaging
+  ] ++ lib.optionals (pythonOlder "3.9") [
+    importlib-resources
+  ] ++ lib.optionals stdenv.isLinux [
+    dbus-next
+  ];
+
+  # no tests available, do the imports check instead
+  doCheck = false;
+  pythonImportsCheck = [ "desktop_notifier" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/samschott/desktop-notifier";
+    description = "A Python library for cross-platform desktop notifications";
+    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..a46c445be944
--- /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.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Yelp";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-Dl/2HgCacDko/ug9nGA9X+LyOkuDot11H28lxrgkwdE=";
+    leaveDotGit = true;
+  };
+
+  propagatedBuildInputs = [
+    gibberish-detector
+    pyyaml
+    pyahocorasick
+    requests
+  ];
+
+  checkInputs = [
+    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/devito/default.nix b/nixpkgs/pkgs/development/python-modules/devito/default.nix
new file mode 100644
index 000000000000..2aa669e44a33
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/devito/default.nix
@@ -0,0 +1,102 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchFromGitHub
+, anytree
+, nbval
+, sympy
+, scipy
+, cached-property
+, psutil
+, py-cpuinfo
+, cgen
+, click
+, multidict
+, distributed
+, pyrevolve
+, codepy
+, pytestCheckHook
+, matplotlib
+, pytest-xdist
+}:
+
+buildPythonPackage rec {
+  pname = "devito";
+  version = "4.7.1";
+
+  src = fetchFromGitHub {
+    owner = "devitocodes";
+    repo = "devito";
+    rev = "v${version}";
+    sha256 = "sha256-crKTxlueE8NGjAqu625iFvp35UK2U7+9kl8rpbzf0gs=";
+  };
+
+  postPatch = ''
+    # Removing unecessary dependencies
+    sed -e "s/flake8.*//g" \
+        -e "s/codecov.*//g" \
+        -e "s/pytest.*//g" \
+        -e "s/pytest-runner.*//g" \
+        -e "s/pytest-cov.*//g" \
+        -i requirements.txt
+
+    # Relaxing dependencies requirements
+    sed -e "s/>.*//g" \
+        -e "s/<.*//g" \
+        -i requirements.txt
+  '';
+
+  checkInputs = [ pytestCheckHook pytest-xdist matplotlib ];
+
+  # 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_gs_parallel"
+    "test_if_parallel"
+    "test_if_halo_mpi"
+    "test_cache_blocking_structure_distributed"
+    "test_mpi"
+    "test_codegen_quality0"
+    "test_new_distributor"
+    "test_subdomainset_mpi"
+    "test_init_omp_env_w_mpi"
+    "test_mpi_nocomms"
+  ];
+
+  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"
+  ];
+
+  propagatedBuildInputs = [
+    anytree
+    cached-property
+    cgen
+    click
+    codepy
+    distributed
+    nbval
+    multidict
+    psutil
+    py-cpuinfo
+    pyrevolve
+    scipy
+    sympy
+  ];
+
+  pythonImportsCheck = [ "devito" ];
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    homepage = "https://www.devitoproject.org/";
+    description = "Code generation framework for automated finite difference computation";
+    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..5485372a1e1c
--- /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.2";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "2Fake";
+    repo = "devolo_home_control_api";
+    rev = "v${version}";
+    sha256 = "sha256-H4kLomHM0qq6LqsRMEp34oKy/4Me7AQi6dij2vraBS8=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    requests
+    zeroconf
+    websocket-client
+  ];
+
+  checkInputs = [
+    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..5d44866da0eb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/devolo-plc-api/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, httpx
+, protobuf
+, pytest-asyncio
+, pytest-httpx
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+, setuptools-scm
+, zeroconf
+}:
+
+buildPythonPackage rec {
+  pname = "devolo-plc-api";
+  version = "0.8.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "2Fake";
+    repo = "devolo_plc_api";
+    rev = "v${version}";
+    sha256 = "sha256-LMwvIwbP/nRFby295ur6QTgyXLLJ8ip30V9bti27qKQ=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    httpx
+    protobuf
+    zeroconf
+  ];
+
+  checkInputs = [
+    pytest-asyncio
+    pytest-httpx
+    pytest-mock
+    pytestCheckHook
+  ];
+
+
+
+  pythonImportsCheck = [
+    "devolo_plc_api"
+  ];
+
+  meta = with lib; {
+    description = "Python module to interact with Devolo PLC devices";
+    homepage = "https://github.com/2Fake/devolo_plc_api";
+    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..7e2a315b413e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/devpi-common/default.nix
@@ -0,0 +1,35 @@
+{ lib, buildPythonPackage, fetchPypi
+, requests
+, py
+, pytest
+, pytest-flake8
+, lazy
+}:
+
+buildPythonPackage rec {
+  pname = "devpi-common";
+  version = "3.6.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "fc14aa6b74d4d9e27dc2e9cbff000ed9be5cd723d3ac9672e66e4e8fce797227";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    py
+    lazy
+  ];
+  checkInputs = [ pytest pytest-flake8 ];
+
+  checkPhase = ''
+    py.test
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/devpi/devpi";
+    description = "Utilities jointly used by devpi-server and devpi-client";
+    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..34004769b1fd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/devtools/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, asttokens
+, buildPythonPackage
+, executing
+, fetchFromGitHub
+, pygments
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "devtools";
+  version = "0.8.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "samuelcolvin";
+    repo = "python-${pname}";
+    rev = "v${version}";
+    sha256 = "0yavcbxzxi1nfa1k326gsl03y8sadi5z5acamwd8b1bsiv15p757";
+  };
+
+  propagatedBuildInputs = [
+    asttokens
+    executing
+    pygments
+  ];
+
+  checkInputs = [
+    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_vars"
+  ];
+
+  pythonImportsCheck = [
+    "devtools"
+  ];
+
+  meta = with lib; {
+    description = "Python's missing debug print command and other development tools";
+    homepage = "https://python-devtools.helpmanual.io/";
+    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..4c00657df14c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/diagrams/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, jinja2
+, poetry-core
+, round
+, graphviz
+, inkscape
+, imagemagick
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "diagrams";
+  version = "0.21.1";
+  format = "pyproject";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "mingrammer";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-YoXV5ikkBCSVyGmzEqp+7JLy82d7z9sbwS+U/EN3BFk=";
+  };
+
+  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
+  ];
+
+  checkInputs = [ pytestCheckHook ];
+
+  # 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 ];
+
+  pythonImportsCheck = [ "diagrams" ];
+
+  meta = with lib; {
+    description = "Diagram as Code";
+    homepage    = "https://diagrams.mingrammer.com/";
+    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..dcf9b4d2ad11
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/diagrams/remove-black-requirement.patch
@@ -0,0 +1,24 @@
+diff --git a/autogen.sh b/autogen.sh
+index acbcacb..1f60b83 100755
+--- a/autogen.sh
++++ b/autogen.sh
+@@ -21,11 +21,6 @@
+   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
+@@ -55,7 +50,3 @@
+ # Generate doc for custom module
+ echo "generating the docs for custom"
+ python -m scripts.generate "custom"
+-
+-# 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..5655e18bae10
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/diceware/default.nix
@@ -0,0 +1,33 @@
+{ lib, buildPythonPackage, fetchPypi
+, pytest-runner
+, setuptools
+, coverage, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "diceware";
+  version = "0.10";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-srTMm1n1aNLvUb/fn34a+UHSX7j1wl8XAZHburzpZWk=";
+  };
+
+  nativeBuildInputs = [ pytest-runner ];
+
+  propagatedBuildInputs = [ setuptools ];
+
+  checkInputs = [ coverage pytest ];
+
+  # see https://github.com/ulif/diceware/commit/a7d844df76cd4b95a717f21ef5aa6167477b6733
+  checkPhase = ''
+    py.test -m 'not packaging'
+  '';
+
+  meta = with lib; {
+    description = "Generates passphrases by concatenating words randomly picked from wordlists";
+    homepage = "https://github.com/ulif/diceware";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ asymmetric ];
+  };
+}
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..dd43902949ab
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dicom2nifti/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, isPy27
+, gdcm
+, nose
+, nibabel
+, numpy
+, pydicom
+, scipy
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "dicom2nifti";
+  version = "2.3.0";
+  disabled = isPy27;
+
+  # no tests in PyPI dist
+  src = fetchFromGitHub {
+    owner = "icometrix";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-QSu9CGXFjDpI25Cy6QSbrwiQ2bwsVezCUxSovRLs6AI=";
+  };
+
+  propagatedBuildInputs = [ nibabel numpy pydicom scipy setuptools ];
+
+  checkInputs = [ nose gdcm ];
+  checkPhase = "nosetests tests";
+
+  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/dict2xml/default.nix b/nixpkgs/pkgs/development/python-modules/dict2xml/default.nix
new file mode 100644
index 000000000000..a51ec5303cd2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dict2xml/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "dict2xml";
+  version = "1.7.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-ZgCqMx8X7uODNhH3GJmkOnZhLKdVoVdpzyBJLEsaoBY=";
+  };
+
+  pythonImportsCheck = [
+    "dict2xml"
+  ];
+
+  meta = with lib; {
+    description = "Library to convert a Python dictionary into an XML string";
+    homepage = "https://github.com/delfick/python-dict2xml";
+    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..5e043e55f853
--- /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
+  ];
+
+  checkInputs = [
+    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/dictpath/default.nix b/nixpkgs/pkgs/development/python-modules/dictpath/default.nix
new file mode 100644
index 000000000000..5a648f7898f5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dictpath/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "dictpath";
+  version = "0.1.3";
+
+  src = fetchFromGitHub {
+    owner = "p1c2u";
+    repo = "dictpath";
+    rev = version;
+    sha256 = "0314i8wky2z83a66zggc53m8qa1rjgkrznrl2ixsgiq0prcn6v16";
+  };
+
+  postPatch = ''
+    sed -i "/^addopts/d" setup.cfg
+  '';
+
+  checkInputs = [
+    pytestCheckHook
+    six
+  ];
+
+  pythonImportsCheck = [ "dictpath" ];
+
+  meta = with lib; {
+    description = "Object-oriented dictionary paths";
+    homepage = "https://github.com/p1c2u/dictpath";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
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..9e24784731cf
--- /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.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ea44cc4ec6c0f85098c57a431a1ee891b3549347b07b7414c8a24611ecf37e45";
+  };
+
+  # 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..2b50dc97fb1e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/diff-cover/default.nix
@@ -0,0 +1,79 @@
+{ 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 = "6.5.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    pname = "diff_cover";
+    inherit version;
+    hash = "sha256-jDuxOBLpZnvIP4x2BkAlEenC/nnWeG8SlSLnlpPuCWs=";
+  };
+
+  propagatedBuildInputs = [
+    chardet
+    jinja2
+    jinja2_pluralize
+    pluggy
+    pygments
+    tomli
+  ];
+
+  checkInputs = [
+    pycodestyle
+    pyflakes
+    pylint
+    pytest-datadir
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Tests check for flake8
+    "file_does_not_exist"
+    # AssertionError: assert '.c { color:...
+    "test_style_defs"
+    # uses pytest.approx in a boolean context, which is unsupported since pytest7
+    "test_percent_covered"
+    # assert '<!DOCTYPE ht...ody>\n</html>' == '<!DOCTYPE ht...ody>\n</html>'
+    "test_html_with_external_css"
+    # assert '<table class...</tr></table>' == '<div class=".../table></div>'
+    "test_format"
+    "test_format_with_invalid_violation_lines"
+    "test_no_filename_ext"
+    "test_unicode"
+    "test_load_snippets_html"
+    "test_load_utf8_snippets"
+    "test_load_declared_arabic"
+  ];
+
+  pythonImportsCheck = [
+    "diff_cover"
+  ];
+
+  meta = with lib; {
+    description = "Automatically find diff lines that need test coverage";
+    homepage = "https://github.com/Bachmann1234/diff-cover";
+    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..3e05deb5e2d3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/diff-match-patch/default.nix
@@ -0,0 +1,21 @@
+{ lib, buildPythonPackage, fetchPypi, python }:
+
+buildPythonPackage rec {
+  pname = "diff-match-patch";
+  version = "20200713";
+
+  meta = {
+    homepage = "https://github.com/diff-match-patch-python/diff-match-patch";
+    description = "Diff, Match and Patch libraries for Plain Text";
+    license = lib.licenses.asl20;
+  };
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "da6f5a01aa586df23dfc89f3827e1cafbb5420be9d87769eeb079ddfd9477a18";
+  };
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest -v diff_match_patch.tests
+  '';
+}
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..5e45a1785a95
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/digitalocean/default.nix
@@ -0,0 +1,51 @@
+{ 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;
+
+  checkInputs = [
+    pytest
+    pytestCheckHook
+    responses
+  ] ++ lib.optionals (!isPy3k) [
+    mock
+  ];
+
+  preCheck = ''
+    cd digitalocean
+  '';
+
+  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..9167e629d573
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dill/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "dill";
+  version = "0.3.5.1";
+
+  src = fetchFromGitHub {
+    owner = "uqfoundation";
+    repo = pname;
+    rev = "refs/tags/dill-${version}";
+    sha256 = "sha256-gWE7aQodblgHjUqGAzOJGgxJ4qx9wHo/DU4KRE6JMWo=";
+  };
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  # Tests seem to fail because of import pathing and referencing items/classes in modules.
+  # Seems to be a Nix/pathing related issue, not the codebase, so disabling failing tests.
+  disabledTestPaths = [
+    "tests/test_diff.py"
+    "tests/test_module.py"
+    "tests/test_objects.py"
+    "tests/test_session.py"
+  ];
+
+  disabledTests = [
+    "test_class_objects"
+    "test_importable"
+    "test_method_decorator"
+    "test_the_rest"
+    # test exception catching needs updating, can probably be removed with next update
+    "test_recursive_function"
+  ];
+
+  pythonImportsCheck = [ "dill" ];
+
+  meta = with lib; {
+    description = "Serialize all of python (almost)";
+    homepage = "https://github.com/uqfoundation/dill/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
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..c02746695e88
--- /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;
+    sha256 = "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..89cf7d910127
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/diofant/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, gmpy2
+, isort
+, mpmath
+, numpy
+, pythonOlder
+, scipy
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "diofant";
+  version = "0.13.0";
+  disabled = pythonOlder "3.9";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "Diofant";
+    sha256 = "bac9e086a7156b20f18e3291d6db34e305338039a3c782c585302d377b74dd3c";
+  };
+
+  nativeBuildInputs = [
+    isort
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    gmpy2
+    mpmath
+    numpy
+    scipy
+  ];
+
+  # 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..3712dfbaee1a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dipy/default.nix
@@ -0,0 +1,70 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, isPy27
+, packaging
+, pytest
+, cython
+, numpy
+, scipy
+, h5py
+, nibabel
+, tqdm
+}:
+
+buildPythonPackage rec {
+  pname = "dipy";
+  version = "1.4.1";
+
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner  = "dipy";
+    repo   = pname;
+    rev    = version;
+    sha256 = "0zaqsiq73vprbqbzvzswjfmqgappl5vhpl2fwjrrda33c27klpzj";
+  };
+
+  nativeBuildInputs = [ cython packaging ];
+  propagatedBuildInputs = [
+    numpy
+    scipy
+    h5py
+    nibabel
+    tqdm
+  ];
+
+  checkInputs = [ pytest ];
+
+  # 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";
+    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..5f8c40c075aa
--- /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
+  ];
+
+  checkInputs = [
+    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..0a448b8de7f8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dirty-equals/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+, pytz
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "dirty-equals";
+  version = "0.4";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "samuelcolvin";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-rh7N/VRx4sv/MhhGPkaYCn2d19Sv5er2CkG6/fJuXX4=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    pytz
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    typing-extensions
+  ];
+
+  checkInputs = [
+    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";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..f4d80c527bc8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/discogs-client/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, requests
+, oauthlib
+, python-dateutil
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "discogs-client";
+  version = "2.3.15";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "joalla";
+    repo = "discogs_client";
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-teI0sbvluwVFmEOL/V1zLNGFVbeM7QzZ9rCOl3+A+aY=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    oauthlib
+    python-dateutil
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "discogs_client"
+  ];
+
+  meta = with lib; {
+    description = "Unofficial Python API client for Discogs";
+    homepage = "https://github.com/joalla/discogs_client";
+    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..f4450f2fea51
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/discordpy/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, libopus
+, pynacl
+, pythonOlder
+, withVoice ? true
+, ffmpeg
+}:
+
+buildPythonPackage rec {
+  pname = "discord.py";
+  version = "2.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "Rapptz";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-BhxXsNRgs/ihnlTxNwYTjRwPvneyDF8Q0wS3qr2BG9Q=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ] ++ lib.optionals withVoice [
+    libopus
+    pynacl
+    ffmpeg
+  ];
+
+  patchPhase = ''
+    substituteInPlace "discord/opus.py" \
+      --replace "ctypes.util.find_library('opus')" "'${libopus}/lib/libopus.so.0'"
+  '' + 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/";
+    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..c9b09cbfe69c
--- /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
+  ];
+
+  checkInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "--asyncio-mode=legacy"
+  ];
+
+  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..6a8d1e59cea7
--- /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=";
+  };
+
+  checkInputs = [
+    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; [ costrouc ];
+  };
+}
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..80655e6aa084
--- /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";
+  };
+
+  checkInputs = [ 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..ec4e8ecdc6f5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/distlib/default.nix
@@ -0,0 +1,23 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "distlib";
+  version = "0.3.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "e4b58818180336dc9c529bfb9a0b58728ffc09ad92027a3f30b7cd91e3458579";
+    extension = "zip";
+  };
+
+  # 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..715e8c357143
--- /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";
+  };
+
+  checkInputs = [
+    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..be277f97ba5e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/distrax/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, numpy
+, tensorflow-probability
+, chex
+, dm-haiku
+, pytestCheckHook
+, jaxlib }:
+
+buildPythonPackage rec {
+  pname = "distrax";
+  version = "0.1.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-b/+rxjdowNMuhUBhRCuN45z/iUbj1hN1qCSQqqAtZIw=";
+  };
+
+  buildInputs = [
+    chex
+    jaxlib
+    numpy
+    tensorflow-probability
+  ];
+
+  checkInputs = [
+    dm-haiku
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "distrax"
+  ];
+
+  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..646899d36cf8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/distributed/default.nix
@@ -0,0 +1,71 @@
+{ lib
+, buildPythonPackage
+, click
+, cloudpickle
+, dask
+, fetchPypi
+, jinja2
+, locket
+, msgpack
+, packaging
+, psutil
+, pythonOlder
+, pyyaml
+, sortedcontainers
+, tblib
+, toolz
+, tornado
+, urllib3
+, zict
+}:
+
+buildPythonPackage rec {
+  pname = "distributed";
+  version = "2022.7.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-5oq6i+PiDl0RIKvKyEGQn/GAIXCKhBKvpY/xU8T6sKw=";
+  };
+
+  postPatch = ''
+    substituteInPlace requirements.txt \
+      --replace "tornado >= 6.0.3, <6.2" "tornado >= 6.0.3"
+  '';
+
+  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/";
+    license = licenses.bsd3;
+    platforms = platforms.x86; # fails on aarch64
+    maintainers = with maintainers; [ teh costrouc ];
+  };
+}
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..deee452ae1b4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/distro/default.nix
@@ -0,0 +1,23 @@
+{ lib, fetchPypi, buildPythonPackage }:
+
+buildPythonPackage rec {
+  pname = "distro";
+  version = "1.7.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-FRrsz2DCFkApMrUuQO5HepOfjViJiSc3igKrvoUsHDk=";
+  };
+
+  # 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..ffa49fec14df
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/distutils_extra/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchurl
+}:
+
+buildPythonPackage rec {
+  pname = "distutils-extra";
+  version = "2.45";
+
+  src = fetchurl {
+    url = "https://salsa.debian.org/python-team/modules/python-distutils-extra/-/archive/${version}/python-${pname}-${version}.tar.bz2";
+    sha256 = "1aifizd4nkvdnkwdna7i6xgjcqi1cf228bg8kmnwz67f5rflk3z8";
+  };
+
+  # 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..698e2a0c3052
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dj-database-url/default.nix
@@ -0,0 +1,20 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "dj-database-url";
+  version = "0.5.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "4aeaeb1f573c74835b0686a2b46b85990571159ffc21aa57ecd4d1e1cb334163";
+  };
+
+  # Tests access a DB via network
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Use Database URLs in your Django Application";
+    homepage = "https://github.com/kennethreitz/dj-database-url";
+    license = licenses.bsd2;
+  };
+}
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..b10b8ec93136
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dj-email-url/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+}:
+
+buildPythonPackage rec {
+  version = "1.0.5";
+  pname = "dj-email-url";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-7zb4oyTsV8875cen70TtaQDKAghiSpGKszrcHPZCezk=";
+  };
+
+  checkPhase = ''
+    ${python.interpreter} test_dj_email_url.py
+  '';
+
+  # tests not included with pypi release
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/migonzalvar/dj-email-url";
+    description = "Use an URL to configure email backend settings in your Django Application";
+    license = licenses.bsd0;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..be31d9cd4796
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dj-rest-auth/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, django-allauth
+, djangorestframework
+, djangorestframework-simplejwt
+, responses
+, unittest-xml-reporting
+}:
+
+buildPythonPackage rec {
+  pname = "dj-rest-auth";
+  version = "2.2.5";
+
+  src = fetchFromGitHub {
+    owner = "iMerica";
+    repo = "dj-rest-auth";
+    rev = version;
+    sha256 = "sha256-1oxkl7MJ2wIhcHlgxnCtj9Cp8o1puzNWs+vlMyi+3RM=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "coveralls>=1.11.1" "" \
+      --replace "==" ">="
+  '';
+
+  propagatedBuildInputs = [
+    djangorestframework
+  ];
+
+  checkInputs = [
+    django-allauth
+    djangorestframework-simplejwt
+    responses
+    unittest-xml-reporting
+  ];
+
+  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; [ SuperSandro2000 ];
+  };
+}
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..b216c8e62a1e
--- /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 = [ maintainers.costrouc ];
+  };
+
+}
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..6db3cbefedb8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-allauth/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, django
+, fetchFromGitHub
+, python3-openid
+, pythonOlder
+, requests
+, requests-oauthlib
+}:
+
+buildPythonPackage rec {
+  pname = "django-allauth";
+  version = "0.51.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "pennersr";
+    repo = pname;
+    rev = version;
+    hash = "sha256-o8EoayMMwxoJTrUA3Jo1Dfu1XFgC+Mcpa8yMwXlKAKY=";
+  };
+
+  postPatch = ''
+    chmod +x manage.py
+    patchShebangs manage.py
+  '';
+
+  propagatedBuildInputs = [
+    django
+    python3-openid
+    requests
+    requests-oauthlib
+  ];
+
+  checkPhase = ''
+    # test is out of date
+    rm allauth/socialaccount/providers/cern/tests.py
+
+    ./manage.py test
+  '';
+
+  pythonImportsCheck = [
+    "allauth"
+  ];
+
+  meta = with lib; {
+    description = "Integrated set of Django applications addressing authentication, registration, account management as well as 3rd party (social) account authentication";
+    homepage = "https://www.intenct.nl/projects/django-allauth";
+    license = licenses.mit;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..83c89b53c97d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-anymail/default.nix
@@ -0,0 +1,47 @@
+{
+    lib,
+    buildPythonPackage,
+    fetchFromGitHub,
+    six,
+    requests,
+    django,
+    boto3,
+    python,
+    mock,
+}:
+
+buildPythonPackage rec {
+  pname = "django-anymail";
+  version = "8.6";
+
+  src = fetchFromGitHub {
+    owner = "anymail";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-hLNILUV7qzqHfh7l3SJAoFveUIRSCHTjEQ3ZC3PhZUY=";
+  };
+
+  propagatedBuildInputs = [
+    six
+    requests
+    django
+    boto3
+  ];
+
+  checkInputs = [ mock ];
+  checkPhase = ''
+    substituteInPlace setup.py --replace "tests_require=[" "tests_require=[], #"
+    export CONTINUOUS_INTEGRATION=1
+    export ANYMAIL_SKIP_TESTS="sparkpost"
+    ${python.interpreter} setup.py test
+  '';
+
+  # this package allows multiple email backends
+  # sparkpost is missing because it's not packaged yet
+  meta = with lib; {
+    description = "Django email backends and webhooks for Mailgun";
+    homepage = "https://github.com/anymail/django-anymail";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
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-auth-ldap/default.nix b/nixpkgs/pkgs/development/python-modules/django-auth-ldap/default.nix
new file mode 100644
index 000000000000..b3596e1e4444
--- /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
+, ldap
+, django
+
+# tests
+, python
+, pkgs
+}:
+
+buildPythonPackage rec {
+  pname = "django-auth-ldap";
+  version = "4.1.0";
+  format = "pyproject";
+
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-d/dJ07F4B86OtWqcnI5XRv8xZWf4HVumE0ldnHSVqUk=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    django
+    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-cache-url/default.nix b/nixpkgs/pkgs/development/python-modules/django-cache-url/default.nix
new file mode 100644
index 000000000000..dee64ebd6ee4
--- /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
+  '';
+
+  checkInputs = [ pytestCheckHook ];
+
+  meta = with lib; {
+    homepage = "https://github.com/epicserve/django-cache-url";
+    description = "Use Cache URLs in your Django application";
+    license = licenses.mit;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..bdb10688924d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-cacheops/default.nix
@@ -0,0 +1,36 @@
+{ buildPythonPackage
+, fetchPypi
+, lib
+, django
+, funcy
+, redis
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "django-cacheops";
+  version = "6.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-toTvOf1DQYnTy7fYVBfNlyr2NSiaAyRHmCRztKifcn0=";
+  };
+
+  propagatedBuildInputs = [
+    django
+    funcy
+    redis
+    six
+  ];
+
+  # tests need a redis server
+  # pythonImportsCheck not possible since DJANGO_SETTINGS_MODULE needs to be set
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A slick ORM cache with automatic granular event-driven invalidation for Django";
+    homepage = "https://github.com/Suor/django-cacheops";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
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..be1b627525f6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-celery-beat/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, python-crontab
+, celery
+, django-timezone-field
+, tzdata
+, ephem
+, pytest-timeout
+, pytest-django
+, case
+, pytestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "django-celery-beat";
+  version = "2.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-uiT4btlWug7itDI3pJMD6/Wqfg+wzLfgVCt+MaRj3Lo=";
+  };
+
+  propagatedBuildInputs = [
+    python-crontab
+    celery
+    django-timezone-field
+    tzdata
+  ];
+
+  checkInputs = [
+    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..950fb4f75e93
--- /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;
+    sha256 = "sha256-LBavz5Nh2ObmIwLCem8nHvsuKgPwkzbS/OzFPmSje/M=";
+  };
+
+  propagatedBuildInputs = [
+    django
+    django-appconf
+    celery
+  ];
+
+  DJANGO_SETTINGS_MODULE = "tests.settings";
+
+  checkInputs = [
+    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-cleanup/default.nix b/nixpkgs/pkgs/development/python-modules/django-cleanup/default.nix
new file mode 100644
index 000000000000..9a399ed6ed94
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-cleanup/default.nix
@@ -0,0 +1,20 @@
+{ lib, buildPythonPackage, fetchPypi, django
+}:
+
+buildPythonPackage rec {
+  pname = "django-cleanup";
+  version = "6.0.0";
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "922e06ef8839c92bd3ab37a84db6058b8764f3fe44dbb4487bbca941d288280a";
+  };
+
+  checkInputs = [ 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";
+    license = licenses.mit;
+    maintainers = with maintainers; [ mmai ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-compat/default.nix b/nixpkgs/pkgs/development/python-modules/django-compat/default.nix
new file mode 100644
index 000000000000..d33a4be2817f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-compat/default.nix
@@ -0,0 +1,42 @@
+{ lib, buildPythonPackage, fetchFromGitHub, python,
+  django, six
+}:
+
+buildPythonPackage rec {
+  pname = "django-compat";
+  version = "1.0.15";
+
+  # the pypi packages don't include everything required for the tests
+  src = fetchFromGitHub {
+    owner = "arteria";
+    repo = "django-compat";
+    rev = "v${version}";
+    sha256 = "1pr6v38ahrsvxlgmcx69s4b5q5082f44gzi4h3c32sccdc4pwqxp";
+  };
+
+  patches = [
+    ./fix-tests.diff
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+
+    # to convince the tests to run against the installed package, not the source directory, we extract the
+    # tests directory from it then dispose of the actual source
+    mv compat/tests .
+    rm -r compat
+    substituteInPlace runtests.py --replace compat.tests tests
+    ${python.interpreter} runtests.py
+
+    runHook postCheck
+  '';
+
+  propagatedBuildInputs = [ django six ];
+
+  meta = with lib; {
+    description = "Forward and backwards compatibility layer for Django 1.4, 1.7, 1.8, 1.9, 1.10 and 1.11";
+    homepage = "https://github.com/arteria/django-compat";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ris ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-compat/fix-tests.diff b/nixpkgs/pkgs/development/python-modules/django-compat/fix-tests.diff
new file mode 100644
index 000000000000..58165db96a87
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-compat/fix-tests.diff
@@ -0,0 +1,56 @@
+diff -ur a/compat/tests/settings.py b/compat/tests/settings.py
+--- a/compat/tests/settings.py	2020-03-06 15:32:07.548482597 +0100
++++ b/compat/tests/settings.py	2020-03-06 22:19:25.422934249 +0100
+@@ -16,11 +16,12 @@
+     'django.contrib.admin',
+     'django.contrib.auth',
+     'django.contrib.contenttypes',
++    'django.contrib.messages',
+     'compat',
+     'compat.tests.test_app',
+ ]
+ 
+-MIDDLEWARE_CLASSES = (
++MIDDLEWARE = (
+     'django.contrib.sessions.middleware.SessionMiddleware',
+     'django.middleware.common.CommonMiddleware',
+     'django.middleware.csrf.CsrfViewMiddleware',
+@@ -43,6 +44,7 @@
+                 'django.template.context_processors.i18n',
+                 'django.template.context_processors.tz',
+                 'django.template.context_processors.request',
++                'django.contrib.messages.context_processors.messages',
+             ],
+             'loaders': [
+                 'django.template.loaders.filesystem.Loader',
+diff -ur a/compat/tests/test_compat.py b/compat/tests/test_compat.py
+--- a/compat/tests/test_compat.py	2020-03-06 15:32:07.548482597 +0100
++++ b/compat/tests/test_compat.py	2020-03-06 15:37:39.202835075 +0100
+@@ -9,7 +9,7 @@
+ from django.core.serializers.json import DjangoJSONEncoder
+ from django.test import TestCase, SimpleTestCase
+ from django.test.client import RequestFactory
+-from django.contrib.auth.views import logout
++from django.contrib.auth.views import auth_logout
+ try:
+     from django.urls import NoReverseMatch
+ except ImportError:
+@@ -103,7 +103,7 @@
+         Tests that passing a view name to ``resolve_url`` will result in the
+         URL path mapping to that view name.
+         """
+-        resolved_url = resolve_url(logout)
++        resolved_url = resolve_url(auth_logout)
+         self.assertEqual('/accounts/logout/', resolved_url)
+ 
+     '''
+diff -ur a/compat/tests/urls.py b/compat/tests/urls.py
+--- a/compat/tests/urls.py	2020-03-06 15:32:07.548482597 +0100
++++ b/compat/tests/urls.py	2020-03-06 15:34:25.962377799 +0100
+@@ -2,5 +2,5 @@
+ from django.contrib.auth import views
+ 
+ urlpatterns = [
+-    url(r'^accounts/logout/$', views.logout, name='logout'),
++    url(r'^accounts/logout/$', views.auth_logout, name='logout'),
+ ]
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..05c525c0cc90
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-compressor/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, rcssmin
+, rjsmin
+, django-appconf
+, beautifulsoup4
+, brotli
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "django-compressor";
+  version = "4.1";
+  format = "setuptools";
+
+  src = fetchPypi {
+    pname = "django_compressor";
+    inherit version;
+    hash = "sha256-js5iHSqY9sZjVIDLizcB24kKmfeT+VyiDLAKvBlNMx0=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "rcssmin == 1.1.0" "rcssmin>=1.1.0" \
+      --replace "rjsmin == 1.2.0" "rjsmin>=1.2.0"
+  '';
+
+  propagatedBuildInputs = [
+    rcssmin
+    rjsmin
+    django-appconf
+  ];
+
+  pythonImportsCheck = [
+    "compressor"
+  ];
+
+  doCheck = false; # missing package django-sekizai
+
+  checkInputs = [
+    beautifulsoup4
+    brotli
+    pytestCheckHook
+  ];
+
+  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/en/latest/";
+    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..4bddb62bdd1a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-configurations/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, buildPythonPackage
+, dj-database-url
+, dj-email-url
+, dj-search-url
+, django
+, django-cache-url
+, django-discover-runner
+, fetchPypi
+, importlib-metadata
+, mock
+, pythonOlder
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "django-configurations";
+  version = "2.3.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "bd1a77a60735839b7d105912cc3977735fa005ea06544c632fbd322d1e021677";
+  };
+
+  buildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    django
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  checkInputs = [
+    django-discover-runner
+    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; [ costrouc ];
+  };
+}
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..ace1dc4f2de5
--- /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.7.0";
+
+  src = fetchFromGitHub {
+    owner = "adamchainz";
+    repo = "django-cors-headers";
+    rev = version;
+    sha256 = "1wc8cs1gpg9v98bq5qwnd4pcv043za50wd63gwkm86lbvjxyxynz";
+  };
+
+  propagatedBuildInputs = [
+    django
+  ];
+
+  checkInputs = [
+    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-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..b4409dc04d4c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-debug-toolbar/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, fetchFromGitHub
+, pythonOlder
+, buildPythonPackage
+, python
+, django
+, jinja2
+, sqlparse
+, html5lib
+}:
+
+buildPythonPackage rec {
+  pname = "django-debug-toolbar";
+  version = "3.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "jazzband";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-OZWO3tXZ+p+zKtQHCkj0kGSXpDFHFV+HqSgiJvLmMTg=";
+  };
+
+  propagatedBuildInputs = [
+    django
+    jinja2
+    sqlparse
+  ];
+
+  DB_BACKEND = "sqlite3";
+  DB_NAME = ":memory:";
+  TEST_ARGS = "tests";
+  DJANGO_SETTINGS_MODULE = "tests.settings";
+
+  checkInputs = [
+    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-discover-runner/default.nix b/nixpkgs/pkgs/development/python-modules/django-discover-runner/default.nix
new file mode 100644
index 000000000000..8d07148ce182
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-discover-runner/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, django
+}:
+
+buildPythonPackage rec {
+  version = "1.0";
+  pname = "django-discover-runner";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0ba91fe722c256bcbfdeb36fac7eac0f27e5bfda55d98c4c1cf9ab62b5b084fe";
+  };
+
+  propagatedBuildInputs = [ django ];
+
+  # tests not included with release
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/jezdez/django-discover-runner";
+    description = "A Django test runner based on unittest2's test discovery";
+    license = licenses.bsd0;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..10cb2d132aa8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-dynamic-preferences/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchPypi
+, django, persisting-theory, six
+}:
+
+buildPythonPackage rec {
+  pname = "django-dynamic-preferences";
+  version = "1.13.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-t7E8kTtbb24FyICv6uGpGxR6W8EfuVB5FR2cyItgalA=";
+  };
+
+  propagatedBuildInputs = [ six django persisting-theory ];
+
+  # django.core.exceptions.ImproperlyConfigured: Requested setting DYNAMIC_PREFERENCES, 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; {
+    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-extensions/default.nix b/nixpkgs/pkgs/development/python-modules/django-extensions/default.nix
new file mode 100644
index 000000000000..b7cc95f7c5fa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-extensions/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, django
+, factory_boy
+, mock
+, pygments
+, pytest-django
+, pytestCheckHook
+, shortuuid
+, vobject
+, werkzeug
+}:
+
+buildPythonPackage rec {
+  pname = "django-extensions";
+  version = "3.2.0";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-jibske9cnOn4FPAGNs2EU1w1huF4dNxHAnOzuKSj3/E=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "--cov=django_extensions --cov-report html --cov-report term" ""
+  '';
+
+  propagatedBuildInputs = [
+    django
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  checkInputs = [
+    factory_boy
+    mock
+    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..bf4e342cc2d1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-filter/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, django
+, djangorestframework, python, mock
+}:
+
+buildPythonPackage rec {
+  pname = "django-filter";
+  version = "22.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-7Uc7duhPfoOyURuyBQw++zbRNSB9ASjf465LNuNZS6U=";
+  };
+
+  propagatedBuildInputs = [ django ];
+
+  pythonImportsCheck = [
+    "django_filters"
+  ];
+
+  # Tests fail (needs the 'crispy_forms' module not packaged on nixos)
+  doCheck = false;
+
+  checkInputs = [
+    djangorestframework
+    django
+    mock
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+    ${python.interpreter} runtests.py tests
+    runHook postCheck
+  '';
+
+  meta = with lib; {
+    description = "Reusable Django application for allowing users to filter querysets dynamically";
+    homepage = "https://pypi.org/project/django-filter/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ mmai ];
+  };
+}
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..c85d5d3fcc75
--- /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.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9663b6eca64777b68d6d4142efad8597fe9a685924673b25aa8a1dcff4db00c3";
+  };
+
+  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-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..c6636ee5eabb
--- /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 ];
+
+  checkInputs = [
+    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; [ SuperSandro2000 ];
+  };
+}
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..b391fcac495e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-haystack/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+
+# build dependencies
+, setuptools-scm
+
+# dependencies
+, django
+
+# tests
+, geopy
+, nose
+, pysolr
+, python-dateutil
+, requests
+, whoosh
+}:
+
+buildPythonPackage rec {
+  pname = "django-haystack";
+  version = "3.2.1";
+  format = "setuptools";
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-l+MZeu/CJf5AW28XYAolNL+CfLTWdDEwwgvBoG9yk6Q=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "geopy==" "geopy>="
+  '';
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    django
+  ];
+
+  checkInputs = [
+    geopy
+    nose
+    pysolr
+    python-dateutil
+    requests
+    whoosh
+  ];
+
+  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-health-check/default.nix b/nixpkgs/pkgs/development/python-modules/django-health-check/default.nix
new file mode 100644
index 000000000000..6f38ae77e16a
--- /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.16.5";
+
+  src = fetchFromGitHub {
+    owner = "KristianOellegaard";
+    repo = pname;
+    rev = version;
+    hash = "sha256-Jfzi+o4ja2sNCSPfX9eRq3WGid1gcfehhayAD1L4f2U=";
+    leaveDotGit = true;
+  };
+
+  buildInputs = [
+    sphinx
+    django
+  ];
+
+  nativeBuildInputs = [
+    setuptools-scm
+    gitMinimal
+  ];
+
+  checkInputs = [
+    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-hijack-admin/default.nix b/nixpkgs/pkgs/development/python-modules/django-hijack-admin/default.nix
new file mode 100644
index 000000000000..ccd285757cbd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-hijack-admin/default.nix
@@ -0,0 +1,41 @@
+{ lib, buildPythonPackage, fetchFromGitHub, python,
+  django_hijack, django_nose }:
+buildPythonPackage rec {
+  pname = "django-hijack-admin";
+  version = "2.1.10";
+
+  # the pypi packages don't include everything required for the tests
+  src = fetchFromGitHub {
+    owner = "arteria";
+    repo = "django-hijack-admin";
+    rev = "v${version}";
+    sha256 = "0m98lchp2y43886n67j4s7miyd50pg2r5r966vjnxmd7nx7qkihf";
+  };
+
+  checkInputs = [ django_nose ];
+  propagatedBuildInputs = [ django_hijack ];
+
+  checkPhase = ''
+    runHook preCheck
+
+    # we have to do a little bit of tinkering to convince the tests to run against the installed package, not the
+    # source directory
+    mkdir testbase
+    pushd testbase
+    mv ../runtests.py .
+    ${python.interpreter} runtests.py hijack_admin
+    popd
+
+    runHook postCheck
+  '';
+
+  meta = with lib; {
+    description = "Admin integration for django-hijack";
+    homepage = "https://github.com/arteria/django-hijack-admin";
+    license = licenses.mit;
+    maintainers = with maintainers; [ lsix ];
+    # may be unmaintained, doesn't work with recent django-hijack:
+    # https://github.com/django-hijack/django-hijack-admin/issues/46
+    broken = true;
+  };
+}
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..326db4e3232a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-hijack/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, django
+, django_compat
+, pytest-django
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "django-hijack";
+  version = "3.2.1";
+
+  # the wheel comes with pre-built assets, allowing us to avoid fighting
+  # with npm/webpack/gettext to build them ourselves.
+  format = "wheel";
+  src = fetchPypi {
+    inherit version format;
+    pname = "django_hijack";
+    dist = "py3";
+    python = "py3";
+    sha256 = "sha256-sHI3ULJH5bH2n2AKQLHVEkBAYfM5GOC/+0qpKDFOods=";
+  };
+
+  propagatedBuildInputs = [ django django_compat ];
+
+  checkInputs = [ pytestCheckHook pytest-django ];
+  preCheck = ''
+    export DJANGO_SETTINGS_MODULE='hijack.tests.test_app.settings'
+  '';
+  pytestFlagsArray = [ "--pyargs" "hijack" ];
+
+  meta = with lib; {
+    description = "Allows superusers to hijack (=login as) and work on behalf of another user";
+    homepage = "https://github.com/arteria/django-hijack";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ris ];
+  };
+}
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..ba8f1d79db8c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-ipware/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchPypi, django }:
+
+buildPythonPackage rec {
+  pname = "django-ipware";
+  version = "4.0.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "602a58325a4808bd19197fef2676a0b2da2df40d0ecf21be414b2ff48c72ad05";
+  };
+
+  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";
+    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..8216ca4ff872
--- /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.10.2";
+
+  disabled = pythonOlder "3.6";
+
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "niwinz";
+    repo = "django-jinja";
+    rev = version;
+    hash = "sha256-IZ4HjBQt6K8xbaYfO5DVlGKUVCQ3UciAUpfnqCjzyCE=";
+  };
+
+  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-js-asset/default.nix b/nixpkgs/pkgs/development/python-modules/django-js-asset/default.nix
new file mode 100644
index 000000000000..f921077934fd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-js-asset/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, django
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "django-js-asset";
+  version = "2.0";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "matthiask";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-YDOmbqB0xDBAlOSO1UBYJ8VfRjJ8Z6Hw1i24DNSrnjw=";
+  };
+
+  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-logentry-admin/default.nix b/nixpkgs/pkgs/development/python-modules/django-logentry-admin/default.nix
new file mode 100644
index 000000000000..1a3998dc8c1a
--- /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";
+  };
+
+  checkInputs = [ 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-mailman3/default.nix b/nixpkgs/pkgs/development/python-modules/django-mailman3/default.nix
new file mode 100644
index 000000000000..b4c98826dc55
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-mailman3/default.nix
@@ -0,0 +1,33 @@
+{ lib, buildPythonPackage, fetchPypi
+, django-gravatar2, django-compressor, django-allauth, mailmanclient
+, django, mock
+}:
+
+buildPythonPackage rec {
+  pname = "django-mailman3";
+  version = "1.3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "6ea8c24c13e7afe744f18e18e4d19d0e74223e0d9bd5d782deea85dcb865feb7";
+  };
+
+  propagatedBuildInputs = [
+    django-gravatar2 django-compressor django-allauth mailmanclient
+  ];
+  checkInputs = [ django mock ];
+
+  checkPhase = ''
+    cd $NIX_BUILD_TOP/$sourceRoot
+    PYTHONPATH=.:$PYTHONPATH django-admin.py test --settings=django_mailman3.tests.settings_test
+  '';
+
+  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; [ globin 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..76ae8338eeb2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-maintenance-mode/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, pytest
+, django
+, python-fsutil
+}:
+
+buildPythonPackage rec {
+  pname = "django-maintenance-mode";
+  version = "0.16.3";
+
+  src = fetchFromGitHub {
+    owner = "fabiocaccamo";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-G08xQpLQxnt7JbtIo06z0NlRAMbca3UWbo4aXQR/Wy0=";
+  };
+
+  checkInputs = [ pytest ];
+
+  propagatedBuildInputs = [ django python-fsutil ];
+
+  meta = with lib; {
+    description = "Shows a 503 error page when maintenance-mode is on";
+    homepage = "https://github.com/fabiocaccamo/django-maintenance-mode";
+    maintainers = with maintainers; [ mrmebelman ];
+    license = licenses.bsd3;
+  };
+}
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..dc2bd2fbc34f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-model-utils/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, django
+, freezegun
+, psycopg2
+, pytest-django
+, pytestCheckHook
+, pythonOlder
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "django-model-utils";
+  version = "4.2.0";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "jazzband";
+    repo = "django-model-utils";
+    rev = version;
+    sha256 = "sha256-TLqvpP/ZaGGFdqnN+UHbhXv1K1YVYTYBkCiWCjYrFh8=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    django
+  ];
+
+  # requires postgres database
+  doCheck = false;
+
+  checkInputs = [
+    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";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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-oauth-toolkit/default.nix b/nixpkgs/pkgs/development/python-modules/django-oauth-toolkit/default.nix
new file mode 100644
index 000000000000..65bf5045a035
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-oauth-toolkit/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+
+# propagates
+, django
+, jwcrypto
+, requests
+, oauthlib
+
+# tests
+, djangorestframework
+, pytest-django
+, pytest-xdist
+, pytest-mock
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "django-oauth-toolkit";
+  version = "2.1.0";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "jazzband";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-c78QYlU/gB4Lt04TlQFjtsS6pyjDm/fURBMa9hXLpLI=";
+  };
+
+  postPatch = ''
+    sed -i '/cov/d' tox.ini
+  '';
+
+  propagatedBuildInputs = [
+    django
+    jwcrypto
+    oauthlib
+    requests
+  ];
+
+  DJANGO_SETTINGS_MODULE = "tests.settings";
+
+  checkInputs = [
+    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..30c361723e8f
--- /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}";
+    sha256 = "sha256-Ac9p7q9yaUr3WTTGxCY16Yo/Z8i1RtnD2g0Aj2pqSXY=";
+  };
+
+  postPatch = ''
+    patchShebangs manage.py
+  '';
+
+  propagatedBuildInputs = [
+    django
+    qrcode
+  ];
+
+  checkInputs = [
+    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; [ SuperSandro2000 ];
+  };
+}
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-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-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..daebb7f7e048
--- /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}";
+    sha256 = "sha256-JJY+FoMPSnWuSsNIas2JedGJpdm6RfPE3E1VIjGuXIc=";
+  };
+
+  propagatedBuildInputs = [ django ];
+
+  checkInputs = [ 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; [ SuperSandro2000 ];
+  };
+}
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..141a46f53154
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-postgresql-netfields/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, django
+, netaddr
+, six
+, fetchFromGitHub
+# required for tests
+#, djangorestframework
+#, psycopg2
+#, unittest2
+}:
+
+buildPythonPackage rec {
+  version = "1.2.2";
+  pname = "django-postgresql-netfields";
+
+  src = fetchFromGitHub {
+    owner = "jimfunk";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1rrh38f3zl3jk5ijs6g75dxxvxygf4lczbgc7ahrgzf58g4a48lm";
+  };
+
+  # tests need a postgres database
+  doCheck = false;
+
+  # keeping the dependencies below as comment for reference
+  # checkPhase = ''
+    # python manage.py test
+  # '';
+
+  # buildInputs = [
+    # djangorestframework
+    # psycopg2
+    # unittest2
+  # ];
+
+  propagatedBuildInputs = [
+    django
+    netaddr
+    six
+  ];
+
+  meta = with lib; {
+    description = "Django PostgreSQL netfields implementation";
+    homepage = "https://github.com/jimfunk/django-postgresql-netfields";
+    license = licenses.bsd2;
+  };
+}
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..209395ef6430
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-prometheus/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, prometheus-client
+, pytest-django
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "django-prometheus";
+  version = "2.2.0";
+  format = "setuptools";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "korfuri";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-NE0zHnGGSrtkBLrSyBcQuyGrSfSQbdpevokg3YZhwDw=";
+  };
+
+  patches = [
+    ./drop-untestable-database-backends.patch
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace '"pytest-runner"' ""
+  '';
+
+  propagatedBuildInputs = [
+    prometheus-client
+  ];
+
+  pythonImportsCheck = [
+    "django_prometheus"
+  ];
+
+  checkInputs = [
+    pytest-django
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    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-q/default.nix b/nixpkgs/pkgs/development/python-modules/django-q/default.nix
new file mode 100644
index 000000000000..a6ebb5714d9d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-q/default.nix
@@ -0,0 +1,82 @@
+{ arrow
+, blessed
+, buildPythonPackage
+, croniter
+, django
+, django-redis
+, django-picklefield
+, fetchFromGitHub
+, future
+, lib
+, poetry-core
+, pytest-django
+, pytest-mock
+, pytestCheckHook
+, pkgs
+, stdenv
+}:
+
+buildPythonPackage rec {
+  pname = "django-q";
+  version = "1.3.9";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "Koed00";
+    repo = "django-q";
+    sha256 = "sha256-gFSrAl3QGoJEJfvTTvLQgViPPjeJ6BfvgEwgLLo+uAA=";
+    rev = "v${version}";
+  };
+
+  nativeBuildInputs = [ poetry-core ];
+
+  propagatedBuildInputs = [
+    django-picklefield
+    arrow
+    blessed
+    django
+    future
+  ];
+
+  # fixes empty version string
+  # analog to https://github.com/NixOS/nixpkgs/pull/171200
+  patches = [
+    ./pep-621.patch
+  ];
+
+  pythonImportsCheck = [
+    "django_q"
+  ];
+
+  preCheck = ''
+    ${pkgs.redis}/bin/redis-server &
+    REDIS_PID=$!
+  '';
+
+  postCheck = ''
+    kill $REDIS_PID
+  '';
+
+  checkInputs = [
+    croniter
+    django-redis
+    pytest-django
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  # 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";
+    license = licenses.mit;
+    maintainers = with maintainers; [ gador ];
+  };
+}
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..f590aca527f4
--- /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..1ad52e22d0ff
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-redis/default.nix
@@ -0,0 +1,87 @@
+{ lib
+, fetchFromGitHub
+, pythonOlder
+, buildPythonPackage
+
+# propagated
+, django
+, hiredis
+, lz4
+, msgpack
+, redis
+
+# testing
+, pkgs
+, pytest-django
+, pytest-mock
+, pytestCheckHook
+}:
+
+let
+  pname = "django-redis";
+  version = "5.2.0";
+in
+buildPythonPackage {
+  inherit pname version;
+  format = "setuptools";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "jazzband";
+    repo = "django-redis";
+    rev = version;
+    sha256 = "sha256-e8wCgfxBT+WKFY4H83CTMirTpQym3QAoeWnXbRCDO90=";
+  };
+
+  postPatch = ''
+    sed -i '/-cov/d' setup.cfg
+  '';
+
+  propagatedBuildInputs = [
+    django
+    hiredis
+    lz4
+    msgpack
+    redis
+  ];
+
+  pythonImportsCheck = [
+    "django_redis"
+  ];
+
+  DJANGO_SETTINGS_MODULE = "tests.settings.sqlite";
+
+  preCheck = ''
+    ${pkgs.redis}/bin/redis-server &
+    REDIS_PID=$!
+  '';
+
+  postCheck = ''
+    kill $REDIS_PID
+  '';
+
+  checkInputs = [
+    pytest-django
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # ModuleNotFoundError: No module named 'test_cache_options'
+    "test_custom_key_function"
+    # ModuleNotFoundError: No module named 'test_client'
+    "test_delete_pattern_calls_get_client_given_no_client"
+    "test_delete_pattern_calls_make_pattern"
+    "test_delete_pattern_calls_scan_iter_with_count_if_itersize_given"
+    "test_delete_pattern_calls_scan_iter_with_count_if_itersize_given"
+    "test_delete_pattern_calls_scan_iter"
+    "test_delete_pattern_calls_delete_for_given_keys"
+  ];
+
+  meta = with lib; {
+    description = "Full featured redis cache backend for Django";
+    homepage = "https://github.com/jazzband/django-redis";
+    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..ac7fc4813e71
--- /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;
+    sha256 = "sha256-rCChUHv8sTEFErDCZnPN5b5XVtMJ7JNVZwBYF3d99mY=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "djangorestframework-jwt" "drf-jwt"
+  '';
+
+  propagatedBuildInputs = [
+    django
+    djangorestframework
+    six
+  ];
+
+  checkInputs = [
+    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; [ SuperSandro2000 ];
+  };
+}
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..c53fd183db91
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-rest-polymorphic/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, django
+, django-polymorphic
+, djangorestframework
+, pytest-django
+, pytest-mock
+, pytestCheckHook
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "django-rest-polymorphic";
+  version = "0.1.9";
+
+  src = fetchFromGitHub {
+    owner = "apirobot";
+    repo = "django-rest-polymorphic";
+    rev = "v${version}";
+    sha256 = "sha256-p3ew2NONSyiGzDzxGTy/cx3fcQhhvnzqopJzgqhXadY=";
+  };
+
+  propagatedBuildInputs = [
+    django
+    django-polymorphic
+    djangorestframework
+    six
+  ];
+
+  checkInputs = [
+    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; [ SuperSandro2000 ];
+  };
+}
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..2932eb31e114
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-reversion/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, django
+}:
+
+buildPythonPackage rec {
+  pname = "django-reversion";
+  version = "5.0.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-JDoS7k4EwWEcDwdvv8MHTxrUCvxFrcZN5bokFMxOryk=";
+  };
+
+  # tests assume the availability of a mysql/postgresql database
+  doCheck = false;
+
+  propagatedBuildInputs = [ django ];
+
+  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";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
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..ebdbd916ef1d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-rq/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, isPy27
+, fetchFromGitHub
+, django
+, redis
+, rq
+, sentry-sdk
+}:
+
+buildPythonPackage rec {
+  pname = "django-rq";
+  version = "2.5.1";
+  format = "setuptools";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "rq";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-4oc3zco/j4lnAiooW87rU6xkzGSGCj3fIyikjiKQNZk=";
+  };
+
+  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";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
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..e24fff1efe77
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-sesame/default.nix
@@ -0,0 +1,27 @@
+{ lib, buildPythonPackage, fetchFromGitHub
+, django }:
+
+buildPythonPackage rec {
+  pname = "django-sesame";
+  version = "1.7";
+
+  src = fetchFromGitHub {
+    owner = "aaugustin";
+    repo = pname;
+    rev = version;
+    sha256 = "0k8s44zn2jmasp0w064vrx685fn4pbmdfx8qmhkab1hd5ys6pi44";
+  };
+
+  checkInputs = [ django ];
+
+  checkPhase = ''
+    make test
+  '';
+
+  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-simple-captcha/default.nix b/nixpkgs/pkgs/development/python-modules/django-simple-captcha/default.nix
new file mode 100644
index 000000000000..2a7f1e1da26d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-simple-captcha/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+, six
+, testfixtures
+, django
+, django-ranged-response
+, pillow
+, withTTS ? true
+, flite
+}:
+
+buildPythonPackage rec {
+  pname = "django-simple-captcha";
+  version = "0.5.14";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "84b5c188e6ae50e9ecec5e5d734c5bc4d2a50fbbca7f59d2c12da9a3bbee5051";
+    extension = "zip";
+  };
+
+  checkInputs = [ testfixtures ];
+  checkPhase = ''
+    cd testproject
+    ${python.interpreter} manage.py test captcha
+  '';
+
+  propagatedBuildInputs = [ django django-ranged-response six pillow ]
+  ++ lib.optional withTTS flite;
+
+  meta = with lib; {
+    description = "An extremely simple, yet highly customizable Django application to add captcha images to any Django form";
+    homepage = "https://github.com/mbi/django-simple-captcha";
+    license = licenses.mit;
+    maintainers = with maintainers; [ mrmebelman schmittlauch ];
+  };
+}
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..08641aa935f9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-sites/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, django
+, django-jinja
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "django-sites";
+  version = "0.11";
+
+  src = fetchFromGitHub {
+    owner = "niwinz";
+    repo = "django-sites";
+    rev = version;
+    sha256 = "sha256-MQtQC+9DyS1ICXXovbqPpkKIQ5wpuJDgq3Lcd/1kORU=";
+  };
+
+  propagatedBuildInputs = [
+    django
+  ];
+
+  checkInputs = [
+    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;
+  };
+}
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..8fcfa070d2d4
--- /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";
+
+  checkInputs = [
+    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..040fe39d2b50
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-storages/default.nix
@@ -0,0 +1,47 @@
+{ lib, buildPythonPackage, fetchPypi
+, django
+
+, azure-storage-blob
+, boto3
+, dropbox
+, google-cloud-storage
+, libcloud
+, paramiko
+}:
+
+buildPythonPackage rec {
+  pname = "django-storages";
+  version = "1.13.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-s9mOzAnxsWJ8Kyz0MJZDIs5OCGF9v5tCNsFqModaHgs=";
+  };
+
+  propagatedBuildInputs = [ django ];
+
+  preCheck = ''
+    export DJANGO_SETTINGS_MODULE=tests.settings
+    # timezone issues https://github.com/jschneier/django-storages/issues/1171
+    substituteInPlace tests/test_sftp.py \
+      --replace 'test_accessed_time' 'dont_test_accessed_time' \
+      --replace 'test_modified_time' 'dont_test_modified_time'
+  '';
+  checkInputs = [
+    azure-storage-blob
+    boto3
+    dropbox
+    google-cloud-storage
+    libcloud
+    paramiko
+  ];
+
+  pythonImportsCheck = [ "storages" ];
+
+  meta = with lib; {
+    description = "Collection of custom storage backends for Django";
+    homepage = "https://django-storages.readthedocs.io";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ mmai ];
+  };
+}
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..41637e7472ca
--- /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.4.1";
+  format = "setuptools";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "jieter";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "04vvgf18diwp0mgp14b71a0dxhgrcslv1ljybi300gvzvzjnp3qv";
+  };
+
+  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-taggit/default.nix b/nixpkgs/pkgs/development/python-modules/django-taggit/default.nix
new file mode 100644
index 000000000000..22f7f83decd8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-taggit/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, django
+, djangorestframework
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "django-taggit";
+  version = "3.0.0";
+  format = "setuptools";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-5kW4491PhZidXvXFo9Xrvlut9dHlG1PkLQr3JiQLALk=";
+  };
+
+  propagatedBuildInputs = [
+    django
+  ];
+
+  pythonImportsCheck = [
+    "taggit"
+  ];
+
+  checkInputs = [
+    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";
+    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..a6c184e2d67e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-tastypie/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, python-dateutil
+, python-mimeparse
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "django-tastypie";
+  version = "0.14.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "django-tastypie";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-O/aVi8BshOZmg9WQxrFlBEOXfgyqJKVK/QlEFG3Edqs=";
+  };
+
+  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";
+    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..f8f85adf0d3d
--- /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.0";
+  disabled = pythonOlder "3.5";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "mfogel";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-GXkvF/kAOU1JK0GDpUT1irCQlkxIWieYRqPd0fr2HXw=";
+  };
+
+  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";
+
+  checkInputs = [
+    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-versatileimagefield/default.nix b/nixpkgs/pkgs/development/python-modules/django-versatileimagefield/default.nix
new file mode 100644
index 000000000000..01c1b8353ba8
--- /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 = "2.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "6569d5c3e13c69ab8912ba5100084aa5abcdcffb8d1f5abc085b226e7bbd65b3";
+  };
+  propagatedBuildInputs = [ pillow python-magic ];
+
+  checkInputs = [ 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-webpack-loader/default.nix b/nixpkgs/pkgs/development/python-modules/django-webpack-loader/default.nix
new file mode 100644
index 000000000000..ee51b0e7c8ec
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-webpack-loader/default.nix
@@ -0,0 +1,21 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "django-webpack-loader";
+  version = "1.6.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-opQY/0FpADW+ENLJSgZV2rCZAJxouJiDmBPWoQmxTXE=";
+  };
+
+  # django.core.exceptions.ImproperlyConfigured (path issue with DJANGO_SETTINGS_MODULE?)
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Use webpack to generate your static bundles";
+    homepage = "https://github.com/owais/django-webpack-loader";
+    maintainers = with maintainers; [ peterromfeldhk ];
+    license = with licenses; [ mit ];
+  };
+}
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..5fd29de16107
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-widget-tweaks/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+
+# native
+, setuptools-scm
+
+# propagated
+, django
+
+# tests
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "django-widget-tweaks";
+  version = "1.4.12";
+
+  src = fetchFromGitHub { # package from Pypi missing runtests.py
+    owner = "jazzband";
+    repo = pname;
+    rev = version;
+    sha256 = "1rhn2skx287k6nnkxlwvl9snbia6w6z4c2rqg22hwzbz5w05b24h";
+  };
+
+  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";
+    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..204857b925f4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django/3.nix
@@ -0,0 +1,52 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, substituteAll
+, geos39
+, gdal
+, asgiref
+, pytz
+, sqlparse
+, pythonOlder
+, withGdal ? false
+}:
+
+buildPythonPackage rec {
+  pname = "django";
+  version = "3.2.15";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "Django";
+    inherit version;
+    hash = "sha256-9xk0sagi8UqGyayWNAU2iSec0ErmnLat5KWUcbiGWCs=";
+  };
+
+  patches = 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..29e45201e01a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django/4.nix
@@ -0,0 +1,117 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, substituteAll
+
+# patched in
+, fetchpatch
+, geos
+, gdal
+, withGdal ? false
+
+# propagated
+, asgiref
+, backports-zoneinfo
+, sqlparse
+
+# tests
+, aiosmtpd
+, argon2-cffi
+, bcrypt
+, docutils
+, geoip2
+, jinja2
+, python-memcached
+, numpy
+, pillow
+, pylibmc
+, pymemcache
+, python
+, pytz
+, pywatchman
+, pyyaml
+, redis
+, selenium
+, tblib
+, tzdata
+}:
+
+buildPythonPackage rec {
+  pname = "Django";
+  version = "4.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Ay+Kb8fPBczRIU5KLiHfzWojudV1xlc8rMjGeCjb5kI=";
+  };
+
+  patches = [
+    (fetchpatch {
+      # Fix regression in sqlite backend introduced in 4.1.
+      # https://github.com/django/django/pull/15925
+      url = "https://github.com/django/django/commit/c0beff21239e70cbdcc9597e5be09e505bb8f76c.patch";
+      hash = "sha256-QE7QnfYAK74wvK8gDJ15FtQ+BCIWRQKAVvM7v1FzwlE=";
+      excludes = [ "docs/releases/4.1.1.txt" ];
+    })
+  ] ++ lib.optionals withGdal [
+    (substituteAll {
+      src = ./django_4_set_geos_gdal_lib.patch;
+      geos = geos;
+      gdal = gdal;
+      extension = stdenv.hostPlatform.extensions.sharedLibrary;
+    })
+  ];
+
+  propagatedBuildInputs = [
+    asgiref
+    sqlparse
+  ] ++ lib.optionals (pythonOlder "3.9") [
+    backports-zoneinfo
+  ];
+
+  # Fails to import asgiref in ~200 tests
+  # ModuleNotFoundError: No module named 'asgiref'
+  doCheck = false;
+
+  checkInputs = [
+    aiosmtpd
+    argon2-cffi
+    asgiref
+    bcrypt
+    docutils
+    geoip2
+    jinja2
+    python-memcached
+    numpy
+    pillow
+    pylibmc
+    pymemcache
+    pytz
+    pywatchman
+    pyyaml
+    redis
+    selenium
+    tblib
+    tzdata
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+
+    ${python.interpreter} tests/runtests.py
+
+    runHook postCheck
+  '';
+
+  meta = with lib; {
+    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_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_classytags/default.nix b/nixpkgs/pkgs/development/python-modules/django_classytags/default.nix
new file mode 100644
index 000000000000..d7d2e8789ae7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django_classytags/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, django
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "django-classy-tags";
+  version = "3.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-0iK0VQKsmeVQpWZmeDnvrvlUucc2amST8UOGKqvqyHg=";
+  };
+
+  propagatedBuildInputs = [ django six ];
+
+  # pypi version doesn't include runtest.py, needed to run tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Class based template tags for Django";
+    homepage = "https://github.com/divio/django-classy-tags";
+    license = licenses.bsd3;
+  };
+
+}
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_contrib_comments/default.nix b/nixpkgs/pkgs/development/python-modules/django_contrib_comments/default.nix
new file mode 100644
index 000000000000..88bbdfdeddb9
--- /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;
+    sha256 = "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_environ/default.nix b/nixpkgs/pkgs/development/python-modules/django_environ/default.nix
new file mode 100644
index 000000000000..4fa1b0e8cef8
--- /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.9.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-v/U4FTMFYyjJrAL3F5C9W/HOqBsb7rZI8ouByeg+CiE=";
+  };
+
+  # 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_modelcluster/default.nix b/nixpkgs/pkgs/development/python-modules/django_modelcluster/default.nix
new file mode 100644
index 000000000000..d59682de2f81
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django_modelcluster/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, django
+, django-taggit
+, pytz
+, pythonOlder
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "django-modelcluster";
+  version = "6.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "wagtail";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-p6hvOkPWRVJYLHvwyn9nS05wblikRFmlSYZuLiCcuqc=";
+  };
+
+  propagatedBuildInputs = [
+    django
+    pytz
+  ];
+
+  passthru.optional-dependencies.taggit = [
+    django-taggit
+  ];
+
+  checkInputs = passthru.optional-dependencies.taggit;
+
+  checkPhase = ''
+    runHook preCheck
+    ${python.interpreter} ./runtests.py --noinput
+    runHook postCheck
+  '';
+
+  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_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_silk/default.nix b/nixpkgs/pkgs/development/python-modules/django_silk/default.nix
new file mode 100644
index 000000000000..b81e5b0927ae
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django_silk/default.nix
@@ -0,0 +1,74 @@
+{ lib
+, buildPythonPackage
+, python
+, pythonAtLeast
+, fetchFromGitHub
+, fetchpatch
+, django
+, pygments
+, simplejson
+, python-dateutil
+, requests
+, setuptools-scm
+, sqlparse
+, jinja2
+, autopep8
+, pytz
+, pillow
+, mock
+, gprof2dot
+, freezegun
+, contextlib2
+, networkx
+, pydot
+, factory_boy
+}:
+
+buildPythonPackage rec {
+  pname = "django-silk";
+  version = "5.0.1";
+
+  # pypi tarball doesn't include test project
+  src = fetchFromGitHub {
+    owner = "jazzband";
+    repo = "django-silk";
+    rev = version;
+    hash = "sha256-U2lj0B85cf2xu0o7enuLJB5YKaIt6gMvn+TgxleLslk=";
+  };
+
+  # "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 = [
+    django pygments simplejson python-dateutil requests
+    sqlparse jinja2 autopep8 pytz pillow gprof2dot
+  ];
+
+  checkInputs = [ freezegun contextlib2 networkx pydot factory_boy ];
+  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";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ris ];
+  };
+
+}
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_treebeard/default.nix b/nixpkgs/pkgs/development/python-modules/django_treebeard/default.nix
new file mode 100644
index 000000000000..be63c1e9e3c9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django_treebeard/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+, django
+}:
+
+buildPythonPackage rec {
+  pname = "django-treebeard";
+  version = "4.5.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "80150017725239702054e5fa64dc66e383dc13ac262c8d47ee5a82cb005969da";
+  };
+
+  buildInputs = [ pytest ];
+  propagatedBuildInputs = [ django ];
+
+  # tests fail  "AppRegistryNotReady("Apps aren't loaded yet.")"
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Efficient tree implementations for Django 1.6+";
+    homepage = "https://tabo.pe/projects/django-treebeard/";
+    maintainers = with maintainers; [ desiderius ];
+    license = licenses.asl20;
+  };
+
+}
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..0e38c82cab7e
--- /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;
+    sha256 = "sha256-TwU9ASjij0EpJuLakCc19L3Lq1wI1Dvk3+/XR/yi6W4=";
+  };
+
+  propagatedBuildInputs = [ ply ];
+
+  checkInputs = [ 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..1a2cde8881c8
--- /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.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-31kTYv+kSMjwo1TFauilP7eruxXiIpUdDG9feBYzkH4=";
+  };
+
+  propagatedBuildInputs = [
+    djangorestframework
+  ];
+
+  checkInputs = [
+    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; [ SuperSandro2000 ];
+  };
+}
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..c6b56651f927
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/djangorestframework-dataclasses/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, djangorestframework
+}:
+
+buildPythonPackage rec {
+  pname = "djangorestframework-dataclasses";
+  version = "1.1.1";
+
+  src = fetchFromGitHub {
+    owner = "oxan";
+    repo = "djangorestframework-dataclasses";
+    rev = "v${version}";
+    sha256 = "sha256-wXgA/4Dik6yG0nKl9GbrHgb2lhrPsgS23+cEyaD9MRY=";
+  };
+
+  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; [ SuperSandro2000 ];
+  };
+}
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..e822a26d0fca
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/djangorestframework-guardian/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, django-guardian
+, djangorestframework
+}:
+
+buildPythonPackage rec {
+  pname = "djangorestframework-guardian";
+  version = "0.3.0";
+
+  src = fetchFromGitHub {
+    owner = "rpkilby";
+    repo = "django-rest-framework-guardian";
+    rev = version;
+    sha256 = "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; [ SuperSandro2000 ];
+  };
+}
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..e8dfe0c11550
--- /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;
+    sha256 = "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; [ SuperSandro2000 ];
+  };
+}
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..7a24ba5a8454
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/djangorestframework-simplejwt/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, django
+, djangorestframework
+, fetchPypi
+, pyjwt
+, python-jose
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "djangorestframework-simplejwt";
+  version = "5.2.0";
+
+  src = fetchPypi {
+    pname = "djangorestframework_simplejwt";
+    inherit version;
+    sha256 = "sha256-pgsJr7J9ka0deskEzGMr1Szs6tjzifD6FTLOsPt1enQ=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    django
+    djangorestframework
+    pyjwt
+    python-jose
+  ];
+
+  # 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";
+    license = licenses.mit;
+    maintainers = with maintainers; [ arnoldfarkas ];
+  };
+}
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..7feb65620265
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/djangorestframework/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, coreapi
+, django
+, django-guardian
+, pythonOlder
+, pytest-django
+, pytestCheckHook
+, pytz
+, pyyaml
+, uritemplate
+}:
+
+buildPythonPackage rec {
+  pname = "djangorestframework";
+  version = "3.13.1";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "encode";
+    repo = "django-rest-framework";
+    rev = version;
+    sha256 = "sha256-XmX6DZBZYzVCe72GERplAWt5jIjV/cYercZGb0pYjoc=";
+  };
+
+
+  propagatedBuildInputs = [
+    django
+    pytz
+  ];
+
+  checkInputs = [
+    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 SuperSandro2000 ];
+    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..aaaf5708a593
--- /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.0.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9a2420bf09af686736773153fca32a02ae11ecbe24b540c26104628959f91121";
+};
+
+  checkInputs = [ 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..642794835654
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dlib/default.nix
@@ -0,0 +1,32 @@
+{ stdenv, buildPythonPackage, dlib, python, pytest, more-itertools
+, sse4Support ? stdenv.hostPlatform.sse4_1Support
+, avxSupport ? stdenv.hostPlatform.avxSupport
+}:
+
+buildPythonPackage {
+  inherit (dlib) name src nativeBuildInputs buildInputs meta;
+
+  # 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"}"
+  ];
+
+  patches = [ ./build-cores.patch ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "more-itertools<6.0.0" "more-itertools" \
+      --replace "pytest==3.8" "pytest"
+  '';
+
+  checkInputs = [ pytest more-itertools ];
+
+  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..a1f3ace78275
--- /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
+  ];
+
+  checkInputs = [
+    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/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..92c234c215c3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dm-env/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, dm-tree
+, numpy
+, absl-py
+, nose }:
+
+buildPythonPackage rec {
+  pname = "dm-env";
+  version = "1.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-Pv2ZsGUlY1mVB8QV1ItRiWyIvi8BwrYlCvi6tRVx41M=";
+  };
+
+  buildInputs = [
+    absl-py
+    dm-tree
+    numpy
+  ];
+
+  checkInputs = [
+    nose
+  ];
+
+  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..87de983330c2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dm-haiku/default.nix
@@ -0,0 +1,54 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, callPackage
+, lib
+, jmp
+, tabulate
+, jaxlib
+}:
+
+buildPythonPackage rec {
+  pname = "dm-haiku";
+  version = "0.0.7";
+
+  src = fetchFromGitHub {
+    owner = "deepmind";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-Qa3g3vOPZJt/wBjjuZHAcFUz/gwN/yvirV/8V9CnIko=";
+  };
+
+  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..93a4f3cd4795
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dm-haiku/tests.nix
@@ -0,0 +1,68 @@
+{ stdenv
+, buildPythonPackage
+, dm-haiku
+, chex
+, cloudpickle
+, dill
+, dm-tree
+, jaxlib
+, pytest-xdist
+, pytestCheckHook
+, tensorflow
+, bsuite
+, frozendict
+, dm-env
+, scikitimage
+, rlax
+, distrax
+, tensorflow-probability
+, optax }:
+
+buildPythonPackage rec {
+  pname = "dm-haiku-tests";
+  inherit (dm-haiku) version;
+
+  src = dm-haiku.testsout;
+
+  dontBuild = true;
+  dontInstall = true;
+
+  checkInputs = [
+    bsuite
+    chex
+    cloudpickle
+    dill
+    distrax
+    dm-env
+    dm-haiku
+    dm-tree
+    frozendict
+    jaxlib
+    pytest-xdist
+    pytestCheckHook
+    optax
+    rlax
+    scikitimage
+    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..f857eac8503b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dm-sonnet/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, numpy
+, tabulate
+, six
+, dm-tree
+, absl-py
+, wrapt
+, docutils
+, tensorflow
+, tensorflow-datasets }:
+
+buildPythonPackage rec {
+  pname = "dm-sonnet";
+  version = "2.0.0";
+
+  src = fetchFromGitHub {
+    owner = "deepmind";
+    repo = "sonnet";
+    rev = "v${version}";
+    sha256 = "sha256-YSMeH5ZTfP1OdLBepsxXAVczBG/ghSjCWjoz/I+TFl8=";
+  };
+
+  buildInputs = [
+    absl-py
+    dm-tree
+    numpy
+    six
+    tabulate
+    wrapt
+  ];
+
+  propagatedBuildInputs = [
+    tabulate
+    tensorflow
+  ];
+
+  checkInputs = [
+    docutils
+    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..e5698f457bc3
--- /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 8f9946c..b9d6e9b 100644
+--- a/tree/CMakeLists.txt
++++ b/tree/CMakeLists.txt
+@@ -50,70 +50,80 @@ if(APPLE)
+   set (CMAKE_FIND_FRAMEWORK LAST)
+ endif()
+ 
+-# Fetch pybind to be able to use pybind11_add_module symbol.
+-set(PYBIND_VER v2.6.2)
+-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.6.2)
++  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)
+ 
+-if (WIN32 OR MSVC)
+-    set(ABSEIL_LIB_PREF "absl")
+-    set(LIB_SUFF "lib")
++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()
++
++  # 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..04feb7de93f3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dm-tree/default.nix
@@ -0,0 +1,58 @@
+{ stdenv
+, abseil-cpp
+, absl-py
+, attrs
+, buildPythonPackage
+, cmake
+, fetchFromGitHub
+, lib
+, numpy
+, pybind11
+, wrapt
+}:
+
+buildPythonPackage rec {
+  pname = "dm-tree";
+  # As of 2021-12-29, the latest stable version still builds with Bazel.
+  version = "unstable-2021-12-20";
+
+  src = fetchFromGitHub {
+    owner = "deepmind";
+    repo = "tree";
+    rev = "b452e5c2743e7489b4ba7f16ecd51c516d7cd8e3";
+    sha256 = "1r187xwpvnnj98lyasngcv3lbxz0ziihpl5dbnjbfbjr0kh6z0j9";
+  };
+
+  patches = [
+    ./cmake.patch
+  ];
+
+  dontUseCmakeConfigure = true;
+
+  nativeBuildInputs = [
+    cmake
+    pybind11
+  ];
+
+  buildInputs = [
+    abseil-cpp
+    pybind11
+  ];
+
+  checkInputs = [
+    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..1c86e3bccf6b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dnachisel/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, biopython
+, docopt
+, flametree
+, numpy
+, proglog
+, pytestCheckHook
+, python-codon-tables
+, primer3
+, genome-collector
+, matplotlib
+}:
+
+buildPythonPackage rec {
+  pname = "dnachisel";
+  version = "3.2.9";
+
+  src = fetchFromGitHub {
+    owner = "Edinburgh-Genome-Foundry";
+    repo = "DnaChisel";
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-Fg0gkI+01xIt8LQmNmRzkzd4AObg/99x34y5NclMtDQ=";
+  };
+
+  propagatedBuildInputs = [
+    biopython
+    docopt
+    flametree
+    numpy
+    proglog
+    python-codon-tables
+  ];
+
+  checkInputs = [
+    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";
+    license = licenses.mit;
+    maintainers = with maintainers; [ prusnak ];
+  };
+}
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..16d1dd356861
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dnslib/default.nix
@@ -0,0 +1,20 @@
+{ lib, python, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "dnslib";
+  version = "0.9.20";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-ApCrXQj6vR74XvFD0cM/3NVJyy5Qd57BpCOZiw0LKUU=";
+  };
+
+  checkPhase = "VERSIONS=${python.interpreter} ./run_tests.sh";
+
+  meta = with lib; {
+    description = "Simple library to encode/decode DNS wire-format packets";
+    license = licenses.bsd2;
+    homepage = "https://bitbucket.org/paulc/dnslib/";
+    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..1dbbba48b104
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dnspython/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, setuptools-scm
+, pytestCheckHook
+, cacert
+}:
+
+buildPythonPackage rec {
+  pname = "dnspython";
+  version = "2.2.1";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "tar.gz";
+    sha256 = "0gk00m8zxjghxnzafhars51k5ahd6wfhf123nrc1j5gzlsj6jx8g";
+  };
+
+  checkInputs = [
+    pytestCheckHook
+  ] ++ lib.optional stdenv.isDarwin [
+    cacert
+  ];
+
+  disabledTests = [
+    # dns.exception.SyntaxError: protocol not found
+    "test_misc_good_WKS_text"
+    # fails if IPv6 isn't available
+    "test_resolver_override"
+
+  # Tests that run inconsistently on darwin systems
+  ] ++ lib.optionals stdenv.isDarwin [
+    # 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"
+  ];
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  pythonImportsCheck = [ "dns" ];
+
+  meta = with lib; {
+    description = "A DNS toolkit for Python";
+    homepage = "https://www.dnspython.org";
+    license = with licenses; [ isc ];
+    maintainers = with maintainers; [ gador ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dnspythonchia/default.nix b/nixpkgs/pkgs/development/python-modules/dnspythonchia/default.nix
new file mode 100644
index 000000000000..52243eac7d81
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dnspythonchia/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "dnspythonchia";
+  version = "2.2.0";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-iYaPYqOZ33R2DUXgIHxsewLi79iB5ja0WHOGkamffZk=";
+  };
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  # needs networking for some tests
+  doCheck = false;
+  pythonImportsCheck = [ "dns" ];
+
+  meta = with lib; {
+    description = "A DNS toolkit for Python (Chia Network fork)";
+    homepage = "https://www.chia.net/";
+    license = with licenses; [ isc ];
+    maintainers = teams.chia.members;
+  };
+}
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..97066662397b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/doc8/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, chardet
+, docutils
+, fetchPypi
+, pbr
+, pygments
+, pytestCheckHook
+, pythonOlder
+, restructuredtext_lint
+, setuptools-scm
+, stevedore
+}:
+
+buildPythonPackage rec {
+  pname = "doc8";
+  version = "0.11.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-w1ojH4jxXCBGWRVO09SZ+k1ALX5j1By6e1TPXmRhI6s=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  buildInputs = [
+    pbr
+  ];
+
+  propagatedBuildInputs = [
+    docutils
+    chardet
+    stevedore
+    restructuredtext_lint
+    pygments
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "doc8"
+  ];
+
+  meta = with lib; {
+    description = "Style checker for Sphinx (or other) RST documentation";
+    homepage = "https://github.com/pycqa/doc8";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
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..7c659c4173f7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/docformatter/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, untokenize
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "docformatter";
+  version = "1.4";
+
+  disabled = pythonOlder "3.6";
+
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "064e6d81f04ac96bc0d176cbaae953a0332482b22d3ad70d47c8a7f2732eef6f";
+  };
+
+  propagatedBuildInputs = [
+    untokenize
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "docformatter" ];
+
+  meta = {
+    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/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..f70fcebb26f3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/docker/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, backports_ssl_match_hostname
+, mock
+, paramiko
+, pytestCheckHook
+, requests
+, six
+, websocket-client
+}:
+
+buildPythonPackage rec {
+  pname = "docker";
+  version = "5.0.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d916a26b62970e7c2f554110ed6af04c7ccff8e9f81ad17d0d40c75637e227fb";
+  };
+
+  nativeBuildInputs = lib.optional isPy27 mock;
+
+  propagatedBuildInputs = [
+    paramiko
+    requests
+    six
+    websocket-client
+  ] ++ lib.optional isPy27 backports_ssl_match_hostname;
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  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;
+
+  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..55ff20803b26
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dockerfile-parse/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, six
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "dockerfile-parse";
+  version = "1.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-B+Ze7DE5eOh32oGYVYcLOuR/P6yUpAqWW57eEEhNrMU=";
+  };
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  checkInputs = [
+    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";
+    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..cae32e4a2b44
--- /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 = [ maintainers.costrouc ];
+  };
+}
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..60d14fa8e98f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/docopt-ng/default.nix
@@ -0,0 +1,24 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "docopt-ng";
+  version = "0.8.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-6mphooj8hk7uayLW/iiqIC1Z/Ib60F8W/145zE6n9uM=";
+  };
+
+  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..5f64ee3a6fe7
--- /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.23.222";
+
+  # No source available from official repo
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-c5XpfEGTkojgzk+ATHCSzzh04zeEVJEEKBp+lPfS+x4=";
+  };
+
+  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..3e5d9f21a2bb
--- /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";
+  };
+
+  checkInputs = [ 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; [ costrouc ];
+  };
+}
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..53a59f10ffac
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/docstring-parser/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "docstring-parser";
+  version = "0.14.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "rr-";
+    repo = "docstring_parser";
+    rev = "${version}";
+    hash = "sha256-NIijq+QR0panVCGDEQrTlkAvHfIexwS0PxFikglxd74=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "docstring_parser"
+  ];
+
+  meta = with lib; {
+    description = "Parse Python docstrings in various flavors";
+    homepage = "https://github.com/rr-/docstring_parser";
+    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..432f77220adc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/docstring-to-markdown/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "docstring-to-markdown";
+  version = "0.10";
+
+  src = fetchFromGitHub {
+    owner = "python-lsp";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0rflkbms94wkcypjcnz30bc4w4iww91h7sqq3j2b6ypzl4g48csa";
+  };
+
+  patches = [
+    # So pytest-flake8 and pytest-cov won't be needed
+    ./remove-coverage-tests.patch
+  ];
+
+  checkInputs = [
+    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";
+    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..930077939818
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/docutils/default.nix
@@ -0,0 +1,38 @@
+{ stdenv
+, lib
+, fetchPypi
+, buildPythonPackage
+, isPy3k
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "docutils";
+  version = "0.19";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-M5laZ1PDC39Xf+v8LFBBH+xqrH9//rfEz+WZEHLc+eY=";
+  };
+
+  # Only Darwin needs LANG, but we could set it in general.
+  # It's done here conditionally to prevent mass-rebuilds.
+  checkPhase = lib.optionalString (isPy3k && 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..b6a63d48b357
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/docx2python/default.nix
@@ -0,0 +1,30 @@
+{ lib, buildPythonPackage, fetchFromGitHub, pytestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "docx2python";
+  version = "unstable-2020-11-15";
+
+  # Pypi does not contain tests
+  src = fetchFromGitHub {
+    owner = "ShayHill";
+    repo = pname;
+    rev = "21b2edafc0a01a6cfb73aefc61747a65917e2cad";
+    sha256 = "1nwg17ziwm9a2x7yxsscj8zgc1d383ifsk5w7qa2fws6gf627kyi";
+  };
+
+  preCheck = "cd test"; # Tests require the `test/resources` folder to be accessible
+  checkInputs = [ pytestCheckHook ];
+  disabledTests = [ # asserts related to file deletions fail
+    "test_docx2python.py"
+    "test_docx_context.py"
+    "test_google_docs.py"
+  ];
+  pythonImportsCheck = [ "docx2python" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/ShayHill/docx2python";
+    description = "Extract docx headers, footers, (formatted) text, footnotes, endnotes, properties, and images";
+    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..ecd3cc6ce758
--- /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";
+  };
+
+  checkInputs = [
+    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..c367556b4ecb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dogpile-cache/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, pytestCheckHook
+, mock
+, Mako
+, decorator
+, stevedore
+}:
+
+buildPythonPackage rec {
+  pname = "dogpile-cache";
+  version = "1.1.8";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    pname = "dogpile.cache";
+    inherit version;
+    sha256 = "sha256-2ETou2OMxPVEpMiag039Nv6TVAC3GhbL10Tr37cg/U4=";
+  };
+
+  preCheck = ''
+    # Disable concurrency tests that often fail,
+    # probably some kind of timing issue.
+    rm tests/test_lock.py
+    # Failing tests. https://bitbucket.org/zzzeek/dogpile.cache/issues/116
+    rm tests/cache/test_memcached_backend.py
+  '';
+
+  dontUseSetuptoolsCheck = true;
+
+  checkInputs = [ pytestCheckHook mock Mako ];
+
+  propagatedBuildInputs = [ decorator stevedore ];
+
+  meta = with lib; {
+    description = "A caching front-end based on the Dogpile lock";
+    homepage = "https://bitbucket.org/zzzeek/dogpile.cache";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
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..fb513a20c654
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dogtail/default.nix
@@ -0,0 +1,62 @@
+{ 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 ];
+  strictDeps = false; # issue 56943
+
+  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.daemon}/share/dbus-1/session.conf \
+      ${python.interpreter} nix_run_setup test
+    runHook postCheck
+  '';
+
+  # 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; [ jtojnar ];
+  };
+}
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..33d128c3d765
--- /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;
+    sha256 = "sha256-DBl6/no04ZGRHHmN9gkEtBmAMgmyZWcfPCcFz0uxAv4=";
+  };
+
+  propagatedBuildInputs = [
+    configclass
+    doit
+    mergedict
+  ];
+
+  checkInputs = [
+    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..cfb36b7daf4a
--- /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;
+    sha256 = "sha256-cdB8zJUUyyL+WdmJmVd2ZeqrV+FvZE0EM2rgtLriNLw=";
+  };
+
+  propagatedBuildInputs = [
+    cloudpickle
+    importlib-metadata
+    toml
+  ] ++ lib.optional stdenv.isLinux pyinotify
+    ++ lib.optional stdenv.isDarwin macfsevents;
+
+  checkInputs = [
+    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/dominate/default.nix b/nixpkgs/pkgs/development/python-modules/dominate/default.nix
new file mode 100644
index 000000000000..aa840dc9ff51
--- /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.7.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-UgEBNgiS6/nQVT9n0341n/kkA9ih4zgUAwUDCIoF2kk=";
+  };
+
+  checkInputs = [
+    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..1290aaf05757
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/doorbirdpy/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "doorbirdpy";
+  version = "2.1.0";
+
+  src = fetchPypi {
+    pname = "DoorBirdPy";
+    inherit version;
+    sha256 = "ed0e94953cdf96111c7f73c5fcf358f65dc0ff5e47f63fc057bf18ca7512e606";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  # no tests on PyPI, no tags on GitLab
+  doCheck = false;
+
+  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..2154f33bb8ba
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dot2tex/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, python
+, buildPythonPackage
+, fetchPypi
+, substituteAll
+, pyparsing
+, graphviz
+, texlive
+}:
+
+buildPythonPackage rec {
+  pname = "dot2tex";
+  version = "2.11.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1kp77wiv7b5qib82i3y3sn9r49rym43aaqm5aw1bwnzfbbq2m6i9";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./path.patch;
+      inherit graphviz;
+    })
+    ./test.patch # https://github.com/kjellmf/dot2tex/issues/5
+  ];
+
+  propagatedBuildInputs = [ pyparsing ];
+
+  checkInputs = [
+    (texlive.combine {
+      inherit (texlive) scheme-small preview pstricks;
+    })
+  ];
+
+  checkPhase = ''
+    ${python.interpreter} tests/test_dot2tex.py
+  '';
+
+  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/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..5c4cfbf95240
--- /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=";
+  };
+
+  checkInputs = [
+    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..9a665ec0b5fa
--- /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;
+    sha256 = "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/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..179d02b150c9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dparse/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, toml
+, pyyaml
+, packaging
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "dparse";
+  version = "0.5.2";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-w0iZSh9ByF9mTY9aR0QmR7xOIsWvWxsm7ymv8Ppd3c0=";
+  };
+
+  propagatedBuildInputs = [
+    toml
+    pyyaml
+    packaging
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # requires unpackaged dependency pipenv
+    "test_update_pipfile"
+  ];
+
+  meta = with lib; {
+    description = "A parser for Python dependency files";
+    homepage = "https://github.com/pyupio/dparse";
+    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..d3b61574cf8a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dparse2/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, toml
+, pyyaml
+, packaging
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "dparse2";
+  version = "0.6.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "nexB";
+    repo = pname;
+    rev = version;
+    hash = "sha256-1tbNW7Gy7gvMnETdAM2ahHiwbhG9qvdYZggia1+7eGo=";
+  };
+
+  propagatedBuildInputs = [
+    toml
+    pyyaml
+    packaging
+  ];
+
+  checkInputs = [
+    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";
+    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..b6f0176dd737
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dpath/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, hypothesis
+, isPy27
+, mock
+, nose
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "dpath";
+  version = "2.0.6";
+
+  disabled = isPy27; # uses python3 imports
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-Wh3a5SIz+8jvgbFfuFBzqBEmu0NpjT86G2qvVhpGzcA=";
+  };
+
+  # use pytest as nosetests hangs
+  checkInputs = [
+    hypothesis
+    mock
+    nose
+    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";
+    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..a1036e099ea8
--- /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.7.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "80f977667ebbad2b5c4f7b7f45ee8bea6622fb71723f68a9a8fe6274520c853b";
+  };
+
+  # 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/dragonfly/default.nix b/nixpkgs/pkgs/development/python-modules/dragonfly/default.nix
new file mode 100644
index 000000000000..74740aeffb7e
--- /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;
+    sha256 = "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/dremel3dpy/default.nix b/nixpkgs/pkgs/development/python-modules/dremel3dpy/default.nix
new file mode 100644
index 000000000000..170b96fcc494
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dremel3dpy/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, async-timeout
+, buildPythonPackage
+, 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
+    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..1b2292b46b7a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/drf-jwt/default.nix
@@ -0,0 +1,44 @@
+{ 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
+  ];
+
+  # 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..db0212e45697
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/drf-nested-routers/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, django
+, djangorestframework
+, pytest
+, pytest-cov
+, pytest-django
+, ipdb
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "drf-nested-routers";
+  version = "0.93.3";
+
+  src = fetchFromGitHub {
+    owner = "alanjds";
+    repo = "drf-nested-routers";
+    rev = "v${version}";
+    sha256 = "1gmw6gwiqzfysx8qn7aan7xgkizxy64db94z30pm3bvn6jxv08si";
+  };
+
+  propagatedBuildInputs = [ django djangorestframework setuptools ];
+  checkInputs = [ pytest pytest-cov pytest-django ipdb ];
+
+  checkPhase = ''
+    ${python.interpreter} runtests.py --nolint
+  '';
+
+  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..e2413df85d42
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/drf-spectacular-sidecar/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, django
+}:
+
+buildPythonPackage rec {
+  pname = "drf-spectacular-sidecar";
+  version = "2022.6.1";
+
+  src = fetchFromGitHub {
+    owner = "tfranzel";
+    repo = "drf-spectacular-sidecar";
+    rev = version;
+    sha256 = "sha256-SKMAA8tcvWUF7EARq9vN8C0DWcQFRX5j/tfgHF5TUWs=";
+  };
+
+  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; [ SuperSandro2000 ];
+  };
+}
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..8e41d24c9e1b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/drf-spectacular/default.nix
@@ -0,0 +1,77 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, 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.22.1";
+
+  src = fetchFromGitHub {
+    owner = "tfranzel";
+    repo = "drf-spectacular";
+    rev = version;
+    sha256 = "sha256-SgzyIzgFBXsNHfY2OfCq0LhJyi/ZCOSA8QveKNduIBc=";
+  };
+
+  propagatedBuildInputs = [
+    django
+    djangorestframework
+    inflection
+    jsonschema
+    pyyaml
+    uritemplate
+  ];
+
+  checkInputs = [
+    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
+  ];
+
+  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";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..9606bbcf0726
--- /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.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-su67Q4+mQVA6CNrHkb4kGD6ibbz+NxqYJOqR9uOpiKo=";
+  };
+
+  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
+  ];
+
+  checkInputs = [
+    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..526e58d14340
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/drivelib/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonApplication
+, fetchPypi
+, expiringdict
+, google-auth-httplib2
+, google-auth-oauthlib
+, google-api-python-client
+}:
+
+buildPythonApplication 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..a081a7445c4a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/drms/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, numpy
+, pandas
+, six
+, astropy
+, pytestCheckHook
+, pytest-doctestplus
+, pythonOlder
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "drms";
+  version = "0.6.2";
+  format = "pyproject";
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-Id8rPK8qq71gHn5DKnEi7Lp081GFbcFtGU+v89Vlt9o=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    pandas
+    six
+  ];
+
+  checkInputs = [
+    astropy
+    pytestCheckHook
+    pytest-doctestplus
+  ];
+
+  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; [ costrouc ];
+  };
+}
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..6240567e883a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dropbox/default.nix
@@ -0,0 +1,83 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, requests
+, setuptools
+, six
+, stone
+, mock
+, pytest-mock
+, pytestCheckHook
+, sphinxHook
+}:
+
+buildPythonPackage rec {
+  pname = "dropbox";
+  version = "11.33.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+  outputs = ["out" "doc"];
+
+  src = fetchFromGitHub {
+    owner = "dropbox";
+    repo = "dropbox-sdk-python";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-re1TYujoLWjvDE0/ikTMQmXufdS1Q5IMViiFY2/QRMw=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    setuptools
+    six
+    stone
+  ];
+
+  checkInputs = [
+    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";
+    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..00d10e749496
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ds-store/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, mac_alias
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "ds_store";
+  version = "1.3.0";
+
+  src = fetchFromGitHub {
+    owner = "al45tair";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1zmhnz110dvisydp5h6s0ry2v9qf4rgr60xhhlak0c66zpvlkkl0";
+  };
+
+  propagatedBuildInputs = [ mac_alias ];
+
+  checkInputs = [ 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..53d5e5acc9ff
--- /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
+  ];
+
+  checkInputs = [
+    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..c91677710817
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dsmr-parser/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pyserial
+, pyserial-asyncio
+, pytestCheckHook
+, pythonOlder
+, pytz
+, tailer
+}:
+
+buildPythonPackage rec {
+  pname = "dsmr-parser";
+  version = "0.33";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "ndokter";
+    repo = "dsmr_parser";
+    rev = "v${version}";
+    sha256 = "sha256-Phx8Yqx6beTzkQv0fU8Pfs2btPgKVARdO+nMcne1S+w=";
+  };
+
+  propagatedBuildInputs = [
+    pyserial
+    pyserial-asyncio
+    pytz
+    tailer
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "dsmr_parser"
+  ];
+
+  meta = with lib; {
+    description = "Python module to parse Dutch Smart Meter Requirements (DSMR)";
+    homepage = "https://github.com/ndokter/dsmr_parser";
+    license = with licenses; [ mit ];
+    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..28eae55ef9a6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dtlssocket/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, autoconf
+, cython
+}:
+
+buildPythonPackage rec {
+  pname = "dtlssocket";
+  version = "0.1.12";
+
+  src = fetchPypi {
+    pname = "DTLSSocket";
+    inherit version;
+    sha256 = "909a8f52f1890ec9e92fd46ef609daa8875c2a1c262c0b61200e73c6c2dd5099";
+  };
+
+  nativeBuildInputs = [
+    autoconf
+    cython
+  ];
+
+  # 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/ducc0/default.nix b/nixpkgs/pkgs/development/python-modules/ducc0/default.nix
new file mode 100644
index 000000000000..218af92608d4
--- /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.24.0";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitLab {
+    domain = "gitlab.mpcdf.mpg.de";
+    owner = "mtr";
+    repo = "ducc";
+    rev = "ducc0_${lib.replaceStrings ["."] ["_"] version}";
+    sha256 = "sFgEO6f9D3AFV62yLEocgrPrj03H60e2NtdA/Ws6lQw=";
+  };
+
+  buildInputs = [ pybind11 ];
+  propagatedBuildInputs = [ numpy ];
+
+  checkInputs = [ 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..234f014a7af1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/duckdb-engine/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, duckdb
+, hypothesis
+, ipython-sql
+, poetry-core
+, sqlalchemy
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "duckdb-engine";
+  version = "0.2.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    repo = "duckdb_engine";
+    owner = "Mause";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-UoTGFsno92iejBGvCsJ/jnhKJ41K9eTGwC7DomAp7IE=";
+  };
+
+  nativeBuildInputs = [ poetry-core ];
+
+  propagatedBuildInputs = [ duckdb sqlalchemy ];
+
+  checkInputs = [ pytestCheckHook hypothesis ipython-sql typing-extensions ];
+
+  pythonImportsCheck = [ "duckdb_engine" ];
+
+  meta = with lib; {
+    description = "Very very very basic sqlalchemy driver for duckdb";
+    homepage = "https://github.com/Mause/duckdb_engine";
+    license = licenses.mit;
+    maintainers = with maintainers; [ cpcloud ];
+  };
+}
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..d7878bd6a44d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/duckdb/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchpatch
+, duckdb
+, google-cloud-storage
+, mypy
+, numpy
+, pandas
+, psutil
+, pybind11
+, setuptools-scm
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "duckdb";
+  inherit (duckdb) version src patches;
+  format = "setuptools";
+
+  preConfigure = ''
+    cd tools/pythonpkg
+  '';
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    pybind11
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    pandas
+  ];
+
+  checkInputs = [
+    google-cloud-storage
+    mypy
+    psutil
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "duckdb"
+  ];
+
+  meta = with lib; {
+    description = "Python binding for DuckDB";
+    homepage = "https://duckdb.org/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ costrouc cpcloud ];
+  };
+}
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..249f71c67dca
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/duecredit/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, contextlib2
+, pytest
+, pytestCheckHook
+, vcrpy
+, citeproc-py
+, requests
+, setuptools
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "duecredit";
+  version = "0.9.1";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f6192ce9315b35f6a67174761291e61d0831e496e8ff4acbc061731e7604faf8";
+  };
+
+  # bin/duecredit requires setuptools at runtime
+  propagatedBuildInputs = [ citeproc-py requests setuptools six ];
+
+  checkInputs = [ contextlib2 pytest pytestCheckHook vcrpy ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  pythonImportsCheck = [ "duecredit" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/duecredit/duecredit";
+    description = "Simple framework to embed references in code";
+    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..ce95291b9e95
--- /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}";
+    sha256 = "sha256-9CTAupAxZI1twoLpgr7VfECw70QunE6pk+SskiT3JDw=";
+  };
+
+  propagatedBuildInputs = [ typing-extensions ];
+
+  checkInputs = [ 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..92081e08067c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dufte/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, importlib-metadata
+, matplotlib
+, numpy
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "dufte";
+  version = "0.2.29";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "nschloe";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256:0ccsmpj160xj6w503a948aw8icj55mw9414xnmijmmjvlwhm0p48";
+  };
+  format = "pyproject";
+
+  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
+  '';
+
+  checkInputs = [
+    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..190411b5333c
--- /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";
+  };
+
+  checkInputs = [
+    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..d95fef43fad0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dulwich/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, certifi
+, fastimport
+, fetchPypi
+, gevent
+, geventhttpclient
+, git
+, glibcLocales
+, gpgme
+, mock
+, pkgs
+, urllib3
+, paramiko
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  version = "0.20.45";
+  pname = "dulwich";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-cHEN2coqRCGQx+UGiS2wdMMYrHYuIh91KbjONIAgQbc=";
+  };
+
+  LC_ALL = "en_US.UTF-8";
+
+  propagatedBuildInputs = [
+    certifi
+    urllib3
+  ];
+
+  checkInputs = [
+    fastimport
+    gevent
+    geventhttpclient
+    git
+    glibcLocales
+    gpgme
+    pkgs.gnupg
+    mock
+    paramiko
+  ];
+
+  doCheck = !stdenv.isDarwin;
+
+  pythonImportsCheck = [
+    "dulwich"
+  ];
+
+  meta = with lib; {
+    description = "Simple Python 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..7627c0505ac2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dunamai/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, poetry-core
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, importlib-metadata
+, packaging
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "dunamai";
+  version = "1.12.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "mtkennerly";
+    repo = "dunamai";
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-SyHml8TIcqU7KQE4IuTZbp+Jktao7ReJHQyHV8wKeWg=";
+  };
+
+  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
+  '';
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "dunamai" ];
+
+  meta = with lib; {
+    description = "Dynamic version generation";
+    homepage = "https://github.com/mtkennerly/dunamai";
+    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..f87bbf82b77b
--- /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;
+    sha256 = "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..057881ccab1d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/duo-client/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, mock
+, nose2
+, pytz
+, setuptools
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "duo-client";
+  version = "4.4.0";
+
+  src = fetchFromGitHub {
+    owner = "duosecurity";
+    repo = "duo_client_python";
+    rev = version;
+    sha256 = "sha256-2sodExb66+Y+aPvm+DkibPt0Bvwqjii+EoBWaopdq+E=";
+  };
+
+  postPatch = ''
+    substituteInPlace requirements-dev.txt \
+      --replace "dlint" "" \
+      --replace "flake8" ""
+  '';
+
+  propagatedBuildInputs = [
+    setuptools
+    six
+  ];
+
+  checkInputs = [
+    mock
+    nose2
+    pytz
+  ];
+
+  pythonImportsCheck = [ "duo_client" ];
+
+  meta = with lib; {
+    description = "Python library for interacting with the Duo Auth, Admin, and Accounts APIs";
+    homepage = "https://github.com/duosecurity/duo_client_python";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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-data/default.nix b/nixpkgs/pkgs/development/python-modules/dvc-data/default.nix
new file mode 100644
index 000000000000..f5fc366c5f58
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dvc-data/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, buildPythonPackage
+, dictdiffer
+, diskcache
+, dvc-objects
+, fetchFromGitHub
+, funcy
+, nanotime
+, pygtrie
+, pythonOlder
+, shortuuid
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "dvc-data";
+  version = "0.1.13";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "iterative";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-dKqn7dMwPxKnLLBPJGgmD/2MFzdzrw7W9+w9Zi/9hsA=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    dictdiffer
+    diskcache
+    dvc-objects
+    funcy
+    nanotime
+    pygtrie
+    shortuuid
+  ];
+
+  # Tests depend on upath which is unmaintained and only available as wheel
+  doCheck = false;
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "dvc-objects==" "dvc-objects>="
+  '';
+
+  pythonImportsCheck = [
+    "dvc_data"
+  ];
+
+  meta = with lib; {
+    description = "DVC's data management subsystem";
+    homepage = "https://github.com/iterative/dvc-data";
+    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..7e6a37a12d90
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dvc-objects/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, flatten-dict
+, fsspec
+, funcy
+, pygtrie
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+, setuptools-scm
+, shortuuid
+, tqdm
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "dvc-objects";
+  version = "0.1.7";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "iterative";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-Edp2MRhe/eTUosL4XQfVbtwFWBg3D5RDWRb6r1C4MgE=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    flatten-dict
+    fsspec
+    funcy
+    pygtrie
+    shortuuid
+    tqdm
+    typing-extensions
+  ];
+
+  checkInputs = [
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "dvc_objects"
+  ];
+
+  meta = with lib; {
+    description = "Library for DVC objects";
+    homepage = "https://github.com/iterative/dvc-objects";
+    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..b6da5663f41a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dvc-render/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, funcy
+, matplotlib
+, tabulate
+, pytestCheckHook
+, pytest-mock
+, pytest-test-utils
+, pythonOlder
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "dvc-render";
+  version = "0.0.9";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "iterative";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-ZUIyNg+PTj5CWC65RqB1whnB+pUp1yNJQj43iSBcyvU=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  passthru.optional-dependencies = {
+    table = [
+      tabulate
+    ];
+    markdown = [
+      tabulate
+      matplotlib
+    ];
+  };
+
+  checkInputs = [
+    funcy
+    pytestCheckHook
+    pytest-mock
+    pytest-test-utils
+  ]
+  ++ passthru.optional-dependencies.table
+  ++ passthru.optional-dependencies.markdown;
+
+  pythonImportsCheck = [
+    "dvc_render"
+  ];
+
+  meta = with lib; {
+    description = "Library for rendering DVC plots";
+    homepage = "https://github.com/iterative/dvc-render";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab anthonyroussel ];
+  };
+}
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..b71cf3175e2b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dvc-task/default.nix
@@ -0,0 +1,60 @@
+{ 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.1.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "iterative";
+    repo = pname;
+    rev = version;
+    hash = "sha256-LXjfFuLifgzU+3/EevycVCR7LhYBOoN6xg4YeNo5R4M=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    kombu
+    shortuuid
+    celery
+    funcy
+  ];
+
+  checkInputs = [
+    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";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ anthonyroussel ];
+  };
+}
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..23755f10652b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dvclive/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, dvc-render
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, tabulate
+}:
+
+buildPythonPackage rec {
+  pname = "dvclive";
+  version = "0.10.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "iterative";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-4sixsWZNnI3UJRlFyB21eAdUCgF8iIZ56ECgIeFV/u8=";
+  };
+
+  propagatedBuildInputs = [
+    dvc-render
+    tabulate # will be available as dvc-render.optional-dependencies.table
+  ];
+
+  # 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";
+    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..b6bb2927cc0c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dwdwfsapi/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, requests
+, ciso8601
+}:
+
+buildPythonPackage rec {
+  pname = "dwdwfsapi";
+  version = "1.0.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "8541eb93a6323bec6a2281aa06667e72b02c8e5fac40f899c402089b1c774472";
+  };
+
+  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";
+    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..8db7f6c9169d
--- /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.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "e112149d48b4500c18b3cfb6e0e6e780bb5aa0e56ff87cac412280200b9ec8bf";
+  };
+
+  buildInputs = [ glibcLocales ];
+
+  checkInputs = [
+    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..456e0a6a628d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dynalite-devices/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, asynctest
+, pytest-asyncio
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "dynalite-devices";
+  version = "0.47";
+
+  src = fetchFromGitHub {
+    owner = "ziv1234";
+    repo = "python-dynalite-devices";
+    rev = "refs/tags/v${version}"; # https://github.com/ziv1234/python-dynalite-devices/issues/2
+    hash = "sha256-kJo4e5vhgWzijLUhQd9VBVk1URpg9SXhOA60dJYashM=";
+  };
+
+  postPatch = ''
+    sed -i '/^addopts/d' setup.cfg
+  '';
+
+  checkInputs = [
+    asynctest
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "--asyncio-mode=legacy"
+  ];
+
+  pythonImportsCheck = [ "dynalite_devices_lib" ];
+
+  meta = with lib; {
+    description = "An unofficial Dynalite DyNET interface creating devices";
+    homepage = "https://github.com/ziv1234/python-dynalite-devices";
+    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..9323255cc27c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dynd/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, isPyPy
+, isPy3k
+, cython
+, numpy
+, pkgs
+}:
+
+buildPythonPackage rec {
+  version = "0.7.2";
+  pname = "dynd";
+  disabled = isPyPy || !isPy3k; # tests fail on python2, 2018-04-11
+
+  src = pkgs.fetchFromGitHub {
+    owner = "libdynd";
+    repo = "dynd-python";
+    rev = "v${version}";
+    sha256 = "19igd6ibf9araqhq9bxmzbzdz05vp089zxvddkiik3b5gb7l17nh";
+  };
+
+  # 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;
+
+  # Python 3 works but has a broken import test that I couldn't
+  # figure out.
+  doCheck = !isPy3k;
+  nativeBuildInputs = [ pkgs.cmake ];
+  buildInputs = [ pkgs.libdynd.dev cython ];
+  propagatedBuildInputs = [ numpy pkgs.libdynd ];
+
+  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/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..896b50416db1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/easy-thumbnails/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, django
+, fetchPypi
+, pillow
+, pytestCheckHook
+, pythonOlder
+, reportlab
+, svglib
+}:
+
+buildPythonPackage rec {
+  pname = "easy-thumbnails";
+  version = "2.8.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-ij7GG7jHL6x/degRqW4815QqyJyrVasWVJ1tLOnN6qU=";
+  };
+
+  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";
+    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..e1898d3fc9e4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/easydict/default.nix
@@ -0,0 +1,19 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "easydict";
+  version = "1.9";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3f3f0dab07c299f0f4df032db1f388d985bb57fa4c5be30acd25c5f9a516883b";
+  };
+
+  docheck = false; # No tests in archive
+
+  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/easygui/default.nix b/nixpkgs/pkgs/development/python-modules/easygui/default.nix
new file mode 100644
index 000000000000..7749c246e146
--- /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;
+    sha256 = "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; [ jfrankenau ];
+  };
+}
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..97707e0e9fd4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/easyprocess/default.nix
@@ -0,0 +1,21 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "EasyProcess";
+  version = "1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "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/easysnmp/default.nix b/nixpkgs/pkgs/development/python-modules/easysnmp/default.nix
new file mode 100644
index 000000000000..c55bf52a6643
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/easysnmp/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, pythonAtLeast
+, fetchFromGitHub
+, net-snmp
+, openssl
+, pytest
+, pytest-cov
+, pytest-flake8
+, pytest-sugar
+, termcolor
+}:
+
+buildPythonPackage rec {
+  pname = "easysnmp";
+  version = "0.2.5";
+
+  # See https://github.com/kamakazikamikaze/easysnmp/issues/108
+  disabled = pythonAtLeast "3.7";
+
+  src = fetchFromGitHub {
+    owner = "kamakazikamikaze";
+    repo = pname;
+    rev = version;
+    sha256 = "1si9iyxqj6z22jzn6m93lwpinsqn20lix2py3jm3g3fmwawkd735";
+  };
+
+  checkInputs = [
+    pytest
+    pytest-cov
+    pytest-flake8
+    pytest-sugar
+    termcolor
+  ];
+
+  buildInputs = [
+    net-snmp
+    openssl
+  ];
+
+  buildPhase = ''
+    python setup.py build bdist_wheel --basedir=${lib.getBin net-snmp}/bin
+  '';
+
+  # Unable to get tests to pass, even running by hand. The pytest tests have
+  # become stale.
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A blazingly fast and Pythonic SNMP library based on the official Net-SNMP bindings";
+    homepage = "https://easysnmp.readthedocs.io/en/latest/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ WhittlesJr ];
+  };
+}
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..8c80ccd4c362
--- /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;
+    sha256 = "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/ecdsa/default.nix b/nixpkgs/pkgs/development/python-modules/ecdsa/default.nix
new file mode 100644
index 000000000000..ce3d5bd4ce66
--- /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;
+    sha256 = "sha256-GQNIBBVZ4hsiodZc7khSgsoRpvgdUD/duE1QF+ntHkk=";
+  };
+
+  propagatedBuildInputs = [ six ];
+  # Only needed for tests
+  checkInputs = [ 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/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..da1f9fa51069
--- /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.10";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "embotech";
+    repo = "ecos-python";
+    rev = "v${version}";
+    sha256 = "sha256-TPxrTyVZ1KXgPoDbZZqXT5+NEIEndg9qepujqFQwK+Q=";
+    fetchSubmodules = true;
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    scipy
+  ];
+
+  checkInputs = [
+    nose
+  ];
+
+  checkPhase = ''
+    cd ./src
+    nosetests test_interface.py test_interface_bb.py
+  '';
+
+  pythonImportsCheck = [
+    "ecos"
+  ];
+
+  meta = with lib; {
+    description = "Python package for ECOS: Embedded Cone Solver";
+    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..01298469f8dd
--- /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.0.0";
+  format = "flit";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "elastic";
+    repo = "ecs-logging-python";
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-2BfZ96D24sfjFD6l+gjp6xXbSJ0kjQD/FhHLI3bpVGM=";
+  };
+
+  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/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/editables/default.nix b/nixpkgs/pkgs/development/python-modules/editables/default.nix
new file mode 100644
index 000000000000..e5deb02af52f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/editables/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "editables";
+  version = "0.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-FnUk43c1jtHxN05hwmjw16S/fb0EbGVve0EM3hYWGxo=";
+  };
+
+  checkInputs = [
+    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..548da09b993d
--- /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 ];
+
+  checkInputs = [ 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..41b20ca8969f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/editdistance/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, cython
+}:
+
+buildPythonPackage rec {
+  pname = "editdistance";
+  version = "0.6.0";
+
+
+  src = fetchFromGitHub {
+    owner = "roy-ht";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "17xkndwdyf14nfxk25z1qnhkzm0yxw65fpj78c01haq241zfzjr5";
+  };
+
+  nativeBuildInputs = [ cython ];
+
+  preBuild = ''
+    cythonize --inplace editdistance/bycython.pyx
+  '';
+
+  checkInputs = [ 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..e90a6efdc63e
--- /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";
+    sha256 = "sha256-9WSEkMJOewPqJjB6f7J6Ir0L+U712hkaN+GszjnGw7c=";
+  };
+in
+buildPythonPackage rec {
+  pname = "editorconfig";
+  version = "0.12.3";
+
+  src = fetchFromGitHub {
+    owner = "editorconfig";
+    repo = "editorconfig-core-py";
+    rev = "v${version}";
+    sha256 = "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
+  '';
+
+  checkInputs = [
+    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; [ SuperSandro2000 ];
+  };
+}
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/effect/default.nix b/nixpkgs/pkgs/development/python-modules/effect/default.nix
new file mode 100644
index 000000000000..67537dd1f48b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/effect/default.nix
@@ -0,0 +1,40 @@
+{ buildPythonPackage
+, fetchPypi
+, lib
+, isPy3k
+, six
+, attrs
+, pytest
+, testtools
+}:
+
+buildPythonPackage rec {
+  version = "1.1.0";
+  pname = "effect";
+  disabled = (!isPy3k);
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "7affb603707c648b07b11781ebb793a4b9aee8acf1ac5764c3ed2112adf0c9ea";
+  };
+
+  checkInputs = [
+    pytest
+    testtools
+  ];
+
+  propagatedBuildInputs = [
+    six
+    attrs
+  ];
+
+  checkPhase = ''
+    pytest
+  '';
+
+  meta = with lib; {
+    description = "Pure effects for Python";
+    homepage = "https://github.com/python-effect/effect";
+    license = licenses.mit;
+  };
+}
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/einops/default.nix b/nixpkgs/pkgs/development/python-modules/einops/default.nix
new file mode 100644
index 000000000000..44b380e10328
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/einops/default.nix
@@ -0,0 +1,74 @@
+{ lib
+, buildPythonPackage
+, chainer
+, fetchFromGitHub
+, jupyter
+, keras
+  #, mxnet
+, nbconvert
+, nbformat
+, nose
+, numpy
+, parameterized
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "einops";
+  version = "0.4.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "arogozhnikov";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-n4R4lcRimuOncisCTs2zJWPlqZ+W2yPkvkWAnx4R91s=";
+  };
+
+  checkInputs = [
+    chainer
+    jupyter
+    keras
+    # mxnet (has issues with some CPUs, segfault)
+    nbconvert
+    nbformat
+    nose
+    numpy
+    parameterized
+    pytestCheckHook
+  ];
+
+  # No CUDA in sandbox
+  EINOPS_SKIP_CUPY = 1;
+
+  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..8bea9552b35b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/eiswarnung/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, aiohttp
+, aresponses
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, yarl
+}:
+
+buildPythonPackage rec {
+  pname = "eiswarnung";
+  version = "1.1.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "klaasnicolaas";
+    repo = "python-eiswarnung";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-fyxqVSZcbo/rrItad5ZTwmp4N8s0HGBdxvx3LBax/hc=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    yarl
+  ];
+
+  checkInputs = [
+    aresponses
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace '"0.0.0"' '"${version}"' \
+      --replace 'addopts = "--cov"' ""
+  '';
+
+  pythonImportsCheck = [
+    "eiswarnung"
+  ];
+
+  meta = with lib; {
+    description = "Module for getting Eiswarning API forecasts";
+    homepage = "https://github.com/klaasnicolaas/python-eiswarnung";
+    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..6ef09febb6ef
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/elastic-apm/default.nix
@@ -0,0 +1,90 @@
+{ lib
+, asynctest
+, aiohttp
+, blinker
+, buildPythonPackage
+, certifi
+, ecs-logging
+, fetchFromGitHub
+, httpx
+, jinja2
+, jsonschema
+, Logbook
+, mock
+, pytest-asyncio
+, pytest-bdd
+, pytest-localserver
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+, sanic
+, sanic-testing
+, starlette
+, structlog
+, tornado
+, urllib3
+, webob
+}:
+
+buildPythonPackage rec {
+  pname = "elastic-apm";
+  version = "6.11.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "elastic";
+    repo = "apm-agent-python";
+    rev = "v${version}";
+    hash = "sha256-ZmvOyEkXp0PEDHWcuGT91mhXwV2E6SPlrWBY/sNiRmc=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    blinker
+    certifi
+    sanic
+    starlette
+    tornado
+    urllib3
+  ];
+
+  checkInputs = [
+    asynctest
+    ecs-logging
+    jinja2
+    jsonschema
+    Logbook
+    mock
+    httpx
+    pytest-asyncio
+    pytest-bdd
+    pytest-mock
+    pytest-localserver
+    sanic-testing
+    pytestCheckHook
+    structlog
+    webob
+  ];
+
+  disabledTests = [
+    "elasticapm_client"
+  ];
+
+  disabledTestPaths = [
+    # Exclude tornado tests
+    "tests/contrib/asyncio/tornado/tornado_tests.py"
+  ];
+
+  pythonImportsCheck = [
+    "elasticapm"
+  ];
+
+  meta = with lib; {
+    description = "Python agent for the Elastic APM";
+    homepage = "https://github.com/elastic/apm-agent-python";
+    license = with licenses; [ bsd3 ];
+    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..2fe746ea7f38
--- /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 = "7.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c4a7b93882918a413b63bed54018a1685d7410ffd8facbc860ee7fd57f214a6d";
+  };
+
+  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..73a3882927c2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/elasticsearch/default.nix
@@ -0,0 +1,34 @@
+{ buildPythonPackage
+, fetchPypi
+, urllib3, requests
+, nosexcover, mock
+, lib
+}:
+
+buildPythonPackage (rec {
+  pname = "elasticsearch";
+  # In 7.14.0, the package was intentionally made incompatible with
+  # the OSS version of elasticsearch - don't update past 7.13.x until
+  # there's a clear path forward. See
+  # https://github.com/elastic/elasticsearch-py/issues/1639 for more
+  # info.
+  version = "7.16.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "8adf8bc351ed55df7296be1009d38a1c999c0abc7d8700fa88533f1ad6087c5e";
+  };
+
+  # 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";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ desiderius ];
+  };
+})
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..a4d17a830e4d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/elegy/default.nix
@@ -0,0 +1,86 @@
+{ buildPythonPackage
+, cloudpickle
+, deepdish
+, deepmerge
+, dm-haiku
+, fetchFromGitHub
+, jaxlib
+, lib
+, poetry
+, pytestCheckHook
+, pytorch
+, pyyaml
+, sh
+, tables
+, tabulate
+, tensorboardx
+, tensorflow
+, toolz
+, treex
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "elegy";
+  version = "0.8.6";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "poets-ai";
+    repo = pname;
+    rev = version;
+    hash = "sha256-FZmLriYhsX+zyQKCtCjbOy6MH+AvjzHRNUyaDSXGlLI=";
+  };
+
+  # The cloudpickle constraint is too strict. wandb is marked as an optional
+  # dependency but `buildPythonPackage` doesn't seem to respect that setting.
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'cloudpickle = "^1.5.0"' 'cloudpickle = "*"' \
+      --replace 'wandb = { version = "^0.12.10", optional = true }' ""
+  '';
+
+  nativeBuildInputs = [
+    poetry
+  ];
+
+  buildInputs = [ jaxlib ];
+
+  propagatedBuildInputs = [
+    cloudpickle
+    deepdish
+    deepmerge
+    dm-haiku
+    pyyaml
+    tables
+    tabulate
+    tensorboardx
+    toolz
+    treex
+    typing-extensions
+  ];
+
+  pythonImportsCheck = [
+    "elegy"
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    pytorch
+    sh
+    tensorflow
+  ];
+
+  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"
+  ];
+
+  meta = with lib; {
+    description = "Neural Networks framework based on Jax inspired by Keras and Haiku";
+    homepage = "https://github.com/poets-ai/elegy";
+    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..95c201afc4cd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/elementpath/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "elementpath";
+  version = "2.5.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "sissaschool";
+    repo = "elementpath";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-+NCsWPt5yMXe+GR9nEBU7byYhKrH/6xghQioj9AOGm4=";
+  };
+
+  # 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";
+    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..2a6c10da35e7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/elgato/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, aiohttp
+, aresponses
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pydantic
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, yarl
+}:
+
+buildPythonPackage rec {
+  pname = "elgato";
+  version = "3.0.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "frenck";
+    repo = "python-elgato";
+    rev = "v${version}";
+    sha256 = "sha256-lGHRwDxxgi1QJvK3WrvwghoAZk5J1mdwD4+Is0n7Jgs=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    pydantic
+    yarl
+  ];
+
+  checkInputs = [
+    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 = [
+    "elgato"
+  ];
+
+  meta = with lib; {
+    description = "Python client for Elgato Key Lights";
+    homepage = "https://github.com/frenck/python-elgato";
+    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..b8f75776217a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/eliot/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, aiocontextvars
+, boltons
+, hypothesis
+, pyrsistent
+, pytest
+, setuptools
+, six
+, testtools
+, zope_interface
+}:
+
+buildPythonPackage rec {
+  pname = "eliot";
+  version = "1.14.0";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c2f099a3e8d5ecfc22745766e7cc664a48db64b6b89d986dff270491d8683149";
+  };
+
+  checkInputs = [
+    hypothesis
+    testtools
+    pytest
+   ];
+
+  propagatedBuildInputs = [
+    aiocontextvars
+    boltons
+    pyrsistent
+    setuptools
+    six
+    zope_interface
+  ];
+
+  pythonImportsCheck = [ "eliot" ];
+
+  # Tests run eliot-prettyprint in out/bin.
+  # test_parse_stream is broken, skip it.
+  checkPhase = ''
+    export PATH=$out/bin:$PATH
+    pytest -k 'not test_parse_stream'
+  '';
+
+  meta = with lib; {
+    homepage = "https://eliot.readthedocs.io";
+    description = "Logging library that tells you why it happened";
+    license = licenses.asl20;
+    maintainers = [ 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..737f4a5a0b43
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/elkm1-lib/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, poetry-core
+, pyserial-asyncio
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "elkm1-lib";
+  version = "2.1.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "gwww";
+    repo = "elkm1";
+    rev = version;
+    hash = "sha256-uc+hU4RyF6IXUbdpZHozbF6vO2NE2hrfgxAnmmB27lw=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    pyserial-asyncio
+  ];
+
+  checkInputs = [
+    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";
+    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..34d848d9a195
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/elmax-api/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, httpx
+, pyjwt
+, pythonOlder
+, yarl
+}:
+
+buildPythonPackage rec {
+  pname = "elmax-api";
+  version = "0.0.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "albertogeniola";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-YUnLi8+ibUgWoMFMgZPSPbpr286bnWBefxjOV7JfCuY=";
+  };
+
+  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";
+    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..77bbd480e9ba
--- /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;
+    sha256 = "sha256-EcYEpYv+EwwEfW8Sy7aQjFAPpmsA6qVbmlwrPdxdnEw=";
+  };
+
+  nativeBuildInputs = [ poetry-core ];
+
+  propagatedBuildInputs = [
+    httpx
+    yarl
+  ];
+
+  checkInputs = [
+    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..cb553c4fd5f6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/email-validator/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, dnspython
+, idna
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "email-validator";
+  version = "1.2.1";
+
+  src = fetchFromGitHub {
+    owner = "JoshData";
+    repo = "python-${pname}";
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-Avsqaev3LMoymU06y+u8MMv38ZI2cWk5tc/MkO+9oyA=";
+  };
+
+  propagatedBuildInputs = [
+    dnspython
+    idna
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # fails with dns.resolver.NoResolverConfiguration due to network sandboxing
+    "test_deliverability_no_records"
+    "test_deliverability_found"
+    "test_deliverability_fails"
+    "test_deliverability_dns_timeout"
+    "test_email_example_reserved_domain"
+    "test_main_single_good_input"
+    "test_main_multi_input"
+    "test_main_input_shim"
+    "test_validate_email__with_caching_resolver"
+    "test_validate_email__with_configured_resolver"
+  ];
+
+  pythonImportsCheck = [
+    "email_validator"
+  ];
+
+  meta = with lib; {
+    description = "A robust email syntax and deliverability validation library";
+    homepage    = "https://github.com/JoshData/python-email-validator";
+    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..c57e58368ff8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/emailthreads/default.nix
@@ -0,0 +1,29 @@
+{ lib, fetchFromGitHub, buildPythonPackage
+, python, isPy3k }:
+
+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}";
+    sha256 = "sha256-7BhYS1DQCW9QpG31asPCq5qPyJy+WW2onZpvEHhwQCs=";
+  };
+
+  PKGVER = version;
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest discover test
+  '';
+
+  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/embrace/default.nix b/nixpkgs/pkgs/development/python-modules/embrace/default.nix
new file mode 100644
index 000000000000..c342c9be5a0b
--- /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.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromSourcehut {
+    vc = "hg";
+    owner = "~olly";
+    repo = "embrace-sql";
+    rev = "v${version}-release";
+    hash = "sha256-R6Ug4f8KFZNzaNWqWZkLvOwtsawCuerzvHlysr7bd6M=";
+  };
+
+  propagatedBuildInputs = [
+    sqlparse
+    wrapt
+  ];
+
+  checkInputs = [
+    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..c79adccc41f6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/emcee/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, numpy
+, pytestCheckHook
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "emcee";
+  version = "3.1.2";
+
+  src = fetchFromGitHub {
+    owner = "dfm";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-MguhnLLo1zeNuMca8vWpxwysh9YJDD+IzvGQDbScK2M=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "emcee" ];
+
+  meta = with lib; {
+    description = "Kick ass affine-invariant ensemble MCMC sampling";
+    homepage = "https://emcee.readthedocs.io/";
+    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..ce1a57bc33ab
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/emoji/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "emoji";
+  version = "2.0.0";
+
+  src = fetchFromGitHub {
+    owner = "carpedm20";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-8Wm0yqCnscUc5da4c2hLOQsFMcr3XVe8FArX9wllo8Q=";
+  };
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    "test_emojize_name_only"
+  ];
+
+  pythonImportsCheck = [ "emoji" ];
+
+  meta = with lib; {
+    description = "Emoji for Python";
+    homepage = "https://github.com/carpedm20/emoji/";
+    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..b6c31519efcd
--- /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.3";
+
+  src = fetchFromGitHub {
+    owner = "approvals";
+    repo = "EmptyFiles.Python";
+    rev = "v${version}";
+    sha256 = "sha256-K4rlVO1X1AWxYI3EqLsyQ5/Ist/jlwFrmOM4aMojtKU=";
+  };
+
+  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..a4834a84656b
--- /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
+  ];
+
+  checkInputs = [
+    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..61ae38930fe1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/enaml/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools-scm
+, atom
+, ply
+, kiwisolver
+, qtpy
+, sip_4
+, cppy
+, bytecode
+}:
+
+buildPythonPackage rec {
+  pname = "enaml";
+  version = "0.15.1";
+
+  src = fetchFromGitHub {
+    owner = "nucleic";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-kS15x7fZsHlARh1ILsQpJnwozutuoIysTCCKwkNCa7Y=";
+  };
+
+  # 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"
+  ];
+
+  nativeBuildInputs = [ setuptools-scm ];
+  propagatedBuildInputs = [
+    atom
+    ply
+    kiwisolver
+    qtpy
+    sip_4
+    cppy
+    bytecode
+  ];
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  meta = with lib; {
+    homepage = "https://github.com/nucleic/enaml";
+    description = "Declarative User Interfaces for Python";
+    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..46d5ee725c75
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/enamlx/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, enaml
+, pyqtgraph
+, pythonocc-core
+}:
+
+buildPythonPackage rec {
+  pname = "enamlx";
+  version = "0.6.0";
+
+  src = fetchFromGitHub {
+    owner = "frmdstryr";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "10sn7wd4fjz8nkzprd8wa5da5dg8w91r0rngqaipwnpq1dz54b5s";
+  };
+
+  propagatedBuildInputs = [
+    enaml
+    # Until https://github.com/inkcut/inkcut/issues/105 perhaps
+    pyqtgraph
+    pythonocc-core
+  ];
+
+  # 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/enhancements/default.nix b/nixpkgs/pkgs/development/python-modules/enhancements/default.nix
new file mode 100644
index 000000000000..18fdfd29ce13
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/enhancements/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, argcomplete
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, typeguard
+}:
+
+buildPythonPackage rec {
+  pname = "enhancements";
+  version = "0.4.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "ssh-mitm";
+    repo = "python-enhancements";
+    rev = version;
+    hash = "sha256-Nff44WAQwSbkRpUHb9ANsQWWH2B819gtwQdXAjWJJls=";
+  };
+
+  propagatedBuildInputs = [
+    argcomplete
+    typeguard
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "enhancements"
+  ];
+
+  meta = with lib; {
+    description = "Library which extends various Python classes";
+    homepage = "https://enhancements.readthedocs.io";
+    license = licenses.lgpl3Only;
+    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..b6d31ddaf947
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/enlighten/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, blessed
+, prefixed
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "enlighten";
+  version = "1.10.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-eluDzQ9NCV5Z2Axkjrtff/ygzYvPeuZjmCjuGtAAYyo=";
+  };
+
+  propagatedBuildInputs = [
+    blessed
+    prefixed
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "enlighten"
+  ];
+
+  disabledTests = [
+    # AssertionError: <_io.TextIOWrapper name='<stdout>' mode='w' encoding='utf-8'> is not...
+    "test_init"
+  ] ++ lib.optional 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";
+    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..365d6c94ef28
--- /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
+  ];
+
+  checkInputs = [
+    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/enrich/default.nix b/nixpkgs/pkgs/development/python-modules/enrich/default.nix
new file mode 100644
index 000000000000..d4b08af212d3
--- /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 ];
+
+  checkInputs = [ 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; [ SuperSandro2000 ];
+  };
+}
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..215e69138d05
--- /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.17";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "dee5b4f3330f633fcd4e665f1781bf6e53b375ffdc7a24434257dfba6b1c2d7f";
+  };
+
+  # 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..0e73f9768115
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/entry-points-txt/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+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=";
+  };
+
+  checkInputs = [
+    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..e2146f3a5a62
--- /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=";
+  };
+
+  checkInputs = [
+    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..1223f3f911de
--- /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;
+    sha256 = "sha256-twbt2qkhihnrzWe1aBjwW7J1ibHKno15e3Sv+tTMrNQ=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  checkInputs = [
+    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..a177a68766fb
--- /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}";
+    sha256 = "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..91f54dc99cbf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/enum34/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonAtLeast
+, python
+}:
+
+if pythonAtLeast "3.4" then null else buildPythonPackage rec {
+  pname = "enum34";
+  version = "1.1.10";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "cce6a7477ed816bd2542d03d53db9f0db935dd013b70f336a95c73979289f248";
+  };
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest discover
+  '';
+
+  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..77ed6401f65c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/env-canada/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, geopy
+, imageio
+, lxml
+, pillow
+, pytestCheckHook
+, python-dateutil
+, pythonOlder
+, voluptuous
+}:
+
+buildPythonPackage rec {
+  pname = "env-canada";
+  version = "0.5.24";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "michaeldavie";
+    repo = "env_canada";
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-R6X4TY0yrfSj30FXHmHHK6QBHAT3pb+UXjjZ3SW1SP8=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    geopy
+    imageio
+    lxml
+    pillow
+    python-dateutil
+    voluptuous
+  ];
+
+  checkInputs = [
+    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";
+    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..4a8987b16346
--- /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;
+    sha256 = "sha256-hucApIn7ul7+MC2W811VTxZNO8Pqb6HDXz9VRcEdmIc=";
+  };
+
+  propagatedBuildInputs = [
+    marshmallow
+    python-dotenv
+  ];
+
+  checkInputs = [
+    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..f40ab66baabd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/envisage/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, apptools
+, buildPythonPackage
+, fetchPypi
+, ipython
+, pytestCheckHook
+, pythonAtLeast
+, pythonOlder
+, setuptools
+, traits
+}:
+
+buildPythonPackage rec {
+  pname = "envisage";
+  version = "6.0.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "8864c29aa344f7ac26eeb94788798f2d0cc791dcf95c632da8d79ebc580e114c";
+  };
+
+  # 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
+  '';
+
+  checkInputs = [
+    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..497d46f2d840
--- /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;
+    sha256 = "sha256-aIpZ4ln4L57HwK8H0FqsyNnXosnAp3ingrJI6/MPS90=";
+  };
+
+  propagatedBuildInputs = [
+    beautifulsoup4
+    envoy-utils
+    httpx
+    pyjwt
+  ];
+
+  checkInputs = [
+    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..3f095459642a
--- /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
+  ];
+
+  checkInputs = [
+    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..a5a87f908d4f
--- /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.3";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-f6GGhZgbpSjt1QQFKp1SEqCapb8VwRpzTtxqhuiotWo=";
+  };
+
+  checkInputs = [
+    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..0af57945073f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ephemeral-port-reserve/default.nix
@@ -0,0 +1,42 @@
+{ 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=";
+  };
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = lib.optionals stdenv.isDarwin [
+    # can't find hostname in our darwin build environment
+    "test_fqdn"
+  ];
+
+  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..7dbe665ede8e
--- /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.4.6";
+
+  src = fetchPypi {
+    pname = "epson_projector";
+    inherit version;
+    sha256 = "sha256-F8Dvk5OtlPbFyIedJb+zM2iN9eT0jDQEs06xbL3rlVs=";
+  };
+
+  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/eradicate/default.nix b/nixpkgs/pkgs/development/python-modules/eradicate/default.nix
new file mode 100644
index 000000000000..757dad33c096
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/eradicate/default.nix
@@ -0,0 +1,19 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "eradicate";
+  version = "2.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-qsc4SrJbG/IcTAEt6bS/g5iUWhTJjJEVRbLqUKtVgBQ=";
+  };
+
+  meta = with lib; {
+    description = "eradicate removes commented-out code from Python files.";
+    homepage = "https://github.com/myint/eradicate";
+    license = [ licenses.mit ];
+
+    maintainers = [ maintainers.mmlb ];
+  };
+}
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/esprima/default.nix b/nixpkgs/pkgs/development/python-modules/esprima/default.nix
new file mode 100644
index 000000000000..b32a098c12bc
--- /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=";
+  };
+
+  checkInputs = [
+    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..58d9c543aaa6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/et_xmlfile/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, lxml
+, pytest
+}:
+
+buildPythonPackage rec {
+  version = "1.0.1";
+  pname = "et_xmlfile";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256="0nrkhcb6jdrlb6pwkvd4rycw34y3s931hjf409ij9xkjsli9fkb1";
+  };
+
+  checkInputs = [ lxml pytest ];
+  checkPhase = ''
+    py.test $out
+  '';
+
+  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.
+
+      The code was written by Elias Rabel as part of the Python
+      Düsseldorf openpyxl sprint in September 2014.
+    '';
+    homepage = "https://pypi.python.org/pypi/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..a2c4dc971cbc
--- /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;
+    sha256 = "sha256-h+jYIRSNdrGkW3tBV1ifIDEXU46EQGyeJoz/Mxym4pI=";
+  };
+
+  patchPhase = ''
+    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;
+  };
+
+}
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..7b6a1a696fe4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/etebase/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, buildPythonPackage
+, rustPlatform
+, pkg-config
+, rustfmt
+, setuptools-rust
+, openssl
+, Security
+, msgpack
+}:
+
+buildPythonPackage rec {
+  pname = "etebase";
+  version = "0.31.2";
+
+  src = fetchFromGitHub {
+    owner = "etesync";
+    repo = "etebase-py";
+    rev = "v${version}";
+    hash = "sha256-enGmfXW8eV6FgdHfJqXr1orAsGbxDz9xUY6T706sf5U=";
+  };
+
+  cargoDeps = rustPlatform.fetchCargoTarball {
+    inherit src;
+    name = "${pname}-${version}";
+    hash = "sha256-4eJvFf6aY+DYkrYgam5Ok9941PX4uQOmtRznEY0+1TE=";
+  };
+
+  format = "pyproject";
+
+  nativeBuildInputs = [
+    pkg-config
+    rustfmt
+    setuptools-rust
+  ] ++ (with rustPlatform; [
+    cargoSetupHook
+    rust.cargo
+    rust.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..c5c7d8a646cf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/eternalegypt/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, aiohttp
+, attrs
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "eternalegypt";
+  version = "0.0.13";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "amelchio";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0wi2cqd81irqm873npkqg3mvdrb57idqdsp8qw8h0s7lk0kil1wi";
+  };
+
+  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";
+    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..ee81ead97c3a
--- /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
+  ];
+
+  checkInputs = [
+    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..7bf0f9b49710
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/eth-abi/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, eth-hash
+, eth-typing
+, eth-utils
+, hypothesis
+, parsimonious
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "eth-abi";
+  version = "3.0.0";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "ethereum";
+    repo = "eth-abi";
+    rev = "v${version}";
+    sha256 = "sha256-qiuyGVOy+n8l3jSqwMGnBXcDrOxIiJ0lNP4lq/EQEhU=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "parsimonious>=0.8.0,<0.9.0" "parsimonious"
+  '';
+
+  propagatedBuildInputs = [
+    eth-typing
+    eth-utils
+    parsimonious
+  ];
+
+  checkInputs = [
+    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; [ SuperSandro2000 ];
+  };
+}
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..1a929ca9099f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/eth-account/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, bitarray
+, eth-abi
+, eth-keyfile
+, eth-keys
+, eth-rlp
+, eth-utils
+, hexbytes
+, pythonOlder
+, rlp
+}:
+
+buildPythonPackage rec {
+  pname = "eth-account";
+  version = "0.6.1";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "ethereum";
+    repo = "eth-account";
+    rev = "v${version}";
+    sha256 = "sha256-cjQvTKC4lDbKnAvbmnTGHQiJZsZFhXc/+UH5rUdlGxs=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "bitarray>=1.2.1,<1.3.0" "bitarray>=2.4.0,<3"
+  '';
+
+  propagatedBuildInputs = [
+    bitarray
+    eth-abi
+    eth-keyfile
+    eth-keys
+    eth-rlp
+    eth-utils
+    hexbytes
+    rlp
+  ];
+
+  # 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; [ SuperSandro2000 ];
+  };
+}
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..1c60a2d59489
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/eth-hash/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, pythonOlder
+, pytest
+, pysha3
+, pycryptodome
+}:
+
+buildPythonPackage rec {
+  pname = "eth-hash";
+  version = "0.3.2";
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "ethereum";
+    repo = "eth-hash";
+    rev = "v${version}";
+    sha256 = "sha256-LMDtFUrsPYgj/Fl9aBW1todlj1D3LlFxAkzNFAzCGLQ=";
+  };
+
+  checkInputs = [
+    pytest
+  ] ++ passthru.optional-dependencies.pycryptodome
+  ++ passthru.optional-dependencies.pysha3;
+
+  checkPhase = ''
+    pytest tests/backends/pycryptodome/
+    pytest tests/backends/pysha3/
+  '';
+
+  passthru.optional-dependencies = {
+    pycryptodome = [ pycryptodome ];
+    pysha3 = [ pysha3 ];
+  };
+
+  meta = with lib; {
+    description = "The Ethereum hashing function keccak256";
+    homepage = "https://github.com/ethereum/eth-hash";
+    license = licenses.mit;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..fd62501b81d2
--- /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;
+    sha256 = "sha256-JD4bRoD9L0JXcd+bTZrq/BkWw5QGzOi1RvoyLJC77kk=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "'setuptools-markdown'" ""
+  '';
+
+  propagatedBuildInputs = [
+    eth-keys
+    eth-utils
+    pycryptodome
+  ];
+
+  checkInputs = [
+    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; [ SuperSandro2000 ];
+  };
+}
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..efdde22b8b90
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/eth-keys/default.nix
@@ -0,0 +1,56 @@
+{ 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}";
+    sha256 = "sha256-jG/jJPM4t3z6UQIdc8L6y0DxZiGx5pVuGL8XwbIt60o=";
+  };
+
+  propagatedBuildInputs = [
+    eth-typing
+    eth-utils
+  ];
+
+  checkInputs = [
+    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;
+
+  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; [ SuperSandro2000 ];
+  };
+}
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..72cd3c1e8408
--- /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}";
+    sha256 = "sha256-wfmRjHFu6H3J6hNin8ZA2454xXrLgcUdeR8iGXFomRE=";
+  };
+
+  propagatedBuildInputs = [
+    hexbytes
+    eth-utils
+    rlp
+  ];
+
+  checkInputs = [
+    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; [ SuperSandro2000 ];
+  };
+}
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..6c8bc6cb5707
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/eth-typing/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, pythonOlder
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "eth-typing";
+  version = "3.1.0";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "ethereum";
+    repo = "eth-typing";
+    rev = "v${version}";
+    sha256 = "sha256-Xk/IfW1zuNbGdYAxXTNL9kL+ZW1bWruZ21KFV9+lv/E=";
+  };
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "eth_typing" ];
+
+  meta = {
+    description = "Common type annotations for Ethereum Python packages";
+    homepage = "https://github.com/ethereum/eth-typing";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ SuperSandro2000 ];
+  };
+}
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..a5b19123c1ec
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/eth-utils/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, eth-hash
+, eth-typing
+, cytoolz
+, hypothesis
+, isPyPy
+, pytestCheckHook
+, pythonOlder
+, toolz
+}:
+
+buildPythonPackage rec {
+  pname = "eth-utils";
+  version = "2.0.0";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "ethereum";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-E2vUROc2FcAv00k50YpdxaaYIRDk1yGSPB8cHHw+7Yw=";
+  };
+
+  propagatedBuildInputs = [
+    eth-hash
+    eth-typing
+  ] ++ lib.optional (!isPyPy) cytoolz
+  ++ lib.optional isPyPy toolz;
+
+
+  checkInputs = [
+    hypothesis
+    pytestCheckHook
+  ] ++ eth-hash.optional-dependencies.pycryptodome;
+
+  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; [ SuperSandro2000 ];
+  };
+}
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..a428edc9e887
--- /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 = "0.7.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-IHwJfdQYDV5asce37ni3v5Rx4SU03qziOx05LevSkvM=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  passthru.optional-dependencies = rec {
+    array-types = enp;
+    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 ] ++ etree;
+    all = array-types ++ ecolab ++ edc ++ enp ++ epath ++ epy ++ etqdm
+      ++ etree ++ etree-dm ++ etree-jax ++ etree-tf;
+  };
+
+  doCheck = false; # disable tests until https://github.com/NixOS/nixpkgs/issues/185273 is resolved
+
+  pythonImportsCheck = [
+    "etils"
+  ];
+
+  checkInputs = [
+    chex
+    jaxlib
+    pytest-subtests
+    pytest-xdist
+    pytestCheckHook
+    yapf
+  ]
+  ++ passthru.optional-dependencies.all;
+
+  disabledTests = [
+    "test_repr" # known to fail on Python 3.10, see https://github.com/google/etils/issues/143
+    "test_public_access" # requires network access
+    "test_resource_path" # known to fail on Python 3.10, see https://github.com/google/etils/issues/143
+  ];
+
+  meta = with lib; {
+    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..5ad7696ae1cf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/etuples/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, cons
+, multipledispatch
+, pytestCheckHook
+, pytest-html
+}:
+
+buildPythonPackage rec {
+  pname = "etuples";
+  version = "0.3.5";
+
+  src = fetchFromGitHub {
+    owner = "pythological";
+    repo = "etuples";
+    rev = "v${version}";
+    sha256 = "sha256-gJNxrO2d/eF4t3bBlz/BwF+9eT1nKrVrTP3F6/dEN00=";
+  };
+
+  propagatedBuildInputs = [
+    cons
+    multipledispatch
+  ];
+
+  checkInputs = [
+    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";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ Etjean ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ev3dev2/default.nix b/nixpkgs/pkgs/development/python-modules/ev3dev2/default.nix
new file mode 100644
index 000000000000..5afbb7da655f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ev3dev2/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, python
+, pillow
+}:
+
+buildPythonPackage rec {
+  pname = "ev3dev2";
+  version = "2.1.0";
+
+  src = fetchFromGitHub {
+    owner = "ev3dev";
+    repo = "ev3dev-lang-python";
+    rev = version;
+    sha256 = "XxsiQs3k5xKb+3RewARbvBbxaztdvdq3w5ZMgTq+kRc=";
+    fetchSubmodules = true;
+  };
+
+  postPatch = ''
+    echo "${version}\n" > 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/evdev/default.nix b/nixpkgs/pkgs/development/python-modules/evdev/default.nix
new file mode 100644
index 000000000000..86149cbd865a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/evdev/default.nix
@@ -0,0 +1,27 @@
+{ lib, buildPythonPackage, fetchPypi, linuxHeaders }:
+
+buildPythonPackage rec {
+  pname = "evdev";
+  version = "1.5.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-WzOxdPfIRXbn3WBx5Di/WtIn2pXv1DVqOf5Mg1VBL+Y=";
+  };
+
+  buildInputs = [ linuxHeaders ];
+
+  patchPhase = ''
+    substituteInPlace setup.py --replace /usr/include/linux ${linuxHeaders}/include/linux
+  '';
+
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Provides bindings to the generic input event interface in Linux";
+    homepage = "https://pythonhosted.org/evdev";
+    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..ca14185738cd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/eve/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, flask
+, events
+, pymongo
+, simplejson
+, cerberus
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "Eve";
+  version = "2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-KVKUSPGGLXOusflL4OjzXdJDGi66q+895qvtaBrSFG8=";
+  };
+
+  disabled = pythonOlder "3.7";
+
+  propagatedBuildInputs = [
+    cerberus
+    events
+    flask
+    pymongo
+    simplejson
+    setuptools
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "events>=0.3,<0.4" "events>=0.3,<0.5"
+  '';
+
+  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..977f5e236a25
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/eventlet/default.nix
@@ -0,0 +1,100 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, dnspython
+, greenlet
+, monotonic
+, six
+, nose
+, iana-etc
+, pytestCheckHook
+, libredirect
+}:
+
+buildPythonPackage rec {
+  pname = "eventlet";
+  version = "0.33.1";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "eventlet";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-8tIvvTTCcIG56VaPZMhdzAKnFRsYV3YC9xcf47nh838=";
+  };
+
+  propagatedBuildInputs = [
+    dnspython
+    greenlet
+    six
+  ] ++ lib.optionals (pythonOlder "3.5") [
+    monotonic
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    nose
+  ];
+
+  doCheck = !stdenv.isDarwin;
+
+  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"
+  ] ++ lib.optionals stdenv.isAarch64 [
+    "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..6fe355d9c4d8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/events/default.nix
@@ -0,0 +1,17 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "Events";
+  version = "0.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "01d9dd2a061f908d74a89fa5c8f07baa694f02a2a5974983663faaf7a97180f5";
+  };
+
+  meta = with lib; {
+    homepage = "https://events.readthedocs.org";
+    description = "Bringing the elegance of C# EventHanlder to Python";
+    license = licenses.bsd3;
+  };
+}
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..908d68dd27e9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/evohome-async/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "evohome-async";
+  version = "0.3.15";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "zxdavb";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-/dZRlcTcea26FEpw/XDItKh4ncr/eEFQcdfIE2KIMo8=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  # 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..9e4af7ffa88b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/evtx/default.nix
@@ -0,0 +1,50 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, rustPlatform
+}:
+
+buildPythonPackage rec {
+  pname = "evtx";
+  version = "0.7.3";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "omerbenamram";
+    repo = "pyevtx-rs";
+    rev = version;
+    sha256 = "sha256-59iEmgF1m+Yr5k4oxZGqMs5oMZxToUFYuwQDeLEQ2jY=";
+  };
+
+  cargoDeps = rustPlatform.fetchCargoTarball {
+    inherit src;
+    name = "${pname}-${version}";
+    sha256 = "sha256-Q2SpJohLSQCMYmx1ZMWZ7a/NC0lPsHkwxom00qVooNM=";
+  };
+
+  nativeBuildInputs = with rustPlatform; [
+    cargoSetupHook
+    maturinBuildHook
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "evtx"
+  ];
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    description = "Bindings for evtx";
+    homepage = "https://github.com/omerbenamram/pyevtx-rs";
+    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..5fe9e716ddb6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/exceptiongroup/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, flit-core
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "exceptiongroup";
+  version = "1.0.0rc8";
+  format = "flit";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-aZDCTwa40zyAZc/kPl6KS/o4TgNYvgNq+cxgtjIb0Ro=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  # Tests are only in the source available but tagged releases
+  # are incomplete as files are generated during the release process
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "exceptiongroup"
+  ];
+
+  meta = with lib; {
+    description = "Backport of PEP 654 (exception groups)";
+    homepage = "https://github.com/agronholm/exceptiongroup";
+    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..1ca0c2046568
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/exchangelib/default.nix
@@ -0,0 +1,78 @@
+{ lib
+, backports-zoneinfo
+, buildPythonPackage
+, cached-property
+, defusedxml
+, dnspython
+, fetchFromGitHub
+, 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 = "4.7.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "ecederstrand";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-Oarmdc2PuE4kQ/qUqQhuzdTpIrrMFCK72CrVmoSH1DI=";
+  };
+
+  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
+  ];
+
+  checkInputs = [
+    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";
+    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..d369b3645ab6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/exdown/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, isPy27
+, fetchPypi
+, pythonOlder
+, importlib-metadata
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "exdown";
+  version = "0.9.0";
+  format = "pyproject";
+
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-r0SCigkUpOiba4MDf80+dLjOjjruVNILh/raWfvjXA0=";
+  };
+
+  propagatedBuildInputs = lib.optionals (pythonOlder "3.8") [ importlib-metadata ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "exdown" ];
+
+  meta = with lib; {
+    description = "Extract code blocks from markdown";
+    homepage = "https://github.com/nschloe/exdown";
+    license = licenses.mit;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..0c75727e7445
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/execnet/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, isPyPy
+, fetchPypi
+, pytestCheckHook
+, setuptools-scm
+, apipkg
+}:
+
+buildPythonPackage rec {
+  pname = "execnet";
+  version = "1.9.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "8f694f3ba9cc92cab508b152dcfe322153975c29bda272e2fd7f3f00f36e47c5";
+  };
+
+  checkInputs = [ pytestCheckHook ];
+  nativeBuildInputs = [ setuptools-scm ];
+  propagatedBuildInputs = [ apipkg ];
+
+  # remove vbox tests
+  postPatch = ''
+    rm -v testing/test_termination.py
+    rm -v testing/test_channel.py
+    rm -v testing/test_xspec.py
+    rm -v testing/test_gateway.py
+    ${lib.optionalString isPyPy "rm -v testing/test_multi.py"}
+  '';
+
+  pythonImportsCheck = [ "execnet" ];
+
+  __darwinAllowLocalNetworking = true;
+
+  meta = with lib; {
+    description = "Distributed Python deployment and communication";
+    license = licenses.mit;
+    homepage = "https://execnet.readthedocs.io/";
+    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..1a6664df6712
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/executing/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, asttokens
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "executing";
+  version = "0.8.2";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "alexmojaki";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-CDZQ9DONn7M+2/GtmM2G6nQPpI9dOd0ca+2F1PGRwO4=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  preBuild = ''
+    export SETUPTOOLS_SCM_PRETEND_VERSION="${version}"
+  '';
+
+  # Tests appear to run fine (Ran 22 tests in 4.076s) with setuptoolsCheckPhase
+  # but crash with pytestCheckHook
+  checkInputs = [
+    asttokens
+  ];
+
+  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..610d9b0b096c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/executor/default.nix
@@ -0,0 +1,36 @@
+{ lib, buildPythonPackage, fetchFromGitHub, isPy27, coloredlogs, property-manager, fasteners, pytestCheckHook, mock, virtualenv }:
+
+buildPythonPackage rec {
+  pname = "executor";
+  version = "23.2";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "xolox";
+    repo = "python-executor";
+    rev = version;
+    sha256 = "1mr0662c5l5zx0wjapcprp8p2xawfd0im3616df5sgv79fqzwfqs";
+  };
+
+  propagatedBuildInputs = [ coloredlogs property-manager fasteners ];
+
+  checkInputs = [ 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; {
+    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..2c549030e6d7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/exif/default.nix
@@ -0,0 +1,30 @@
+{ lib, buildPythonPackage, fetchFromGitLab, isPy3k, plum-py, pytestCheckHook, baseline }:
+
+buildPythonPackage rec {
+  pname = "exif";
+  version = "1.2.0";
+  disabled = !isPy3k;
+
+  src = fetchFromGitLab {
+    owner = "TNThieding";
+    repo = "exif";
+    rev = "686857c677f489759db90b1ad61fa1cc1cac5f9a";
+    sha256 = "0z2if23kmi0iyxviz32mlqs997i3dqpqfz6nznlwkhkkb6rkwwnh";
+  };
+
+  propagatedBuildInputs = [ plum-py ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "plum-py==0.3.1" "plum-py>=0.3.1"
+  '';
+
+  checkInputs = [ pytestCheckHook baseline ];
+
+  meta = with lib; {
+    description = "Read and modify image EXIF metadata using Python";
+    homepage    = "https://gitlab.com/TNThieding/exif";
+    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..1e4ba3c17695
--- /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;
+    sha256 = "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/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..db64b386f241
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/expecttest/default.nix
@@ -0,0 +1,34 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, hypothesis
+, lib
+, poetry
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "expecttest";
+  version = "0.1.3";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "ezyang";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-5CnpVFSbf3FcAa06Y7atG8sxu8uevpfrliB2HuVcrx0=";
+  };
+
+  buildInputs = [ poetry ];
+
+  checkInputs = [ 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/expiringdict/default.nix b/nixpkgs/pkgs/development/python-modules/expiringdict/default.nix
new file mode 100644
index 000000000000..942feff4513f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/expiringdict/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonApplication
+, fetchFromGitHub
+, dill
+, coverage
+, coveralls
+, mock
+, nose
+}:
+
+buildPythonApplication rec {
+  pname = "expiringdict";
+  version = "1.2.2";
+
+  # 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 = "v${version}";
+    sha256 = "sha256-vRhJSHIqc51I+s/wndtfANM44CKW3QS1iajqyoSBf0I=";
+  };
+
+  checkInputs = [
+    dill
+    coverage
+    coveralls
+    mock
+    nose
+  ];
+
+  checkPhase = ''
+    nosetests -v --with-coverage --cover-package=expiringdict
+  '';
+
+  pythonImportsCheck = [ "expiringdict" ];
+
+  meta = with lib; {
+    description = "Dictionary with auto-expiring values for caching purposes";
+    homepage = "https://pypi.org/project/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..a77c31e26a63
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/explorerscript/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, antlr4-python3-runtime
+, igraph
+, pygments
+}:
+
+buildPythonPackage rec {
+  pname = "explorerscript";
+  version = "0.1.1";
+
+  src = fetchFromGitHub {
+    owner = "SkyTemple";
+    repo = pname;
+    rev = version;
+    sha256 = "1vzyliiyrxx8l9sfbqcyr4xn5swd7znkxy69kn0vb5rban8hm9c1";
+  };
+
+  patches = [
+    # https://github.com/SkyTemple/ExplorerScript/pull/17
+    (fetchpatch {
+      url = "https://github.com/SkyTemple/ExplorerScript/commit/47d8b3d246881d675a82b4049b87ed7d9a0e1b15.patch";
+      sha256 = "0sadw9l2nypl2s8lw526lvbdj4rzqdvrjncx4zxxgyp3x47csb48";
+    })
+  ];
+
+  propagatedBuildInputs = [ antlr4-python3-runtime igraph ];
+  checkInputs = [ pygments ];
+
+  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; [ 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..8c980c8d00fa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/exrex/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "exrex";
+  version = "0.10.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1wq8nyycdprxl9q9y1pfhkbca4rvysj45h1xn7waybl3v67v3f1z";
+  };
+
+  # 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..be6fcde55c29
--- /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 = "source/builtins/extractcode_7z-linux";
+
+  propagatedBuildInputs = [
+    plugincode
+  ];
+
+  preBuild = ''
+    pushd src/extractcode_7z/bin
+
+    rm 7z 7z.so
+    ln -s ${p7zip}/bin/7z 7z
+    ln -s ${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 = teams.determinatesystems.members;
+    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..0a8db8611921
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/extractcode/default.nix
@@ -0,0 +1,73 @@
+{ lib
+, buildPythonPackage
+, extractcode-7z
+, extractcode-libarchive
+, fetchPypi
+, patch
+, pytest-xdist
+, pytestCheckHook
+, pythonOlder
+, setuptools-scm
+, 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=";
+  };
+
+  dontConfigure = true;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    typecode
+    patch
+    extractcode-libarchive
+    extractcode-7z
+  ];
+
+  checkInputs = [
+    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"
+  ];
+
+  pythonImportsCheck = [
+    "extractcode"
+  ];
+
+  meta = with lib; {
+    description = "Universal archive extractor using z7zip, libarchve, other libraries and the Python standard library";
+    homepage = "https://github.com/nexB/extractcode";
+    license = licenses.asl20;
+    maintainers = teams.determinatesystems.members;
+  };
+}
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..efb314fa4c5b
--- /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 = "source/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 = teams.determinatesystems.members;
+    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/eyed3/default.nix b/nixpkgs/pkgs/development/python-modules/eyed3/default.nix
new file mode 100644
index 000000000000..3dfd810f99cb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/eyed3/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, python
+, isPyPy
+, six
+, filetype
+, deprecation
+, dataclasses
+}:
+
+buildPythonPackage rec {
+  version = "0.9.6";
+  pname    = "eyeD3";
+  disabled = isPyPy;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "4b5064ec0fb3999294cca0020d4a27ffe4f29149e8292fdf7b2de9b9cabb7518";
+  };
+
+  # requires special test data:
+  # https://github.com/nicfit/eyeD3/blob/103198e265e3279384f35304e8218be6717c2976/Makefile#L97
+  doCheck = false;
+
+  propagatedBuildInputs = [
+    six filetype deprecation
+  ] ++ lib.optional (pythonOlder "3.7") dataclasses;
+
+  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..3fd30062b0d9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ezdxf/default.nix
@@ -0,0 +1,28 @@
+{ lib, buildPythonPackage, pythonOlder, fetchFromGitHub, pyparsing, pytest }:
+
+buildPythonPackage rec {
+  version = "0.12";
+  pname = "ezdxf";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "mozman";
+    repo = "ezdxf";
+    rev = "v${version}";
+    sha256 = "1flcq96ljk5wqrmgsb4acflqzkg7rhlaxz0j5jxky9za0mj1x6dq";
+  };
+
+  checkInputs = [ pytest ];
+  checkPhase = "pytest tests integration_tests";
+
+  propagatedBuildInputs = [ pyparsing ];
+
+  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..dc46bcfcd957
--- /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
+, pytorch
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "ezyrb";
+  version = "1.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "mathLab";
+    repo = "EZyRB";
+    rev = "v${version}";
+    sha256 = "sha256-tFkz+j97m+Bgk/87snQMXtgZnykiWYyWJJLaqwRKiaY=";
+  };
+
+  propagatedBuildInputs = [
+    future
+    numpy
+    scipy
+    matplotlib
+    scikit-learn
+    pytorch
+  ];
+
+  checkInputs = [
+    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/f90nml/default.nix b/nixpkgs/pkgs/development/python-modules/f90nml/default.nix
new file mode 100644
index 000000000000..39aa55542ded
--- /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;
+    sha256 = "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..7cd0e291999c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/faadelays/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "faadelays";
+  version = "0.0.7";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-osZqfSYlKPYZMelBR6YB331iRB4DTjCUlmX7pcrIiGk=";
+  };
+
+  propagatedBuildInputs = [ aiohttp ];
+
+  # Project has no tests
+  doCheck = false;
+  pythonImportsCheck = [ "faadelays" ];
+
+  meta = with lib; {
+    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/fabulous/default.nix b/nixpkgs/pkgs/development/python-modules/fabulous/default.nix
new file mode 100644
index 000000000000..b357eb0c01b4
--- /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;
+    sha256 = "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/default.nix b/nixpkgs/pkgs/development/python-modules/face/default.nix
new file mode 100644
index 000000000000..db1810ca056d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/face/default.nix
@@ -0,0 +1,31 @@
+{ lib, buildPythonPackage, fetchPypi, boltons, pytest }:
+
+buildPythonPackage rec {
+  pname = "face";
+  version = "20.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "7d59ca5ba341316e58cf72c6aff85cca2541cf5056c4af45cb63af9a814bed3e";
+  };
+
+  propagatedBuildInputs = [ boltons ];
+
+  checkInputs = [ pytest ];
+  checkPhase = "pytest face/test";
+
+  # ironically, test_parse doesn't parse, but fixed in git so no point
+  # reporting
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/mahmoud/face";
+    description = "A command-line interface parser and framework";
+    longDescription = ''
+      A command-line interface parser and framework, friendly for
+      users, full-featured for developers.
+    '';
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ twey ];
+  };
+}
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..b0c5266d6fb1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/face_recognition/default.nix
@@ -0,0 +1,42 @@
+{ buildPythonPackage, fetchFromGitHub, pillow, click, dlib, numpy
+, face_recognition_models, lib, flake8, pytest, glibcLocales
+}:
+
+buildPythonPackage rec {
+  pname = "face_recognition";
+  version = "1.3.0";
+
+  src = fetchFromGitHub {
+    repo = pname;
+    owner = "ageitgey";
+    rev = "d34c622bf42e2c619505a4884017051ecf61ac77";
+    sha256 = "052878vnh3vbrsvmpgr0bx78k524dlxn47b2xakzbxk7dyjrgcli";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py --replace "flake8==2.6.0" "flake8"
+  '';
+
+  propagatedBuildInputs = [ pillow click dlib numpy face_recognition_models ];
+
+  # Our dlib is compiled with AVX instructions by default which breaks
+  # with "Illegal instruction" on some builders due to missing hardware features.
+  #
+  # As this makes the build fairly unreliable, it's better to skip the test and to ensure that
+  # the build is working and after each change to the package, manual testing should be done.
+  doCheck = false;
+
+  # Although tests are disabled by default, checkPhase still exists, so
+  # maintainers can check the package's functionality locally before modifying it.
+  checkInputs = [ flake8 pytest glibcLocales ];
+  checkPhase = ''
+    LC_ALL="en_US.UTF-8" py.test
+  '';
+
+  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/default.nix b/nixpkgs/pkgs/development/python-modules/face_recognition_models/default.nix
new file mode 100644
index 000000000000..ccf20f494998
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/face_recognition_models/default.nix
@@ -0,0 +1,23 @@
+{ buildPythonPackage, lib, fetchPypi, setuptools }:
+
+buildPythonPackage rec {
+  pname = "face_recognition_models";
+  version = "0.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1kwnv3qpy5bhspk780bkyg8jd9n5f6p91ja6sjlwk1wcm00d56xp";
+  };
+
+  # no module named `tests` as no tests are available
+  doCheck = false;
+
+  propagatedBuildInputs = [ setuptools ];
+
+  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/facebook-sdk/default.nix b/nixpkgs/pkgs/development/python-modules/facebook-sdk/default.nix
new file mode 100644
index 000000000000..e9300edab09d
--- /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 = [ maintainers.costrouc ];
+  };
+}
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..407083e4f691
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/factory_boy/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, django
+, faker
+, fetchPypi
+, flask
+, flask-sqlalchemy
+, mongoengine
+, pytestCheckHook
+, sqlalchemy
+}:
+
+buildPythonPackage rec {
+  pname = "factory-boy";
+  version = "3.2.1";
+  format = "setuptools";
+
+  src = fetchPypi {
+    pname = "factory_boy";
+    inherit version;
+    sha256 = "sha256-qY0newwEfHXrbkq4UIp/gfsD0sshmG9ieRNUbveipV4=";
+  };
+
+  propagatedBuildInputs = [
+    faker
+  ];
+
+  checkInputs = [
+    django
+    flask
+    flask-sqlalchemy
+    mongoengine
+    pytestCheckHook
+    sqlalchemy
+  ];
+
+  # Checks for MongoDB requires an a running DB
+  disabledTests = [
+    "MongoEngineTestCase"
+  ];
+
+  pythonImportsCheck = [
+    "factory"
+  ];
+
+  meta = with lib; {
+    description = "Python package to create factories for complex objects";
+    homepage = "https://github.com/rbarrois/factory_boy";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..9b207a81c3c7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fake-useragent/default.nix
@@ -0,0 +1,22 @@
+{ lib, fetchPypi, buildPythonPackage, six, pytest }:
+
+buildPythonPackage rec {
+  pname = "fake-useragent";
+  version = "0.1.11";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0dfz3bpmjmaxlhda6hfgsac7afb65pljibi8zkp9gc0ffn5rj161";
+  };
+
+  propagatedBuildInputs = [ six ];
+
+  checkInputs = [ pytest ];
+
+  meta = with lib; {
+    description = "Up to date simple useragent faker with real world database";
+    homepage = "https://github.com/hellysmile/fake-useragent";
+    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..a464d0372b51
--- /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 = "13.15.0";
+
+  src = fetchPypi {
+    pname = "Faker";
+    inherit version;
+    hash = "sha256-oSb6ZvVOZaZ/kT3MaYydAj3vcneIJTa94paPyscBv9U=";
+  };
+
+  propagatedBuildInputs = [
+    python-dateutil
+    text-unidecode
+  ];
+
+  checkInputs = [
+    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..9e49e4a2239a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fakeredis/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, aioredis
+, buildPythonPackage
+, fetchFromGitHub
+, hypothesis
+, lupa
+, poetry-core
+, pytest-asyncio
+, pytestCheckHook
+, pytest-mock
+, pythonOlder
+, redis
+, six
+, sortedcontainers
+}:
+
+buildPythonPackage rec {
+  pname = "fakeredis";
+  version = "1.9.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "dsoftwareinc";
+    repo = "fakeredis-py";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-HmCF1CNZOCdvuJv3qr3qAWIP9wYr6053FToQyJ1MpmQ=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    redis
+    six
+    sortedcontainers
+  ];
+
+  checkInputs = [
+    hypothesis
+    pytest-asyncio
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  passthru.optional-dependencies = {
+    lua = [
+      lupa
+    ];
+    aioredis = [
+      aioredis
+    ];
+  };
+
+  pythonImportsCheck = [
+    "fakeredis"
+  ];
+
+  meta = with lib; {
+    description = "Fake implementation of Redis API";
+    homepage = "https://github.com/dsoftwareinc/fakeredis-py";
+    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..8051fbb55bfb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/falcon/default.nix
@@ -0,0 +1,95 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, isPyPy
+, fetchFromGitHub
+
+# build
+, cython
+
+# tests
+, aiofiles
+, cbor2
+, httpx
+, msgpack
+, mujson
+, orjson
+, pytest-asyncio
+, pytestCheckHook
+, pyyaml
+, rapidjson
+, requests
+, testtools
+, ujson
+, uvicorn
+, websockets
+}:
+
+buildPythonPackage rec {
+  pname = "falcon";
+  version = "3.1.0";
+  format = "pyproject";
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "falconry";
+    repo = pname;
+    rev = version;
+    hash = "sha256-Y6bD0GCXhqpvMV+/i1v59p2qWZ91f2ey7sPQrVALY54=";
+  };
+
+  nativeBuildInputs = lib.optionals (!isPyPy) [
+    cython
+  ];
+
+  preCheck = ''
+    export HOME=$TMPDIR
+    cp -R tests examples $TMPDIR
+    pushd $TMPDIR
+  '';
+
+  postCheck = ''
+    popd
+  '';
+
+  checkInputs = [
+    # 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..8649e0698271
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/faraday-agent-parameters-types/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, marshmallow
+, packaging
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "faraday-agent-parameters-types";
+  version = "1.0.3";
+
+  src = fetchPypi {
+    pname = "faraday_agent_parameters_types";
+    inherit version;
+    sha256 = "6155669db477c3330c0850814eabe231bbbadf9d2ec57b4f734994f76eaee0e7";
+  };
+
+  propagatedBuildInputs = [
+    marshmallow
+    packaging
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace '"pytest-runner",' ""
+  '';
+
+  pythonImportsCheck = [
+    "faraday_agent_parameters_types"
+    "faraday_agent_parameters_types.utils"
+  ];
+
+  meta = with lib; {
+    description = "Collection of Faraday agent parameters types";
+    homepage = "https://github.com/infobyte/faraday_agent_parameters_types";
+    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..b70e239b4e94
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/faraday-plugins/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, beautifulsoup4
+, buildPythonPackage
+, click
+, colorama
+, fetchFromGitHub
+, html2text
+, lxml
+, pytestCheckHook
+, python-dateutil
+, pytz
+, requests
+, simplejson
+, tabulate
+}:
+
+buildPythonPackage rec {
+  pname = "faraday-plugins";
+  version = "1.6.8";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "infobyte";
+    repo = "faraday_plugins";
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-nRt2rcP/UldnNzDxANQDCzuqkFCU4LQxfWarqyc5a5Y=";
+  };
+
+  propagatedBuildInputs = [
+    beautifulsoup4
+    click
+    colorama
+    html2text
+    lxml
+    python-dateutil
+    pytz
+    requests
+    simplejson
+    tabulate
+  ];
+
+  checkInputs = [
+    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"
+  ];
+
+  pythonImportsCheck = [
+    "faraday_plugins"
+  ];
+
+  meta = with lib; {
+    description = "Security tools report parsers for Faraday";
+    homepage = "https://github.com/infobyte/faraday_plugins";
+    license = with licenses; [ gpl3Only ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..973c810b6347
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fastapi-mail/default.nix
@@ -0,0 +1,78 @@
+{ 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.0.9";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "sabuhish";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-2Nb+FzmhsKvauT/yOCLHCEld8r+6niu9kV6EmjhC6S0=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'fastapi = "^0.75.0"' 'fastapi = "*"' \
+      --replace 'httpx = "^0.22.0"' 'httpx = "*"'
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aioredis
+    aiosmtplib
+    blinker
+    email-validator
+    fakeredis
+    fastapi
+    httpx
+    jinja2
+    pydantic
+    python-multipart
+  ];
+
+  checkInputs = [
+    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";
+    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..fdb81b4a7c56
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fastapi/default.nix
@@ -0,0 +1,92 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pydantic
+, starlette
+, pytestCheckHook
+, pytest-asyncio
+, aiosqlite
+, databases
+, flask
+, httpx
+, passlib
+, peewee
+, python-jose
+, sqlalchemy
+, trio
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "fastapi";
+  version = "0.79.0";
+  format = "flit";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "tiangolo";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-HaA9a/tqKtB24YtObk/XAsUy2mmWNonRyPXHflGRiPQ=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "starlette==" "starlette>="
+  '';
+
+  propagatedBuildInputs = [
+    starlette
+    pydantic
+  ];
+
+  checkInputs = [
+    aiosqlite
+    databases
+    flask
+    httpx
+    passlib
+    peewee
+    python-jose
+    pytestCheckHook
+    pytest-asyncio
+    sqlalchemy
+    trio
+  ] ++ passlib.optional-dependencies.bcrypt;
+
+  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"
+  ];
+
+  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"
+  ];
+
+  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..883acef11b92
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fastavro/default.nix
@@ -0,0 +1,59 @@
+{ buildPythonPackage
+, cython
+, fetchFromGitHub
+, isPy38
+, lib
+, lz4
+, numpy
+, pandas
+, pytestCheckHook
+, python-dateutil
+, python-snappy
+, pythonOlder
+, zstandard
+}:
+
+buildPythonPackage rec {
+  pname = "fastavro";
+  version = "1.5.3";
+
+  disabled = pythonOlder "3.6";
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-6Zs4Whf/9c829D3tHvrhOzVRjYzqomcT9wzrBCklQmc=";
+  };
+
+  preBuild = ''
+    export FASTAVRO_USE_CYTHON=1
+  '';
+
+  nativeBuildInputs = [ cython ];
+
+  checkInputs = [
+    lz4
+    numpy
+    pandas
+    pytestCheckHook
+    python-dateutil
+    python-snappy
+    zstandard
+  ];
+
+  # 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";
+    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..9c51b1f9127d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fastbencode/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchPypi, python, cython }:
+
+buildPythonPackage rec {
+  pname = "fastbencode";
+  version = "0.0.9";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-pQhjLGRfLj/7tJhMtUQDXIlG1v7Iz+CuxeVWNAdzzpw=";
+  };
+
+  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 = [ 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..100af5244b57
--- /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";
+  };
+
+  checkInputs = [ 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..8f0b244723ba
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fastcore/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, packaging
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "fastcore";
+  version = "1.5.17";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "fastai";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-glDjqcNLnk2p4zqfICiTLtENMYQ5S6UshwkP797NljY=";
+  };
+
+  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";
+    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..a790f1623817
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fastdiff/default.nix
@@ -0,0 +1,33 @@
+{ stdenv, lib, buildPythonPackage, fetchPypi, wasmer, wasmer-compiler-cranelift, 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 ];
+
+  checkInputs = [ pytestCheckHook pytest-benchmark ];
+
+  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; [ SuperSandro2000 ];
+    # resulting compiled object panics at import
+    broken = stdenv.is32bit;
+  };
+}
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..cb75a599d03a
--- /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" ];
+  checkInputs = [ 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..e305f1e6d658
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fastecdsa/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, gmp
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "fastecdsa";
+  version = "2.2.3";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "269bdb0f618b38f8f6aec9d23d23db518046c3cee01a954fa6aa7322a1a7db8f";
+  };
+
+  buildInputs = [ gmp ];
+
+  checkInputs = [ 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";
+    license = licenses.unlicense;
+    maintainers = with maintainers; [ prusnak ];
+  };
+}
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..ef8a62bc8e8e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fasteners/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, diskcache
+, more-itertools
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "fasteners";
+  version = "0.17.3";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "harlowja";
+    repo = pname;
+    rev = version;
+    hash = "sha256-FVhHp8BZ/wQQyr5AcuDo94LlflixhjZ0SnheSdHuDVQ=";
+  };
+
+  checkInputs = [
+    diskcache
+    more-itertools
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "A python package that provides useful locks";
+    homepage = "https://github.com/harlowja/fasteners";
+    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/fastimport/default.nix b/nixpkgs/pkgs/development/python-modules/fastimport/default.nix
new file mode 100644
index 000000000000..bd5c270d686c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fastimport/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, pythonOlder
+, buildPythonPackage
+, fetchPypi
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "fastimport";
+  version = "0.9.14";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "6ac99dda4e7b0b3ae831507b6d0094802e6dd95891feafde8cc5c405b6c149ca";
+  };
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest discover
+  '';
+
+  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..cbb12c054e4b
--- /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;
+    sha256 = "sha256-Gojayel/xQ5gRI0nbwsroeSMdRndjb+8EniX1Qs4nbg=";
+  };
+
+  checkInputs = [
+    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..5fd8115152f5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fastnumbers/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fastnumbers
+, fetchFromGitHub
+, hypothesis
+, pytestCheckHook
+, pythonOlder
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "fastnumbers";
+  version = "3.2.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "SethMMorton";
+    repo = pname;
+    rev = version;
+    sha256 = "1v9l5p90y6ygrs0qmgdzxfv2vp1mpfp65snkl9jp6kcy44g3alhp";
+  };
+
+  propagatedBuildInputs = [
+    typing-extensions
+  ];
+
+  # Tests fail due to numeric precision differences on ARM
+  # See https://github.com/SethMMorton/fastnumbers/issues/28
+  doCheck = !stdenv.hostPlatform.isAarch;
+
+  checkInputs = [
+    hypothesis
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "fastnumbers"
+  ];
+
+  meta = with lib; {
+    description = "Python module for number conversion";
+    homepage = "https://github.com/SethMMorton/fastnumbers";
+    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..45d9976896ec
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fastpair/default.nix
@@ -0,0 +1,28 @@
+{ lib, buildPythonPackage, fetchFromGitHub, pytest-runner, pytest, scipy, pytestCheckHook }:
+
+buildPythonPackage {
+  pname = "fastpair";
+  version = "2021-05-19";
+
+  src = fetchFromGitHub {
+    owner = "carsonfarmer";
+    repo = "fastpair";
+    rev = "d3170fd7e4d6e95312e7e1cb02e84077a3f06379";
+    sha256 = "1l8zgr8awg27lhlkpa2dsvghrb7b12jl1bkgpzg5q7pg8nizl9mx";
+  };
+
+  nativeBuildInputs = [ pytest-runner ];
+
+  checkInputs = [ pytest pytestCheckHook ];
+
+  propagatedBuildInputs = [
+    scipy
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/carsonfarmer/fastpair";
+    description = "Data-structure for the dynamic closest-pair problem";
+    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..e11aac39f7e6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fastparquet/default.nix
@@ -0,0 +1,78 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, python
+, numba
+, numpy
+, pandas
+, cramjam
+, fsspec
+, thrift
+, python-lzo
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "fastparquet";
+  version = "0.8.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "dask";
+    repo = pname;
+    rev = version;
+    hash = "sha256-rWrbHHcJMahaUV8+YuKkZUhdboNFUK9btjvdg74lCxc=";
+  };
+
+  propagatedBuildInputs = [
+    cramjam
+    fsspec
+    numba
+    numpy
+    pandas
+    thrift
+  ];
+
+  passthru.optional-dependencies = {
+    lzo = [
+      python-lzo
+    ];
+  };
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "'pytest-runner'," "" \
+      --replace "oldest-supported-numpy" "numpy"
+  '';
+
+
+  # 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..51669f90345d
--- /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 ];
+  checkInputs = [ 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..2ef751ad1b3b
--- /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;
+    sha256 = "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..065150e88e2f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fastrlock/default.nix
@@ -0,0 +1,18 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "fastrlock";
+  version = "0.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9cc100ed0924b32173d7de705a82fdf1257cdf60af1952a13f64759307b40931";
+  };
+
+  meta = with lib; {
+    homepage = "https://github.com/scoder/fastrlock";
+    description = "A fast RLock implementation for CPython";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hyphon81 ];
+  };
+}
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/favicon/default.nix b/nixpkgs/pkgs/development/python-modules/favicon/default.nix
new file mode 100644
index 000000000000..1a3917fbdb7a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/favicon/default.nix
@@ -0,0 +1,27 @@
+{ lib, buildPythonPackage, fetchPypi, requests, beautifulsoup4, pytest, requests-mock,
+  pytest-runner }:
+
+buildPythonPackage rec {
+  pname = "favicon";
+  version = "0.7.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "6d6b5a78de2a0d0084589f687f384b2ecd6a6527093fec564403b1a30605d7a8";
+  };
+
+  buildInputs = [ pytest-runner ];
+  checkInputs = [ pytest requests-mock ];
+  propagatedBuildInputs = [ requests beautifulsoup4 ];
+
+  checkPhase = ''
+    pytest
+  '';
+
+  meta = with lib; {
+    description = "Find a website's favicon";
+    homepage = "https://github.com/scottwernervt/favicon";
+    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..32a6a1d60ca1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fb-re2/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, re2
+}:
+
+buildPythonPackage rec {
+  pname = "fb-re2";
+  version = "1.0.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "83b2c2cd58d3874e6e3a784cf4cf2f1a57ce1969e50180f92b010eea24ef26cf";
+  };
+
+  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..4c2d10278e0c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fe25519/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, bitlist
+, buildPythonPackage
+, fetchPypi
+, fountains
+, parts
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "fe25519";
+  version = "1.3.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-/grXAiWERDeTCWgFnNC1Ok8D5I9MBlwd1501TW0yK5c=";
+  };
+
+  propagatedBuildInputs = [
+    bitlist
+    fountains
+    parts
+  ];
+
+  checkInputs = [
+    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..53f2c15401ec
--- /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.0.0";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "6836d456b8b0edbc5b6d3a42d1be852cebd43d2f28af4ff51789eb295f1860e2";
+  };
+
+  postPatch = ''
+    sed -i '/cov/d' setup.cfg
+  '';
+
+  buildInputs = [
+    glibcLocales
+  ];
+
+  LC_ALL = "en_US.UTF-8";
+
+  propagatedBuildInputs = [
+    pytz
+    six
+  ];
+
+  checkInputs = [
+    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..6fb99a918396
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/feedparser/default.nix
@@ -0,0 +1,42 @@
+{ 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;
+    sha256 = "sha256-J9pIX0Y3znFjzeqxOoAxK5O30MG3db70pHYpoxELylE=";
+  };
+
+  propagatedBuildInputs = [
+    sgmllib3k
+  ];
+
+  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..f1ccc5efc84b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fenics/default.nix
@@ -0,0 +1,264 @@
+{ 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 ];
+    checkInputs = [ 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 ];
+    checkInputs = [ 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
+    '';
+    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 ];
+    checkInputs = [ 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
+    ];
+    checkInputs = [ 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";
+      })
+    ];
+    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..08f80d198e4e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ffcv/default.nix
@@ -0,0 +1,54 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, lib
+, libjpeg
+, numba
+, opencv4
+, pandas
+, pkg-config
+, pytorch-pfn-extras
+, terminaltables
+, tqdm
+}:
+
+buildPythonPackage rec {
+  pname = "ffcv";
+  version = "0.0.3";
+
+  src = fetchFromGitHub {
+    owner = "libffcv";
+    repo = pname;
+    # See https://github.com/libffcv/ffcv/issues/158.
+    rev = "131d56235eca3f1497bb84eeaec82c3434ef25d8";
+    sha256 = "0f7q2x48lknnf98mqaa35my05qwvdgv0h8l9lpagdw6yhx0a6p2x";
+  };
+
+  # 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..b5880a21b70e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ffmpeg-progress-yield/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, colorama
+, tqdm
+, pytestCheckHook
+, ffmpeg
+}:
+
+buildPythonPackage rec {
+  pname = "ffmpeg-progress-yield";
+  version = "0.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-/FkVzssJZYafn3MlN8bODd7kA917x9oW0JivIOWxl+8=";
+  };
+
+  propagatedBuildInputs = [ colorama tqdm ];
+
+  checkInputs = [ pytestCheckHook ffmpeg ];
+
+  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";
+    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..f514cf325371
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ffmpeg-python/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, ffmpeg
+, 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
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    pytest-mock
+  ];
+
+  patches = [
+    (substituteAll {
+      src = ./ffmpeg-location.patch;
+      inherit ffmpeg;
+    })
+  ];
+
+  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/fiblary3-fork/default.nix b/nixpkgs/pkgs/development/python-modules/fiblary3-fork/default.nix
new file mode 100644
index 000000000000..e2c53c3e417b
--- /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
+  ];
+
+  checkInputs = [
+    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..129d18639234
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fido2/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, six
+, cryptography
+, mock
+, pyfakefs
+}:
+
+buildPythonPackage rec {
+  pname = "fido2";
+  version = "1.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-JQmklYtmbXR/1XVN+pNX2i2BtS7cDs/3W2jOqTkVTAI=";
+  };
+
+  propagatedBuildInputs = [ six cryptography ];
+
+  checkInputs = [ mock pyfakefs ];
+
+  # Testing with `python setup.py test` doesn't work:
+  # https://github.com/Yubico/python-fido2/issues/108#issuecomment-763513576
+  checkPhase = ''
+    runHook preCheck
+
+    python -m unittest discover -v
+
+    runHook postCheck
+  '';
+
+  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";
+    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..35bf686b4353
--- /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;
+    sha256 = "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..80150a60de91
--- /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 = "2.0.0";
+
+  src = fetchPypi {
+    pname = "file_read_backwards";
+    inherit version;
+    sha256 = "fd50d9089b412147ea3c6027e2ad905f977002db2918cf315d64eed23d6d6eb8";
+  };
+
+  checkInputs = [ 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..2480c196881a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/filecheck/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonApplication
+, fetchFromGitHub
+, poetry
+}:
+
+buildPythonApplication rec {
+  pname = "filecheck";
+  version = "0.0.22";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "mull-project";
+    repo = "FileCheck.py";
+    rev = "v${version}";
+    sha256 = "sha256-I2SypKkgcVuLyLiwNw5oWDb9qT56TbC6vbui8PEcziI=";
+  };
+
+  nativeBuildInputs = [ poetry ];
+
+  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/filelock/default.nix b/nixpkgs/pkgs/development/python-modules/filelock/default.nix
new file mode 100644
index 000000000000..5fdbd8c441fe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/filelock/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "filelock";
+  version = "3.7.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Og/YUWatnbq1TJrslnN7dEEG3F8VwLCaZ0SkRSmfzwQ=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    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/filemagic/default.nix b/nixpkgs/pkgs/development/python-modules/filemagic/default.nix
new file mode 100644
index 000000000000..96ee0a95b283
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/filemagic/default.nix
@@ -0,0 +1,30 @@
+{ stdenv, lib, buildPythonPackage, fetchFromGitHub, file
+, isPy3k, mock, unittest2 }:
+
+buildPythonPackage {
+  pname = "filemagic";
+  version = "1.6";
+  disabled = !isPy3k; # asserts on ResourceWarning
+
+  # Don't use the PyPI source because it's missing files required for testing
+  src = fetchFromGitHub {
+    owner = "aliles";
+    repo = "filemagic";
+    rev = "138649062f769fb10c256e454a3e94ecfbf3017b";
+    sha256 = "1jxf928jjl2v6zv8kdnfqvywdwql1zqkm1v5xn1d5w0qjcg38d4n";
+  };
+
+  postPatch = ''
+    substituteInPlace magic/api.py --replace "ctypes.util.find_library('magic')" \
+      "'${file}/lib/libmagic${stdenv.hostPlatform.extensions.sharedLibrary}'"
+  '';
+
+  checkInputs = [ mock ] ++ lib.optionals (!isPy3k) [ unittest2 ];
+
+  meta = with lib; {
+    description = "File type identification using libmagic";
+    homepage = "https://github.com/aliles/filemagic";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ erikarvstedt ];
+  };
+}
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..0feaa5595f90
--- /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.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-r+SgAClgH2bSObcmiAZcx8IZ3sHJJ5lPkLgl6eU9j5M=";
+  };
+
+  checkInputs = [
+    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..9740117b9b92
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/filterpy/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, numpy
+, scipy
+, matplotlib
+, pytest
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  version = "1.4.5";
+  pname = "filterpy";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "4f2a4d39e4ea601b9ab42b2db08b5918a9538c168cff1c6895ae26646f3d73b1";
+  };
+
+  checkInputs = [ pytest ];
+  propagatedBuildInputs = [ numpy scipy matplotlib ];
+
+  # single test fails (even on master branch of repository)
+  # project does not use CI
+  checkPhase = ''
+    pytest --ignore=filterpy/common/tests/test_discretization.py
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/rlabbe/filterpy";
+    description = "Kalman filtering and optimal estimation library";
+    license = licenses.mit;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..379ed954dae0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/finalfusion/default.nix
@@ -0,0 +1,56 @@
+{ 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
+  ];
+
+  checkInputs = [
+    pytest
+  ];
+
+  postPatch = ''
+    patchShebangs tests/integration
+  '';
+
+  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/findimports/default.nix b/nixpkgs/pkgs/development/python-modules/findimports/default.nix
new file mode 100644
index 000000000000..44f1a29a8f2f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/findimports/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, python
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "findimports";
+  version = "2.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "mgedmin";
+    repo = pname;
+    rev = version;
+    hash = "sha256-p13GVDXDOzOiTnRgtF7UxN1vwZRMa7wVEXJQrFQV7RU=";
+  };
+
+  pythonImportsCheck = [
+    "findimports"
+  ];
+
+  checkPhase = ''
+    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";
+    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..e1d0850c9a6f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/findpython/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+
+# build time
+, pdm-pep517
+
+# runtime
+, packaging
+
+# tests
+, pytestCheckHook
+}:
+
+let
+  pname = "findpython";
+  version = "0.2.1";
+in
+buildPythonPackage {
+  inherit pname version;
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Q5Shy828+NEOo0OeLYCGsuwHRQcJe25tvuGAKMblKwg=";
+  };
+
+  nativeBuildInputs = [
+    pdm-pep517
+  ];
+
+  propagatedBuildInputs = [
+    packaging
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "findpython"
+  ];
+
+  meta = with lib; {
+    description = "A utility to find python versions on your system";
+    homepage = "https://github.com/frostming/findpython";
+    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..ea68c6fa8d4a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fingerprints/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, normality
+, mypy
+, coverage
+, nose
+}:
+buildPythonPackage rec {
+  pname = "fingerprints";
+  version = "1.0.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "cafd5f92b5b91e4ce34af2b954da9c05b448a4778947785abb19a14f363352d0";
+  };
+
+  propagatedBuildInputs = [
+    normality
+  ];
+
+  checkInputs = [
+    mypy
+    coverage
+    nose
+  ];
+
+  checkPhase = ''
+    nosetests
+  '';
+
+  pythonImportsCheck = [
+    "fingerprints"
+  ];
+
+  meta = with lib; {
+    description = "A library to generate entity fingerprints";
+    homepage = "https://github.com/alephdata/fingerprints";
+    license = licenses.mit;
+    maintainers = teams.determinatesystems.members;
+  };
+}
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..eb4115914e10
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/finitude/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, prometheus-client
+, pyserial
+, pythonOlder
+, pyyaml
+}:
+
+buildPythonPackage rec {
+  pname = "finitude";
+  version = "0.1.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "dulitz";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-yCI5UCRDhw+dJoTKyjmHbAGBm3by2AyxHKlqCywnLcs=";
+  };
+
+  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..13f20fbd49d6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fints/default.nix
@@ -0,0 +1,32 @@
+{ lib, buildPythonPackage, fetchFromGitHub, isPy27
+, bleach
+, mt-940
+, requests
+, sepaxml
+, pytestCheckHook
+, pytest-mock
+}:
+
+buildPythonPackage rec {
+  version = "3.1.0";
+  pname = "fints";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "raphaelm";
+    repo = "python-fints";
+    rev = "v${version}";
+    hash = "sha256-3frJIEZgVnZD2spWYIuEtUt7MVsU/Zj82HOB9fKYQWE=";
+  };
+
+  propagatedBuildInputs = [ requests mt-940 sepaxml bleach ];
+
+  checkInputs = [ 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/fiona/default.nix b/nixpkgs/pkgs/development/python-modules/fiona/default.nix
new file mode 100644
index 000000000000..3cd8eef93277
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fiona/default.nix
@@ -0,0 +1,60 @@
+{ stdenv, lib, buildPythonPackage, fetchPypi, isPy3k, pythonOlder
+, attrs, click, cligj, click-plugins, six, munch, enum34
+, pytestCheckHook, boto3, mock, giflib, pytz
+, gdal, certifi
+}:
+
+buildPythonPackage rec {
+  pname = "fiona";
+  version = "1.8.21";
+
+  src = fetchPypi {
+    pname = "Fiona";
+    inherit version;
+    sha256 = "sha256-Og7coqegcNtAXXEYchSkPSMzpXtAl1RKP8woIGali/w=";
+  };
+
+  CXXFLAGS = lib.optionalString stdenv.cc.isClang "-std=c++11";
+
+  nativeBuildInputs = [
+    gdal # for gdal-config
+  ];
+
+  buildInputs = [
+    gdal
+  ] ++ lib.optionals stdenv.cc.isClang [ giflib ];
+
+  propagatedBuildInputs = [
+    attrs
+    certifi
+    click
+    cligj
+    click-plugins
+    six
+    munch
+    pytz
+  ] ++ lib.optional (!isPy3k) enum34;
+
+  checkInputs = [
+    pytestCheckHook
+    boto3
+  ] ++ lib.optional (pythonOlder "3.4") mock;
+
+  preCheck = ''
+    rm -r fiona # prevent importing local fiona
+    # disable gdal deprecation warnings
+    export GDAL_ENABLE_DEPRECATED_DRIVER_GTM=YES
+  '';
+
+  disabledTests = [
+    # Some tests access network, others test packaging
+    "http" "https" "wheel"
+  ];
+
+  meta = with lib; {
+    description = "OGR's neat, nimble, no-nonsense API for Python";
+    homepage = "https://fiona.readthedocs.io/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ knedlsepp ];
+  };
+}
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..7e08fa87fd58
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fipy/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, numpy
+, scipy
+, pyamg
+, future
+, matplotlib
+, tkinter
+, mpi4py
+, scikit-fmm
+, gmsh
+, python
+, stdenv
+, openssh
+, fetchFromGitHub
+}:
+
+buildPythonPackage rec {
+  pname = "fipy";
+  version = "3.4.3";
+
+  src = fetchFromGitHub {
+    owner = "usnistgov";
+    repo = "fipy";
+    rev = version;
+    sha256 = "sha256-oTg/5fGXqknWBh1ShdAOdOwX7lVDieIoM5aALcOWFqY=";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    scipy
+    pyamg
+    matplotlib
+    tkinter
+    mpi4py
+    future
+    scikit-fmm
+    openssh
+  ] ++ lib.optionals (!stdenv.isDarwin) [ gmsh ];
+
+  checkInputs = 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";
+    license = licenses.free;
+    maintainers = with maintainers; [ costrouc 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..252b180c4e06
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fire/default.nix
@@ -0,0 +1,48 @@
+{ lib, buildPythonPackage, fetchFromGitHub, six, hypothesis, mock
+, python-Levenshtein, pytest, termcolor, isPy27, enum34 }:
+
+buildPythonPackage rec {
+  pname = "fire";
+  version = "0.4.0";
+
+  src = fetchFromGitHub {
+    owner = "google";
+    repo = "python-fire";
+    rev = "v${version}";
+    sha256 = "1caz6j2kdhj0kccrnqri6b4g2d6wzkkx8y9vxyvm7axvrwkv2vyn";
+  };
+
+  propagatedBuildInputs = [ six termcolor ] ++ lib.optional isPy27 enum34;
+
+  checkInputs = [ hypothesis mock python-Levenshtein pytest ];
+
+  # ignore test which asserts exact usage statement, default behavior
+  # changed in python3.8. This can likely be remove >=0.3.1
+  checkPhase = ''
+    py.test -k 'not testInitRequiresFlag'
+  '';
+
+  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.
+    '';
+    license = licenses.asl20;
+    maintainers = with maintainers; [ leenaars ];
+  };
+}
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..491fcd398053
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/first/default.nix
@@ -0,0 +1,20 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "first";
+  version = "2.0.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1gykyrm6zlrbf9iz318p57qwk594mx1jf0d79v79g32zql45na7z";
+  };
+
+  doCheck = false; # no tests
+
+  meta = with lib; {
+    description = "The function you always missed in Python";
+    homepage = "https://github.com/hynek/first/";
+    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..3a1c76776774
--- /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
+  ];
+
+  checkInputs = [
+    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..8605d0f65da0
--- /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
+  ];
+
+  checkInputs = [
+    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..3e9f9943327d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fixtures/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, pythonAtLeast
+, pbr
+, testtools
+, mock
+, python
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "fixtures";
+  version = "3.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "fcf0d60234f1544da717a9738325812de1f42c2fa085e2d9252d8fff5712b2ef";
+  };
+
+  patches = lib.optional (pythonAtLeast "3.9") [
+    # drop tests that try to monkeypatch a classmethod, which fails on python3.9
+    # https://github.com/testing-cabal/fixtures/issues/44
+    (fetchpatch {
+       url = "https://salsa.debian.org/openstack-team/python/python-fixtures/-/raw/debian/victoria/debian/patches/remove-broken-monkey-patch-test.patch";
+       sha256 = "1s3hg2zmqc4shmnf90kscphzj5qlqpxghzw2a59p8f88zrbsj97r";
+    })
+  ];
+
+  nativeBuildInputs = [
+    pbr
+  ];
+
+  propagatedBuildInputs = [
+    testtools
+    six # not in install_requires, but used in fixture.py
+  ];
+
+  checkInputs = [
+    mock
+  ];
+
+  checkPhase = ''
+    ${python.interpreter} -m testtools.run fixtures.test_suite
+  '';
+
+  meta = {
+    description = "Reusable state for writing clean tests and more";
+    homepage = "https://pypi.python.org/pypi/fixtures";
+    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..3e7cccd90fcb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fjaraskupan/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, bleak
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "fjaraskupan";
+  version = "1.0.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "elupus";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-nUrgV4keJpYRkKZE+udvmPdCW3O3YQTS1ye40IdA7vA=";
+  };
+
+  propagatedBuildInputs = [
+    bleak
+  ];
+
+  checkInputs = [
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "fjaraskupan" ];
+
+  meta = with lib; {
+    description = "Python 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..be091e21742d
--- /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 = "22.7.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "PyCQA";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-eG/1BENY93j76ZFlcnariDFkK9yspqgNUxFPdAhBCVA=";
+  };
+
+  propagatedBuildInputs = [
+    attrs
+    flake8
+  ];
+
+  checkInputs = [
+    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..55858a9eaf2c
--- /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
+  ];
+
+  checkInputs = [
+    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..a02d900a7f07
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flake8-docstrings/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, flake8
+, pydocstyle
+}:
+
+buildPythonPackage rec {
+  pname = "flake8-docstrings";
+  version = "1.6.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9fe7c6a306064af8e62a055c2f61e9eb1da55f84bb39caef2b84ce53708ac34b";
+  };
+
+  propagatedBuildInputs = [ flake8 pydocstyle ];
+
+  pythonImportsCheck = [ "flake8_docstrings" ];
+
+  meta = with lib; {
+    description = "Extension for flake8 which uses pydocstyle to check docstrings";
+    homepage = "https://gitlab.com/pycqa/flake8-docstrings";
+    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..699d37770a36
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flake8-future-import/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, isPy27
+, isPy38
+, isPy39
+, pythonAtLeast
+, flake8
+, six
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "flake8-future-import";
+  version = "0.4.6";
+
+  # PyPI tarball doesn't include the test suite
+  src = fetchFromGitHub {
+    owner = "xZise";
+    repo = "flake8-future-import";
+    rev = version;
+    sha256 = "00q8n15xdnvqj454arn7xxksyrzh0dw996kjyy7g9rdk0rf8x82z";
+  };
+
+  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
+  ];
+
+  propagatedBuildInputs = [ flake8 ];
+
+  checkInputs = [ six ];
+
+  checkPhase = ''
+    ${python.interpreter} -m test_flake8_future_import
+  '';
+
+  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..25aa995f9122
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flake8-import-order/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchPypi, isPy3k, enum34, pycodestyle, pytest, flake8, pylama }:
+
+buildPythonPackage rec {
+  pname = "flake8-import-order";
+  version = "0.18.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "14kfvsagqc6lrplvf3x58ia6x744bk8fj91wmk0hcipa8naw73d2";
+  };
+
+  propagatedBuildInputs = [ pycodestyle ] ++ lib.optional (!isPy3k) enum34;
+
+  checkInputs = [ pytest flake8 pycodestyle pylama ];
+
+  checkPhase = ''
+    pytest --strict
+  '';
+
+  meta = with lib; {
+    description = "Flake8 and pylama plugin that checks the ordering of import statements";
+    homepage = "https://github.com/PyCQA/flake8-import-order";
+    license = with licenses; [ lgpl3 mit ];
+  };
+}
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..6f82b8dd50be
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flake8-length/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, flake8
+, pytestCheckHook
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "flake8-length";
+  version = "0.3.0";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "6e3c068005b0b3b5c8345923fe3e9a107c980baa1354dd19d820018f87409427";
+  };
+
+  propagatedBuildInputs = [
+    flake8
+  ];
+
+  pythonImportsCheck = [
+    "flake8_length"
+  ];
+
+  checkInputs = [ pytestCheckHook ];
+
+  pytestFlagsArray = [ "tests/" ];
+
+  meta = {
+    description = "Flake8 plugin for a smart line length validation";
+    homepage = "https://github.com/orsinium-labs/flake8-length";
+    license = lib.licenses.mit;
+    maintainers = with lib.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..60ee3558d1d4
--- /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
+  ];
+
+  checkInputs = [
+    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..d2827d7f2194
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flake8/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, mccabe
+, pycodestyle
+, pyflakes
+, importlib-metadata
+, pythonAtLeast
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "flake8";
+  version = "5.0.4";
+
+  disabled = pythonOlder "3.6";
+
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "PyCQA";
+    repo = "flake8";
+    rev = version;
+    hash = "sha256-Os8HIoM07/iOBMm+0WxdQj32pJJOJ8mkh+yLHpqkLXg=";
+  };
+
+  propagatedBuildInputs = [
+    mccabe
+    pycodestyle
+    pyflakes
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  # Tests fail on Python 3.7 due to importlib using a deprecated interface
+  doCheck = pythonAtLeast "3.7";
+
+  checkInputs = [
+    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 ];
+  };
+}
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..fe068211dfbf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flaky/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, mock
+, nose
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "flaky";
+  version = "3.7.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3ad100780721a1911f57a165809b7ea265a7863305acb66708220820caf8aa0d";
+  };
+
+  checkInputs = [ mock nose 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
+    nosetests --with-flaky --force-flaky --max-runs 2 test/test_nose/test_nose_options_example.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..047f2849d046
--- /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}";
+    sha256 = "sha256-oyiuhsYouGDKRssKc0aYIoG32H7GS6Bn4RtI7/9N158=";
+  };
+
+  checkInputs = [
+    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..eabfd1ad6fab
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flammkuchen/default.nix
@@ -0,0 +1,36 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27
+, numpy
+, scipy
+, tables
+, pandas
+, nose
+, configparser
+}:
+
+buildPythonPackage rec {
+  pname = "flammkuchen";
+  version = "1.0.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-KtMGQftoYVNNMtfYeYiaQyMLAySpf9YXLMxj+e/CV5I=";
+  };
+
+  checkInputs = [
+    nose
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    scipy
+    tables
+    pandas
+  ] ++ lib.optionals isPy27 [ configparser ];
+
+  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/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..a3bc87c8d086
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-admin/default.nix
@@ -0,0 +1,92 @@
+{ lib
+, arrow
+, buildPythonPackage
+, colour
+, email-validator
+, enum34
+, fetchPypi
+, flask
+, flask-sqlalchemy
+, flask-babelex
+, flask-mongoengine
+, geoalchemy2
+, isPy27
+, mongoengine
+, pillow
+, psycopg2
+, pymongo
+, pytestCheckHook
+, shapely
+, sqlalchemy
+, sqlalchemy-citext
+, sqlalchemy-utils
+, wtf-peewee
+, wtforms
+}:
+
+buildPythonPackage rec {
+  pname = "flask-admin";
+  version = "1.6.0";
+  format = "setuptools";
+
+  src = fetchPypi {
+    pname = "Flask-Admin";
+    inherit version;
+    sha256 = "1209qhm51d4z66mbw55cmkzqvr465shnws2m2l2zzpxhnxwzqks2";
+  };
+
+  propagatedBuildInputs = [
+    flask
+    wtforms
+  ] ++ lib.optionals isPy27 [
+    enum34
+  ];
+
+  checkInputs = [
+    arrow
+    colour
+    email-validator
+    flask-sqlalchemy
+    flask-babelex
+    flask-mongoengine
+    geoalchemy2
+    mongoengine
+    pillow
+    psycopg2
+    pymongo
+    pytestCheckHook
+    shapely
+    sqlalchemy
+    sqlalchemy-citext
+    sqlalchemy-utils
+    wtf-peewee
+  ];
+
+  disabledTests = [
+    # Incompatible with werkzeug 2.1
+    "test_mockview"
+  ];
+
+  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"
+  ];
+
+  pythonImportsCheck = [
+    "flask_admin"
+  ];
+
+  meta = with lib; {
+    description = "Simple and extensible admin interface framework for Flask";
+    homepage = "https://github.com/flask-admin/flask-admin/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ costrouc ];
+  };
+}
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..841b11a1a831
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-api/default.nix
@@ -0,0 +1,22 @@
+{ lib, buildPythonPackage, pythonOlder, fetchPypi, flask, markdown }:
+
+buildPythonPackage rec {
+  pname = "Flask-API";
+  version = "3.0.post1";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1khw0f9ywn1mbdlcl0xspacqjz2pxq00m4g73bksbc1k0i88j61k";
+  };
+
+  propagatedBuildInputs = [ flask markdown ];
+
+  meta = with lib; {
+    homepage = "https://github.com/miracle2k/flask-assets";
+    description = "Browsable web APIs for Flask";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ ];
+  };
+}
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..2ef78ecf8d45
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-appbuilder/default.nix
@@ -0,0 +1,100 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, apispec
+, colorama
+, click
+, email-validator
+, flask
+, flask-babel
+, 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.1.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "Flask-AppBuilder";
+    inherit version;
+    hash = "sha256-8NaTr0RcnsVik/AB4g8QL+FkcRlgkkASFe8fXIvFt/A=";
+  };
+
+  patches = [
+    (fetchpatch {
+      # https://github.com/dpgaspar/Flask-AppBuilder/pull/1734
+      name = "flask-appbuilder-wtf3.patch";
+      url = "https://github.com/dpgaspar/Flask-AppBuilder/commit/bccb3d719cd3ceb872fe74a9ab304d74664fbf43.patch";
+      hash = "sha256-24mlS3HIs77wKOlwdHah5oks31OOmCBHmcafZT2ITOc=";
+      excludes = [
+        "requirements.txt"
+        "setup.py"
+        "examples/employees/app/views.py"
+      ];
+    })
+  ];
+
+  propagatedBuildInputs = [
+    apispec
+    colorama
+    click
+    email-validator
+    flask
+    flask-babel
+    flask_login
+    flask-openid
+    flask-sqlalchemy
+    flask-wtf
+    flask-jwt-extended
+    jsonschema
+    marshmallow
+    marshmallow-enum
+    marshmallow-sqlalchemy
+    python-dateutil
+    prison
+    pyjwt
+    pyyaml
+    sqlalchemy-utils
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "apispec[yaml]>=3.3, <4" "apispec[yaml] >=3.3" \
+      --replace "Flask-WTF>=0.14.2, <1.0.0" "Flask-WTF" \
+      --replace "WTForms<3.0.0" "WTForms" \
+      --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/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ costrouc ];
+  };
+}
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..390657e9c823
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-assets/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchPypi, flask, webassets, flask_script, nose }:
+
+buildPythonPackage rec {
+  pname = "Flask-Assets";
+  version = "2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1dfdea35e40744d46aada72831f7613d67bf38e8b20ccaaa9e91fdc37aa3b8c2";
+  };
+
+  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..fff8859e86e0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-autoindex/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, flask
+, flask-silk
+, future
+, pathlib
+}:
+
+buildPythonPackage rec {
+  pname = "Flask-AutoIndex";
+  version = "0.6.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ea319f7ccadf68ddf98d940002066278c779323644f9944b300066d50e2effc7";
+  };
+
+  propagatedBuildInputs = [
+    flask
+    flask-silk
+    future
+  ] ++ lib.optionals (pythonOlder "3.4") [
+    pathlib
+  ];
+
+  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!
+    '';
+    license = licenses.bsd2;
+    maintainers = teams.sage.members;
+    homepage = "https://pythonhosted.org/Flask-AutoIndex/";
+  };
+}
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..a538327650b2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-babel/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, python
+, fetchPypi
+, flask
+, babel
+, jinja2
+, pytz
+, speaklater
+}:
+
+buildPythonPackage rec {
+  pname = "Flask-Babel";
+  version = "2.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f9faf45cdb2e1a32ea2ec14403587d4295108f35017a7821a2b1acb8cfd9257d";
+  };
+
+  propagatedBuildInputs = [
+    flask
+    babel
+    jinja2
+    pytz
+    speaklater
+  ];
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest discover -s tests
+  '';
+
+  meta = with lib; {
+    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;
+    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..4a7294540e12
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-babelex/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, flask
+, babel
+, speaklater
+, jinja2
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "flask-babelex";
+  version = "0.9.4";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "Flask-BabelEx";
+    sha256 = "09yfr8hlwvpgvq8kp1y7qbnnl0q28hi0348bv199ssiqx779r99r";
+  };
+
+  propagatedBuildInputs = [
+    flask
+    babel
+    speaklater
+    jinja2
+  ];
+
+  checkInputs = [
+    pytest
+  ];
+
+  checkPhase = ''
+    # 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"
+
+    pytest tests/tests.py -k "not test_init_app \
+                              and not test_custom_locale_selector \
+                              and not test_basics"
+  '';
+
+  meta = with lib; {
+    description = "Adds i18n/l10n support to Flask applications";
+    homepage = "https://github.com/mrjoes/flask-babelex";
+    license = licenses.bsd3;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..1c09b6d809c4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-bcrypt/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, flask
+, bcrypt
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "flask-bcrypt";
+  version = "1.0.1";
+
+  src = fetchFromGitHub {
+    owner = "maxcountryman";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-WlIholi/nzq6Ikc0LS6FhG0Q5Kz0kvvAlA2YJ7EksZ4=";
+  };
+
+  propagatedBuildInputs = [
+    flask
+    bcrypt
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+    ${python.interpreter} -m unittest discover
+    runHook postCheck
+  '';
+
+  pythonImportsCheck = [
+    "flask_bcrypt"
+  ];
+
+  meta = with lib; {
+    description = "Brcrypt hashing for Flask";
+    homepage = "https://github.com/maxcountryman/flask-bcrypt";
+    license = licenses.bsd3;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..a75e1b4a435c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-caching/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, cachelib
+, flask
+, pytest-asyncio
+, pytest-xprocess
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "Flask-Caching";
+  version = "2.0.1";
+  format = "setuptools";
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-EN8gCgPwMq9gB3vv5Bd53ZSJi2fIIEDTTochC3G6Jjg=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "Flask <= 2.1.2" "Flask <= 2.2"
+  '';
+
+  propagatedBuildInputs = [
+    cachelib
+    flask
+  ];
+
+  checkInputs = [
+    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"
+  ];
+
+  meta = with lib; {
+    description = "Adds caching support to your Flask application";
+    homepage = "https://github.com/sh4nks/flask-caching";
+    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..2825e41a0813
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-compress/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, setuptools-scm
+, flask
+, brotli
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  version = "1.12";
+  pname = "Flask-Compress";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-4hWUmfOdYYpNVroEhOe1i1eVa5osbTUQ8JX1uxS3r8U=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    flask
+    brotli
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "flask_compress"
+  ];
+
+  meta = with lib; {
+    description = "Compress responses in your Flask app with gzip";
+    homepage = "https://github.com/colour-science/flask-compress";
+    changelog = "https://github.com/colour-science/flask-compress/blob/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+  };
+}
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..25c054b231bb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-cors/default.nix
@@ -0,0 +1,27 @@
+{ lib, fetchPypi, buildPythonPackage
+, nose, flask, six, packaging }:
+
+buildPythonPackage rec {
+  pname = "Flask-Cors";
+  version = "3.0.10";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b60839393f3b84a0f3746f6cdca56c1ad7426aa738b70d6c61375857823181de";
+  };
+
+  checkInputs = [ nose packaging ];
+  propagatedBuildInputs = [ flask six ];
+
+  # Exclude test_acl_uncaught_exception_500 test case because is not compatible
+  # with Flask>=1.1.0. See: https://github.com/corydolphin/flask-cors/issues/253
+  checkPhase = ''
+    nosetests --exclude test_acl_uncaught_exception_500
+  '';
+
+  meta = with lib; {
+    description = "A Flask extension adding a decorator for CORS support";
+    homepage = "https://github.com/corydolphin/flask-cors";
+    license = with licenses; [ mit ];
+  };
+}
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..3a9daa577d4d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-elastic/default.nix
@@ -0,0 +1,22 @@
+{ lib, buildPythonPackage, fetchPypi
+, flask, elasticsearch }:
+
+buildPythonPackage rec {
+  pname = "Flask-Elastic";
+  version = "0.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0hqkwff6z78aspkf1cf815qwp02g3ch1y9dhm5v2ap8vakyac0az";
+  };
+
+  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-gravatar/default.nix b/nixpkgs/pkgs/development/python-modules/flask-gravatar/default.nix
new file mode 100644
index 000000000000..c0bbf7d01467
--- /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
+  ];
+
+  checkInputs = [
+    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..9c57881f4b2b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-httpauth/default.nix
@@ -0,0 +1,27 @@
+{ lib, python, buildPythonPackage, fetchPypi, pytestCheckHook, flask }:
+
+buildPythonPackage rec {
+  pname = "flask-httpauth";
+  version = "4.7.0";
+
+  disabled = python.pythonOlder "3";
+
+  src = fetchPypi {
+    pname = "Flask-HTTPAuth";
+    version = version;
+    sha256 = "sha256-9xmee60g1baLPwtivd/KdjfFUIfp0C9gWuJuDeR5/ZQ=";
+  };
+
+  checkInputs = [ pytestCheckHook ];
+
+  propagatedBuildInputs = [ flask ];
+
+  pythonImportsCheck = [ "flask_httpauth" ];
+
+  meta = with lib; {
+    description = "Extension that provides HTTP authentication for Flask routes";
+    homepage = "https://github.com/miguelgrinberg/Flask-HTTPAuth";
+    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..3764cc36cb0f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-jwt-extended/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, flask
+, pyjwt
+, pytestCheckHook
+, python-dateutil
+, pythonOlder
+, werkzeug
+}:
+
+buildPythonPackage rec {
+  pname = "flask-jwt-extended";
+  version = "4.4.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "Flask-JWT-Extended";
+    inherit version;
+    hash = "sha256-YrUh11SUwpCmRq6KzHcSNyHkNkeQ8eZK8AONgjlh+/A=";
+  };
+
+  propagatedBuildInputs = [
+    flask
+    pyjwt
+    python-dateutil
+    werkzeug
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "flask_jwt_extended"
+  ];
+
+  meta = with lib; {
+    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..c593c855c70f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-limiter/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, flask
+, flask-restful
+, hiro
+, limits
+, mock
+, pymemcache
+, pytestCheckHook
+, redis
+}:
+
+buildPythonPackage rec {
+  pname = "Flask-Limiter";
+  version = "1.4";
+
+  src = fetchFromGitHub {
+    owner = "alisaifee";
+    repo = "flask-limiter";
+    rev = version;
+    sha256 = "1k1b4b3s1acphqnar0y5g747bh1y7w35gcl5g819idq2a5vqnass";
+  };
+
+  propagatedBuildInputs = [ flask limits ];
+
+  checkInputs = [
+    pytestCheckHook
+    hiro
+    mock
+    redis
+    flask-restful
+    pymemcache
+  ];
+
+  postPatch = ''
+    sed -i "/--cov/d" pytest.ini
+  '';
+
+  # Some tests requires a local Redis instance
+  disabledTests = [
+    "test_fallback_to_memory"
+    "test_reset_unsupported"
+    "test_constructor_arguments_over_config"
+    "test_fallback_to_memory_config"
+    "test_fallback_to_memory_backoff_check"
+    "test_fallback_to_memory_with_global_override"
+    "test_custom_key_prefix"
+    "test_redis_request_slower_than_fixed_window"
+    "test_redis_request_slower_than_moving_window"
+    "test_custom_key_prefix_with_headers"
+  ];
+
+  pythonImportsCheck = [ "flask_limiter" ];
+
+  meta = with lib; {
+    description = "Rate limiting for flask applications";
+    homepage = "https://flask-limiter.readthedocs.org/";
+    license = licenses.mit;
+  };
+}
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..cd5bab252cc8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-login/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, blinker
+, buildPythonPackage
+, fetchPypi
+, flask
+, pytestCheckHook
+, pythonAtLeast
+, pythonOlder
+, semantic-version
+, werkzeug
+}:
+
+buildPythonPackage rec {
+  pname = "flask-login";
+  version = "0.6.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    pname = "Flask-Login";
+    inherit version;
+    sha256 = "sha256-EwbUdKJwoDbW/RT0VkDE13NV5PHGfKQzGzctNEiZe4w=";
+  };
+
+  propagatedBuildInputs = [
+    flask
+    werkzeug
+  ];
+
+  checkInputs = [
+    blinker
+    pytestCheckHook
+    semantic-version
+  ];
+
+  disabledTests = lib.optionals (pythonAtLeast "3.10") [
+    "test_hashable"
+  ];
+
+  pythonImportsCheck = [
+    "flask_login"
+  ];
+
+  meta = with lib; {
+    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..a1732d3ccbfe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-mail/default.nix
@@ -0,0 +1,24 @@
+{ 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 {
+    inherit pname version;
+    sha256 = "0hazjc351s3gfbhk975j8k65cg4gf31yq404yfy0gx0bjjdfpr92";
+  };
+
+  propagatedBuildInputs = [ blinker flask ];
+  buildInputs = [ blinker mock nose speaklater ];
+
+  doCheck = false;
+}
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..710c35bc8b4e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-marshmallow/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildPythonPackage, fetchPypi,
+  flask, six, marshmallow
+}:
+
+buildPythonPackage rec {
+  pname = "flask-marshmallow";
+  version = "0.14.0";
+
+  meta = {
+    homepage = "https://github.com/marshmallow-code/flask-marshmallow";
+    description = "Flask + marshmallow for beautiful APIs";
+    license = lib.licenses.mit;
+  };
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "bd01a6372cbe50e36f205cfff0fc5dab0b7b662c4c8b2c4fc06a3151b2950950";
+  };
+
+  propagatedBuildInputs = [ flask marshmallow ];
+  buildInputs = [ six ];
+
+  doCheck = false;
+}
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..04532032038f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-migrate/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, isPy27
+, alembic
+, flask
+, flask_script
+, flask-sqlalchemy
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "Flask-Migrate";
+  version = "3.1.0";
+  format = "setuptools";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "miguelgrinberg";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0zj7qpknvlhrh4fsp5sx4fwyx3sp41ynclka992zympm3xym9zyq";
+  };
+
+  propagatedBuildInputs = [
+    alembic
+    flask
+    flask-sqlalchemy
+  ];
+
+  pythonImportsCheck = [
+    "flask_migrate"
+  ];
+
+  checkInputs = [
+    flask_script
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+    ${python.interpreter} -m unittest discover
+    runHook postCheck
+  '';
+
+  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; [ ];
+  };
+}
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..e411d1f55a78
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-mongoengine/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, flask
+, flask-wtf
+, mongoengine
+, six
+, nose
+, rednose
+, coverage
+, email-validator
+}:
+
+buildPythonPackage rec {
+  pname = "flask-mongoengine";
+  version = "1.0.0";
+
+  src = fetchFromGitHub {
+    owner = "MongoEngine";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "10g9b13ls2msnhv8j44gslrfxa2ppqz2y1xjn2a4gg4m9mdjv8b2";
+  };
+
+  propagatedBuildInputs = [
+    email-validator
+    flask
+    flask-wtf
+    mongoengine
+    six
+  ];
+
+  # they set test requirements to setup_requirements...
+  buildInputs = [
+    nose
+    rednose
+    coverage
+  ];
+
+  # tests require working mongodb connection
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Flask-MongoEngine is a Flask extension that provides integration with MongoEngine and WTF model forms";
+    homepage = "https://github.com/mongoengine/flask-mongoengine";
+    license = licenses.bsd3;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..4ae75839dc9a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-openid/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, flask
+, python3-openid
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "flask-openid";
+  version = "1.3.0";
+  disable = !isPy3k;
+
+  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 = [ maintainers.costrouc ];
+  };
+}
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..d73ad8d35c0d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-paginate/default.nix
@@ -0,0 +1,20 @@
+{ lib, buildPythonPackage, fetchPypi, flask }:
+
+buildPythonPackage rec {
+  pname = "flask-paginate";
+  version = "2022.1.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a32996ec07ca004c45b768b0d50829728ab8f3986c0650ef538e42852c7aeba2";
+  };
+
+  propagatedBuildInputs = [ flask ];
+
+  meta = with lib; {
+    homepage = "https://github.com/lixxu/flask-paginate";
+    description = "Pagination support for Flask";
+    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..8de346593efb
--- /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}";
+    sha256 = "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
+  ];
+
+  checkInputs = [
+    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..f3164aa1f08e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-principal/default.nix
@@ -0,0 +1,22 @@
+{ lib, buildPythonPackage, fetchPypi, flask, blinker, nose }:
+
+buildPythonPackage rec {
+  pname = "Flask-Principal";
+  version = "0.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0lwlr5smz8vfm5h9a9i7da3q1c24xqc6vm9jdywdpgxfbi5i7mpm";
+  };
+
+  propagatedBuildInputs = [ flask blinker ];
+
+  checkInputs = [ 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..cefedfe7fc37
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-restful/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, aniso8601
+, blinker
+, buildPythonPackage
+, fetchPypi
+, flask
+, mock
+, nose
+, pytestCheckHook
+, pythonOlder
+, pytz
+, six
+, werkzeug
+}:
+
+buildPythonPackage rec {
+  pname = "flask-restful";
+  version = "0.3.9";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "Flask-RESTful";
+    inherit version;
+    hash = "sha256-zOxlC4NdSBkhOMhTKa4Dc15s7VjpstnCFG1shMBvpT4=";
+  };
+
+  patches = lib.optionals (lib.versionAtLeast werkzeug.version "2.1.0") [
+    ./werkzeug-2.1.0-compat.patch
+  ];
+
+  propagatedBuildInputs = [
+    aniso8601
+    flask
+    pytz
+    six
+  ];
+
+  checkInputs = [
+    blinker
+    mock
+    nose
+    pytestCheckHook
+  ];
+
+  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-restplus/default.nix b/nixpkgs/pkgs/development/python-modules/flask-restplus/default.nix
new file mode 100644
index 000000000000..3de74531c288
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-restplus/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nose
+, blinker
+, tzlocal
+, mock
+, rednose
+, flask
+, six
+, jsonschema
+, pytz
+, aniso8601
+, flask-restful
+, isPy27
+, enum34
+}:
+
+buildPythonPackage rec {
+  pname = "flask-restplus";
+  version = "0.13.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0p4zz8b5bwbw7w0vhbyihl99d2gw13cb81rxzj4z626a1cnl8vm6";
+  };
+
+  checkInputs = [ nose blinker tzlocal mock rednose ];
+  propagatedBuildInputs = [ flask six jsonschema pytz aniso8601 flask-restful ]
+   ++ lib.optional isPy27 enum34;
+
+  # RuntimeError: Working outside of application context.
+  doCheck = false;
+
+  checkPhase = ''
+    nosetests
+  '';
+
+  meta = {
+    homepage = "https://github.com/noirbizarre/flask-restplus";
+    description = "Fast, easy and documented API development with Flask";
+    license = lib.licenses.mit;
+  };
+}
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..4b88ab564507
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-restx/default.nix
@@ -0,0 +1,81 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, aniso8601
+, jsonschema
+, flask
+, werkzeug
+, pytz
+, faker
+, six
+, mock
+, blinker
+, pytest-flask
+, pytest-mock
+, pytest-benchmark
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "flask-restx";
+  version = "0.5.1";
+
+  # Tests not included in PyPI tarball
+  src = fetchFromGitHub {
+    owner = "python-restx";
+    repo = pname;
+    rev = version;
+    sha256 = "18vrmknyxw6adn62pz3kr9kvazfgjgl4pgimdf8527fyyiwcqy15";
+  };
+
+  patches = [
+    # Fixes werkzeug 2.1 compatibility
+    (fetchpatch {
+      # https://github.com/python-restx/flask-restx/pull/427
+      url = "https://github.com/python-restx/flask-restx/commit/bb72a51860ea8a42c928f69bdd44ad20b1f9ee7e.patch";
+      hash = "sha256-DRH3lI6TV1m0Dq1VyscL7GQS26OOra9g88dXZNrNpmQ=";
+    })
+    (fetchpatch {
+      # https://github.com/python-restx/flask-restx/pull/427
+      url = "https://github.com/python-restx/flask-restx/commit/bb3e9dd83b9d4c0d0fa0de7d7ff713fae71eccee.patch";
+      hash = "sha256-HJpjG4aQWzEPCMfbXfkw4mz5TH9d89BCvGH2dE6Jfv0=";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    aniso8601
+    flask
+    jsonschema
+    pytz
+    six
+    werkzeug
+  ];
+
+  checkInputs = [
+    blinker
+    faker
+    mock
+    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"
+  ];
+
+  pythonImportsCheck = [ "flask_restx" ];
+
+  meta = with lib; {
+    homepage = "https://flask-restx.readthedocs.io/en/${version}/";
+    description = "Fully featured framework for fast, easy and documented API development with Flask";
+    changelog = "https://github.com/python-restx/flask-restx/raw/${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..18e483292885
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-reverse-proxy-fix/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, isPy3k
+, flask
+, werkzeug
+}:
+
+buildPythonPackage rec {
+  pname = "flask-reverse-proxy-fix";
+  version = "0.2.1";
+
+  # 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}";
+    sha256 = "1jbr67cmnryn0igv05qkvqjwrwj2rsajvvjnv3cdkm9bkgb4h5k5";
+  };
+
+  disabled = !isPy3k;
+
+  postPatch = ''
+    sed -i 's@werkzeug.contrib.fixers@werkzeug.middleware.proxy_fix@g' flask_reverse_proxy_fix/middleware/__init__.py
+  '';
+
+  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..9acc55166a86
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-script/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildPythonPackage, fetchPypi, flask, pytest }:
+
+buildPythonPackage rec {
+  pname = "Flask-Script";
+  version = "2.0.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0r8w2v89nj6b9p91p495cga5m72a673l2wc0hp0zqk05j4yrc9b4";
+  };
+
+  propagatedBuildInputs = [ flask ];
+  checkInputs = [ 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..6d09d7ec45c6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-seasurf/default.nix
@@ -0,0 +1,35 @@
+{ lib, fetchFromGitHub, buildPythonPackage, isPy3k, flask, mock, python }:
+
+buildPythonPackage rec {
+  pname = "Flask-SeaSurf";
+  version = "1.1.1";
+  disabled = !isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "maxcountryman";
+    repo = "flask-seasurf";
+    rev = version;
+    sha256 = "sha256-L/ZUEqqHmsyXG5eShcITII36ttwQlZN5GBngo+GcCdw=";
+  };
+
+  propagatedBuildInputs = [ flask ];
+
+  checkInputs = [
+    mock
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+    ${python.interpreter} -m unittest discover
+    runHook postCheck
+  '';
+
+  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..7af6ea692cae
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-security-too/default.nix
@@ -0,0 +1,112 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+
+# extras: babel
+, babel
+, flask-babel
+
+# extras: common
+, bcrypt
+, bleach
+, flask_mail
+
+# extras: fsqla
+, flask-sqlalchemy
+, sqlalchemy
+, sqlalchemy-utils
+
+# extras: mfa
+, cryptography
+, phonenumbers
+, pyqrcode
+
+# propagates
+, blinker
+, email-validator
+, flask
+, flask_login
+, flask_principal
+, flask-wtf
+, itsdangerous
+, passlib
+
+# tests
+, argon2-cffi
+, flask-mongoengine
+, mongoengine
+, mongomock
+, peewee
+, pony
+, pytestCheckHook
+, zxcvbn
+}:
+
+buildPythonPackage rec {
+  pname = "flask-security-too";
+  version = "4.1.5";
+
+  src = fetchPypi {
+    pname = "Flask-Security-Too";
+    inherit version;
+    sha256 = "sha256-98jKcHDv/+mls7QVWeGvGcmoYOGCspxM7w5/2RjJxoM=";
+  };
+
+  propagatedBuildInputs = [
+    blinker
+    email-validator
+    flask
+    flask_login
+    flask_principal
+    flask-wtf
+    itsdangerous
+    passlib
+  ];
+
+  passthru.optional-dependencies = {
+    babel = [
+      babel
+      flask-babel
+    ];
+    common = [
+      bcrypt
+      bleach
+      flask_mail
+    ];
+    fsqla = [
+      flask-sqlalchemy
+      sqlalchemy
+      sqlalchemy-utils
+    ];
+    mfa = [
+      cryptography
+      phonenumbers
+      pyqrcode
+    ];
+  };
+
+  checkInputs = [
+    argon2-cffi
+    flask-mongoengine
+    mongoengine
+    mongomock
+    peewee
+    pony
+    pytestCheckHook
+    zxcvbn
+  ]
+  ++ passthru.optional-dependencies.babel
+  ++ passthru.optional-dependencies.common
+  ++ passthru.optional-dependencies.fsqla
+  ++ passthru.optional-dependencies.mfa;
+
+
+  pythonImportsCheck = [ "flask_security" ];
+
+  meta = with lib; {
+    homepage = "https://pypi.org/project/Flask-Security-Too/";
+    description = "Simple security for Flask apps (fork)";
+    license = licenses.mit;
+    maintainers = with maintainers; [ gador ];
+  };
+}
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..a9433fe0b871
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-session/default.nix
@@ -0,0 +1,27 @@
+{ lib, fetchPypi, buildPythonPackage, pytestCheckHook, flask, cachelib }:
+
+buildPythonPackage rec {
+  pname = "Flask-Session";
+  version = "0.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-ye1UMh+oxMoBMv/TNpWCdZ7aclL7SzvuSA5pDRukH0Y=";
+  };
+
+  propagatedBuildInputs = [ flask cachelib ];
+
+  checkInputs = [ 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/fengsp/flask-session";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ zhaofengli ];
+  };
+}
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-socketio/default.nix b/nixpkgs/pkgs/development/python-modules/flask-socketio/default.nix
new file mode 100644
index 000000000000..a429e81ce0fb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-socketio/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, coverage
+, fetchFromGitHub
+, flask
+, pytestCheckHook
+, python-socketio
+}:
+
+buildPythonPackage rec {
+  pname = "Flask-SocketIO";
+  version = "5.1.1";
+
+  src = fetchFromGitHub {
+    owner = "miguelgrinberg";
+    repo = "Flask-SocketIO";
+    rev = "v${version}";
+    sha256 = "sha256-PnNJEtcWaisOlt6OmYUl97TlZb9cK2ORvtEcmGPxSB0=";
+  };
+
+  propagatedBuildInputs = [
+    flask
+    python-socketio
+  ];
+
+  checkInputs = [
+    coverage
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "test_socketio.py"
+  ];
+
+  pythonImportsCheck = [ "flask_socketio" ];
+
+  meta = with lib; {
+    description = "Socket.IO integration for Flask applications";
+    homepage = "https://github.com/miguelgrinberg/Flask-SocketIO/";
+    license = licenses.mit;
+    maintainers = [ 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..cd45e8ab12f8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-sqlalchemy/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, flask
+, mock
+, sqlalchemy
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "Flask-SQLAlchemy";
+  version = "2.5.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "2bda44b43e7cacb15d4e05ff3cc1f8bc97936cc464623424102bfc2c35e95912";
+  };
+
+  propagatedBuildInputs = [
+    flask
+    sqlalchemy
+  ];
+
+  checkInputs = [
+    mock
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # flaky
+    "test_session_scoping_changing"
+  ];
+
+  meta = with lib; {
+    description = "SQLAlchemy extension for Flask";
+    homepage = "http://flask-sqlalchemy.pocoo.org/";
+    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..e68f69e248e5
--- /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;
+    sha256 = "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..82f3e09b4794
--- /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.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-IF0958Xs+tZnyEEj9fvlgLH2jNmhsFjXNTzANI4Vsb8=";
+  };
+
+  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..e17662e7ca64
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-testing/default.nix
@@ -0,0 +1,58 @@
+{ 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
+  ];
+
+  checkInputs = [
+    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"
+  ];
+
+  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-versioned/default.nix b/nixpkgs/pkgs/development/python-modules/flask-versioned/default.nix
new file mode 100644
index 000000000000..e30abdb7cb44
--- /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; [ globin ];
+  };
+}
+
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..014f250128c3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-wtf/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, flask
+, itsdangerous
+, wtforms
+, email-validator
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "flask-wtf";
+  version = "1.0.1";
+
+  src = fetchPypi {
+    pname = "Flask-WTF";
+    inherit version;
+    sha256 = "34fe5c6fee0f69b50e30f81a3b7ea16aa1492a771fe9ad0974d164610c09a6c9";
+  };
+
+  propagatedBuildInputs = [
+    flask
+    itsdangerous
+    wtforms
+  ];
+
+  passthru.optional-dependencies = {
+    email = [ email-validator ];
+  };
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Simple integration of Flask and WTForms.";
+    license = licenses.bsd3;
+    maintainers = [ maintainers.mic92 ];
+    homepage = "https://github.com/lepture/flask-wtf/";
+  };
+}
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..760c3ee671ae
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, asgiref
+, click
+, importlib-metadata
+, itsdangerous
+, jinja2
+, python-dotenv
+, werkzeug
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "flask";
+  version = "2.1.3";
+
+  src = fetchPypi {
+    pname = "Flask";
+    inherit version;
+    sha256 = "sha256-FZcuUBffBXXD1sCQuhaLbbkCWeYgrI1+qBOjlrrVtss=";
+  };
+
+  propagatedBuildInputs = [
+    asgiref
+    python-dotenv
+    click
+    itsdangerous
+    jinja2
+    werkzeug
+  ] ++ lib.optional (pythonOlder "3.10") importlib-metadata;
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  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; [ SuperSandro2000 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flaskbabel/default.nix b/nixpkgs/pkgs/development/python-modules/flaskbabel/default.nix
new file mode 100644
index 000000000000..a0e42e60c2e0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flaskbabel/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, flask
+, jinja2
+, speaklater
+, babel
+, pytz
+}:
+
+buildPythonPackage rec {
+  pname = "Flask-Babel";
+  version = "2.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f9faf45cdb2e1a32ea2ec14403587d4295108f35017a7821a2b1acb8cfd9257d";
+  };
+
+  propagatedBuildInputs = [ flask jinja2 speaklater babel pytz ];
+
+  meta = with lib; {
+    description = "Adds i18n/l10n support to Flask applications";
+    homepage = "https://github.com/mitsuhiko/flask-babel";
+    license = licenses.bsd0;
+    maintainers = with maintainers; [ matejc ];
+  };
+
+}
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..3575f1c36137
--- /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 = "source/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..e7bda9378b19
--- /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
+  ];
+
+  checkInputs = [
+    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..5eda127fb1c0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flax/default.nix
@@ -0,0 +1,70 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, jaxlib
+, keras
+, lib
+, matplotlib
+, msgpack
+, numpy
+, optax
+, pytest-xdist
+, pytestCheckHook
+, tensorflow
+}:
+
+buildPythonPackage rec {
+  pname = "flax";
+  version = "0.5.2";
+
+  src = fetchFromGitHub {
+    owner = "google";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-t24JZ08EmvuAINZC26OQI1icklUhUkfz6ZRKPr2COAw=";
+  };
+
+  buildInputs = [ jaxlib ];
+
+  propagatedBuildInputs = [
+    matplotlib
+    msgpack
+    numpy
+    optax
+  ];
+
+  pythonImportsCheck = [
+    "flax"
+  ];
+
+  checkInputs = [
+    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/*"
+  ];
+
+  meta = with lib; {
+    description = "Neural network library for JAX";
+    homepage = "https://github.com/google/flax";
+    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..04b607325136
--- /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";
+    sha256 = "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/flexmock/default.nix b/nixpkgs/pkgs/development/python-modules/flexmock/default.nix
new file mode 100644
index 000000000000..434f9409dbb3
--- /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=";
+  };
+
+  checkInputs = [
+    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..c13541acd833
--- /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
+  ];
+
+  checkInputs = [
+    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..1a53b46c4463
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flipr-api/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, requests-mock
+, pythonOlder
+, pytest-asyncio
+, pytestCheckHook
+, python-dateutil
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "flipr-api";
+  version = "1.4.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "cnico";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-/G92WkWUr3T5T7VVzMERFVmLDfLz6m9rlZLQZCBQbCI=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    python-dateutil
+    requests
+  ];
+
+  checkInputs = [
+    requests-mock
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "flipr_api"
+  ];
+
+  meta = with lib; {
+    description = "Python client for Flipr API";
+    homepage = "https://github.com/cnico/flipr-api";
+    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..d0b83d30ea27
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flit-core/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, callPackage
+, flit
+}:
+
+buildPythonPackage rec {
+  pname = "flit-core";
+  inherit (flit) version;
+  format = "pyproject";
+
+  outputs = [
+    "out"
+    "testsout"
+  ];
+
+  inherit (flit) src patches;
+
+  preConfigure = ''
+    cd flit_core
+  '';
+
+  postInstall = ''
+    mkdir $testsout
+    cp -R ../tests $testsout/tests
+  '';
+
+  # check in passthru.tests.pytest to escape infinite recursion with setuptools-scm
+  doCheck = false;
+
+  passthru.tests = {
+    inherit flit;
+    pytest = callPackage ./tests.nix { };
+  };
+
+  meta = with lib; {
+    description = "Distribution-building parts of Flit. See flit package for more information";
+    homepage = "https://github.com/pypa/flit";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ fridh SuperSandro2000 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flit-core/tests.nix b/nixpkgs/pkgs/development/python-modules/flit-core/tests.nix
new file mode 100644
index 000000000000..0fd13e80cb12
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flit-core/tests.nix
@@ -0,0 +1,22 @@
+{ buildPythonPackage
+, flit
+, flit-core
+, pytestCheckHook
+, testpath
+}:
+
+buildPythonPackage rec {
+  pname = "flit-core";
+  inherit (flit-core) version;
+
+  src = flit-core.testsout;
+
+  dontBuild = true;
+  dontInstall = true;
+
+  checkInputs = [
+    flit
+    pytestCheckHook
+    testpath
+  ];
+}
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..598905d97ffa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flit/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, docutils
+, requests
+, pytestCheckHook
+, testpath
+, responses
+, flit-core
+, tomli
+, 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.7.1";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "takluyver";
+    repo = "flit";
+    rev = version;
+    sha256 = "sha256-zKgaeK3fskz2TuHvIWlxBrdZIWfIJHhaqopZ3+V36wY=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    docutils
+    requests
+    flit-core
+    tomli
+    tomli-w
+  ];
+
+  checkInputs = [ pytestCheckHook testpath responses ];
+
+  disabledTests = [
+    # needs some ini file.
+    "test_invalid_classifier"
+  ];
+
+  meta = with lib; {
+    description = "A simple packaging tool for simple packages";
+    homepage = "https://github.com/pypa/flit";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ fridh SuperSandro2000 ];
+  };
+}
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..14bb7ae6cb46
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flower/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, celery
+, humanize
+, mock
+, pytz
+, tornado
+, prometheus-client
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "flower";
+  version = "1.1.0";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-+SDKKQLXU5/BgKsV5R8dkYNV5cwj2oVP+dWcbloXJbY=";
+  };
+
+  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
+  ];
+
+  checkInputs = [
+    mock
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # AssertionError as the celery release can't be detected
+    "test_default"
+    "test_with_app"
+  ];
+
+  pythonImportsCheck = [
+    "flower"
+  ];
+
+  meta = with lib; {
+    description = "Celery Flower";
+    homepage = "https://github.com/mher/flower";
+    license = licenses.bsdOriginal;
+    maintainers = with maintainers; [ arnoldfarkas ];
+    knownVulnerabilities = [
+      "CVE-2022-30034"
+    ];
+  };
+}
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..7045841245d3
--- /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 = "3.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "obsrvbl";
+    repo = pname;
+    # https://github.com/obsrvbl/flowlogs-reader/issues/57
+    rev = "fac4c6c63348ff67fd0a8f51d391ba7c9f59e5ed";
+    hash = "sha256-bGb2CLp33aIr0R/lBPWAF3CbtVTWpqmcvYgZ6bcARTc=";
+  };
+
+  propagatedBuildInputs = [
+    botocore
+    boto3
+    parquet
+    python-dateutil
+  ];
+
+  checkInputs = [
+    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..7687c0980c70
--- /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;
+    sha256 = "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..a670b4a9ba16
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flufl/i18n.nix
@@ -0,0 +1,22 @@
+{ buildPythonPackage, fetchPypi
+, atpublic
+, pdm-pep517
+}:
+
+buildPythonPackage rec {
+  pname = "flufl.i18n";
+  version = "4.0";
+  format = "pyproject";
+
+  nativeBuildInputs = [ pdm-pep517 ];
+  propagatedBuildInputs = [ atpublic ];
+
+  doCheck = false;
+
+  pythonImportsCheck = [ "flufl.i18n" ];
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-MTq0djhFp/cEx0Ezt5EaMz3MzrAWjxZ0HQSkfFuasWY=";
+  };
+}
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..c2cc5723e4df
--- /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.0";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-FBX30Z2N2WpYJC4O+5DOPLGHf7VFB0rYwcrky3GR/gE=";
+  };
+
+  nativeBuildInputs = [ pdm-pep517 ];
+  propagatedBuildInputs = [ atpublic psutil ];
+  checkInputs = [ 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..17555cc50c63
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flux-led/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, webcolors
+, pythonOlder
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "flux-led";
+  version = "0.28.30";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Danielhiversen";
+    repo = "flux_led";
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-ujox3Q8oyPw8+SBdF9O7ezu8FC/NnWxeSGW8Nfh7tZ8=";
+  };
+
+  propagatedBuildInputs = [
+    webcolors
+  ];
+
+  checkInputs = [
+    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";
+    license = licenses.lgpl3Plus;
+    maintainers = with maintainers; [ colemickens ];
+    platforms = platforms.linux;
+  };
+}
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..3c09106c94b8
--- /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 ];
+
+  checkInputs = [ 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..0acdf24d9542
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fn/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchpatch
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "fn";
+  version = "0.4.3";
+
+  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/fnvhash/default.nix b/nixpkgs/pkgs/development/python-modules/fnvhash/default.nix
new file mode 100644
index 000000000000..d506b51a92cf
--- /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";
+  };
+
+  checkInputs = [ 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..48b98a8e1018
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/folium/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+, branca
+, jinja2
+, nbconvert
+, numpy
+, pandas
+, pillow
+, requests
+, selenium
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "folium";
+  version = "0.12.1.post1";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "python-visualization";
+    repo = "folium";
+    rev = "v${version}";
+    sha256 = "sha256-4UseN/3ojZdDUopwZLpHZEBon1qDDvCWfdzxodi/BeA=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = "v${version}";
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    branca
+    jinja2
+    numpy
+    requests
+  ];
+
+  checkInputs = [
+    nbconvert
+    pytestCheckHook
+    pandas
+    pillow
+    selenium
+  ];
+
+  disabledTests = [
+    # requires internet connection
+    "test_geojson"
+    "test_heat_map_with_weights"
+    "test_json_request"
+    "test_notebook"
+  ];
+
+  meta = {
+    description = "Make beautiful maps with Leaflet.js & Python";
+    homepage = "https://github.com/python-visualization/folium";
+    license = with lib.licenses; [ mit ];
+    maintainers = with lib.maintainers; [ fridh ];
+  };
+}
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..87fc01f83df9
--- /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.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-g/JTmYE078qAFcTVCumVvGj65LbnDsCIUsFfqVlihTk=";
+    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..2d5f90ebb686
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fontmath/default.nix
@@ -0,0 +1,28 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27
+, fonttools, setuptools-scm
+, pytest, pytest-runner
+}:
+
+buildPythonPackage rec {
+  pname = "fontMath";
+  version = "0.9.2";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-TIsccR4cv0upPD0IQ5NbBmGXMTEmGvCGCL3hfeEBhAQ=";
+    extension = "zip";
+  };
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  propagatedBuildInputs = [ fonttools ];
+  checkInputs = [ pytest pytest-runner ];
+
+  meta = with lib; {
+    description = "A collection of objects that implement fast font, glyph, etc. math";
+    homepage = "https://github.com/robotools/fontMath/";
+    license = licenses.mit;
+    maintainers = [ 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..28972b62b977
--- /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.10.7";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-u0hKI2LLWAUGIVRECk6b5y7UKgJHUx2I8R5Q+qkKxcg=";
+    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
+  '';
+  checkInputs = [ 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..cfcabbddc289
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fonttools/default.nix
@@ -0,0 +1,98 @@
+{ 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.34.4";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner  = pname;
+    repo   = pname;
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-GwbcrDsfxs5qRQJozhK/+n3W3NlO39g7pzxL9iIiDfU=";
+  };
+
+  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);
+  };
+
+  checkInputs = [
+    pytestCheckHook
+  ] ++ lib.concatLists (lib.attrVals ([
+    "woff"
+    "interpolatable"
+  ] ++ 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..cd5be4ab0c2a
--- /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
+  ];
+
+  checkInputs = [
+    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..ea0c17d5524a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/foolscap/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, mock
+, pyopenssl
+, pytestCheckHook
+, service-identity
+, twisted
+}:
+
+buildPythonPackage rec {
+  pname = "foolscap";
+  version = "21.7.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-6dGFU4YNk1joXXZi2c2L84JtUbTs1ICgXfv0/EU2P4Q=";
+  };
+
+  propagatedBuildInputs = [
+    mock
+    twisted
+    pyopenssl
+    service-identity
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # Not all dependencies are present
+    "src/foolscap/test/test_connection.py"
+  ];
+
+  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..13c46ba1e8aa
--- /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";
+  };
+
+  checkInputs = [ 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..a1d3741584ca
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/forecast-solar/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, aiodns
+, aiohttp
+, backports-zoneinfo
+}:
+
+buildPythonPackage rec {
+  pname = "forecast-solar";
+  version = "2.2.0";
+
+  src = fetchFromGitHub {
+    owner = "home-assistant-libs";
+    repo = "forecast_solar";
+    rev = version;
+    sha256 = "sha256-2gex50QEN55uUa8SfAQA7iDZ3SVnpOTXfD3Sxq7KvNw=";
+  };
+
+  PACKAGE_VERSION = version;
+
+  propagatedBuildInputs = [
+    aiodns
+    aiohttp
+  ] ++ lib.optionals (pythonOlder "3.9") [
+    backports-zoneinfo
+  ];
+
+  # no unit tests implemented
+  doCheck = false;
+
+  pythonImportsCheck = [ "forecast_solar" ];
+
+  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..d5b85d4e5bd1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/formbox/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, pythonOlder, fetchFromSourcehut, bleach, markdown }:
+
+buildPythonPackage rec {
+  pname = "formbox";
+  version = "0.4.1";
+  format = "flit";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromSourcehut {
+    owner = "~cnx";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-zOvXmSeBiwc0Z5mRMwMsHLU3A/iP7rpjXm0T0I2gUTk=";
+  };
+
+  propagatedBuildInputs = [ bleach markdown ];
+  doCheck = false; # there's no test
+  pythonImportsCheck = [ "formbox" ];
+
+  meta = with lib; {
+    description = "A script to format mbox as HTML/XML";
+    homepage = "https://sr.ht/~cnx/formbox";
+    license = licenses.agpl3Plus;
+    maintainers = [ maintainers.McSinyx ];
+  };
+}
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..8b0425c38817
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fortiosapi/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, oyaml
+, packaging
+, paramiko
+, pexpect
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "fortiosapi";
+  version = "1.0.5";
+
+  src = fetchFromGitHub {
+    owner = "fortinet-solutions-cse";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0679dizxcd4sk1b4h6ss8qsbjb3c8qyijlp4gzjqji91w6anzg9k";
+  };
+
+  propagatedBuildInputs = [
+    pexpect
+    requests
+    paramiko
+    packaging
+    oyaml
+  ];
+
+  # 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..1d65c4e643c8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fountains/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, bitlist
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "fountains";
+  version = "2.0.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-9ASOgqkE1vwCKGAZXEJaHoABMXomIWTGv3jAsNssdsU=";
+  };
+
+  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..04a9586b40f4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fpylll/default.nix
@@ -0,0 +1,72 @@
+{ stdenv
+, lib
+, fetchFromGitHub
+, fetchpatch
+, buildPythonPackage
+, pkgconfig
+, gmp
+, pari
+, mpfr
+, fplll
+, cython
+, cysignals
+, numpy
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "fpylll";
+  version = "0.5.7";
+
+  src = fetchFromGitHub {
+    owner = "fplll";
+    repo = "fpylll";
+    rev = version;
+    sha256 = "sha256-iUPreJ8BSB8LDisbJis0xn8ld6+Nf9Z4AP8SWJlCfZg=";
+  };
+
+  patches = [
+   (fetchpatch {
+     name = "remove-strategies-doctest.patch";
+     url = "https://github.com/fplll/fpylll/commit/3edffcd189e9d827a322d83b0f84d32e5f067442.patch";
+     sha256 = "sha256-U7qOIbVzUNwYmjOPryjnE3J+MX/vMwm3T0UyOZ5ylLc=";
+   })
+  ];
+
+  buildInputs = [
+    gmp
+    pari
+    mpfr
+    fplll
+  ];
+
+  propagatedBuildInputs = [
+    cython
+    cysignals
+    numpy
+  ];
+
+  nativeBuildInputs = [
+    pkgconfig
+  ];
+
+  checkInputs = [
+    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..b57e04ec75a6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fpyutils/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, atomicwrites
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "fpyutils";
+  version = "2.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "frnmst";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-QnsLQq5u5Fhy9DJD/UE46NstSPvmHyDjS4WiubSTmSA=";
+  };
+
+  propagatedBuildInputs = [
+    atomicwrites
+    requests
+  ];
+
+  checkInputs = [
+    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";
+    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..cff62be2afff
--- /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}";
+    sha256 = "sha256-T0CdWWr8p3JVhp3nol5hyxsrD3951JE2EDpFt+m+3bE=";
+  };
+
+  checkInputs = [
+    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..54a6ce8662e5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/freebox-api/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, importlib-metadata
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "freebox-api";
+  version = "0.0.10";
+  format = "pyproject";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "hacf-fr";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-yUcHdSHSgWxZl0z7Ue0MestvGhiXkDsxArNoDk0ZkR4=";
+  };
+
+  patches = [
+    # Switch to poetry-core, https://github.com/hacf-fr/freebox-api/pull/187
+    (fetchpatch {
+      name = "switch-to-poetry-core.patch";
+      url = "https://github.com/hacf-fr/freebox-api/commit/07356ac65483bc24fb1ed32612e77f2c2eed0134.patch";
+      sha256 = "1zwricrwsqy01pmhrjy41gh4kxb3gki8z8yxlpywd66y7gid547r";
+    })
+  ];
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+  ] ++ lib.optionals (pythonOlder "3.8") [ importlib-metadata ];
+
+  checkInputs = [
+    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";
+    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..13e033e8bc36
--- /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
+  '';
+
+  checkInputs = [
+    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..171d2b0556ab
--- /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.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-tMZO+ydea8aNxudxsX/+D/D5C4GipRiQQ1ULZRmSa6Q=";
+  };
+
+  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";
+      sha256 = "sha256-FNABqVN5DFqVUR88lYzwbfsZj3xcB9/MvQtm+I2VjnI=";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    python-dateutil
+  ];
+
+  checkInputs = [
+    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/frigidaire/default.nix b/nixpkgs/pkgs/development/python-modules/frigidaire/default.nix
new file mode 100644
index 000000000000..61082cb40904
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/frigidaire/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, certifi
+, chardet
+, fetchFromGitHub
+, idna
+, pythonOlder
+, requests
+, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "frigidaire";
+  version = "0.18.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "bm1549";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-U2ixBtigY15RzMNIeUK71uNOndUepK2kE/CTFwl855w=";
+  };
+
+  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";
+    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..320912c7dd17
--- /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";
+  };
+
+  checkInputs = [ 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..092b00f6b02e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fritzconnection/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, pytestCheckHook
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "fritzconnection";
+  version = "1.9.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "kbr";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-wapZ4lCG0tfE+LbFVeIxVlbMJN/sSwIeYK5GLCqoWLs=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "fritzconnection"
+  ];
+
+  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/changes.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..b998f9949807
--- /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;
+    sha256 = "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..6b47dc77c167
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/frozendict/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "frozendict";
+  version = "2.3.4";
+  format = "setuptools";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "15b4b18346259392b0d27598f240e9390fafbff882137a9c48a1e0104fb17f78";
+  };
+
+  pythonImportsCheck = [
+    "frozendict"
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    pushd test
+  '';
+
+  postCheck = ''
+    popd
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/Marco-Sulla/python-frozendict";
+    description = "A simple immutable dictionary";
+    license = licenses.lgpl3Only;
+  };
+}
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..1bc295fbe332
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/frozenlist/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, cython
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "frozenlist";
+  version = "1.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "aio-libs";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-cHKqkvsBUN7If+8swbd6aafFrSgnop3YlweBLPOHzyU=";
+  };
+
+  nativeBuildInputs = [
+    cython
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace pytest.ini \
+      --replace "--cov=frozenlist" ""
+  '';
+
+  preBuild = ''
+    cython frozenlist/_frozenlist.pyx
+  '';
+
+  pythonImportsCheck = [
+    "frozenlist"
+  ];
+
+  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..1d4326f74ee3
--- /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;
+    sha256 = "sha256-rpfH1RIT9LcLapWCklMCiQkN46fhWEHhCPvhRPBp0xM=";
+  };
+
+  buildInputs = [ glibcLocales ];
+
+  # strong cycle with paramaterized
+  doCheck = false;
+  checkInputs = [ 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/fsspec/default.nix b/nixpkgs/pkgs/development/python-modules/fsspec/default.nix
new file mode 100644
index 000000000000..844f39681648
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fsspec/default.nix
@@ -0,0 +1,76 @@
+{ lib
+, stdenv
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, numpy
+, paramiko
+, pytest-asyncio
+, pytest-mock
+, pytest-vcr
+, pytestCheckHook
+, pythonOlder
+, requests
+, smbprotocol
+, tqdm
+}:
+
+buildPythonPackage rec {
+  pname = "fsspec";
+  version = "2022.5.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "intake";
+    repo = "filesystem_spec";
+    rev = version;
+    hash = "sha256-WOzw9UPF8LZuOhp5p/CJUUJcYpAfixV6GiI8tfnoklc=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    paramiko
+    requests
+    smbprotocol
+    tqdm
+  ];
+
+  checkInputs = [
+    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"
+  ] ++ 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"
+  ];
+
+  pythonImportsCheck = [
+    "fsspec"
+  ];
+
+  meta = with lib; {
+    description = "A specification that Python filesystems should adhere to";
+    homepage = "https://github.com/intake/filesystem_spec";
+    changelog = "https://github.com/fsspec/filesystem_spec/raw/${version}/docs/source/changelog.rst";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ costrouc ];
+  };
+}
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..d214cb4f0a43
--- /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;
+    sha256 = "sha256-v8IBn4T82FFBkVIyCmN1YEoPFFnCgbWxmbLNDS5yf48=";
+  };
+
+  propagatedBuildInputs = [
+    wcwidth
+  ];
+
+  checkInputs = [
+    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..4cb2fe442d32
--- /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=";
+  };
+
+  checkInputs = [
+    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 = "http://ftputil.sschwarzer.net/";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ ];
+  };
+}
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..f20f5dde8b4b
--- /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";
+  };
+
+  checkInputs = [
+    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; [ SuperSandro2000 ];
+  };
+}
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..ba535146cf25
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/funcparserlib/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, poetry-core
+, python
+, pytestCheckHook
+, pythonOlder
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "funcparserlib";
+  version = "1.0.0a0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "vlasovskikh";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-YfcboKjyc5ASzrp0duu2R6psf51MGZIeZ0owo5QNSnU=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    six
+  ];
+
+  patches = [
+    # Support for poetry-core, https://github.com/vlasovskikh/funcparserlib/pull/73
+    (fetchpatch {
+      name = "support-poetry-core.patch";
+      url = "https://github.com/vlasovskikh/funcparserlib/commit/61ed558fc146b7a30879919325dfa8aae77be556.patch";
+      sha256 = "sha256-tqdR3r4/t7RWBYZeAabaN7oYf6VxkVVz006XICX9rYI=";
+    })
+  ];
+
+  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..115d358cb786
--- /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.optional (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/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/functorch/default.nix b/nixpkgs/pkgs/development/python-modules/functorch/default.nix
new file mode 100644
index 000000000000..53860d2c2b49
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/functorch/default.nix
@@ -0,0 +1,103 @@
+{ buildPythonPackage
+, expecttest
+, fetchFromGitHub
+, lib
+, ninja
+, pytestCheckHook
+, python
+, pytorch
+, pybind11
+, which
+}:
+
+buildPythonPackage rec {
+  pname = "functorch";
+  version = "0.2.0";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "pytorch";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-33skKk5aAIHn+1149ifolXPA+tpQ+WROAZvwPeGBbrA=";
+  };
+
+  # Somewhat surprisingly pytorch is actually necessary for the build process.
+  # `setup.py` imports `torch.utils.cpp_extension`.
+  nativeBuildInputs = [
+    ninja
+    pytorch
+    which
+  ];
+
+  buildInputs = [
+    pybind11
+  ];
+
+  preCheck = ''
+    rm -rf functorch/
+  '';
+
+  checkInputs = [
+    expecttest
+    pytestCheckHook
+  ];
+
+  # See https://github.com/pytorch/functorch/issues/835.
+  disabledTests = [
+    # RuntimeError: ("('...', '') is in PyTorch's OpInfo db ", "but is not in functorch's OpInfo db. Please regenerate ", '... and add the new tests to ', 'denylists if necessary.')
+    "test_coverage_bernoulli_cpu_float32"
+    "test_coverage_column_stack_cpu_float32"
+    "test_coverage_diagflat_cpu_float32"
+    "test_coverage_flatten_cpu_float32"
+    "test_coverage_linalg_lu_factor_cpu_float32"
+    "test_coverage_linalg_lu_factor_ex_cpu_float32"
+    "test_coverage_multinomial_cpu_float32"
+    "test_coverage_nn_functional_dropout2d_cpu_float32"
+    "test_coverage_nn_functional_feature_alpha_dropout_with_train_cpu_float32"
+    "test_coverage_nn_functional_feature_alpha_dropout_without_train_cpu_float32"
+    "test_coverage_nn_functional_kl_div_cpu_float32"
+    "test_coverage_normal_cpu_float32"
+    "test_coverage_normal_number_mean_cpu_float32"
+    "test_coverage_pca_lowrank_cpu_float32"
+    "test_coverage_round_decimals_0_cpu_float32"
+    "test_coverage_round_decimals_3_cpu_float32"
+    "test_coverage_round_decimals_neg_3_cpu_float32"
+    "test_coverage_scatter_reduce_cpu_float32"
+    "test_coverage_svd_lowrank_cpu_float32"
+
+    # >       self.assertEqual(len(functorch_lagging_op_db), len(op_db))
+    # E       AssertionError: Scalars are not equal!
+    # E
+    # E       Absolute difference: 19
+    # E       Relative difference: 0.03525046382189239
+    "test_functorch_lagging_op_db_has_opinfos_cpu"
+
+    # RuntimeError: PyTorch not compiled with LLVM support!
+    "test_bias_gelu"
+    "test_binary_ops"
+    "test_broadcast1"
+    "test_broadcast2"
+    "test_float_double"
+    "test_float_int"
+    "test_fx_trace"
+    "test_int_long"
+    "test_issue57611"
+    "test_slice1"
+    "test_slice2"
+    "test_transposed1"
+    "test_transposed2"
+    "test_unary_ops"
+  ];
+
+  pythonImportsCheck = [ "functorch" ];
+
+  meta = with lib; {
+    description = "JAX-like composable function transforms for PyTorch";
+    homepage = "https://pytorch.org/functorch";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ samuela ];
+    # See https://github.com/NixOS/nixpkgs/pull/174248#issuecomment-1139895064.
+    platforms = platforms.x86_64;
+  };
+}
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..2a41d9955f34
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/funcy/default.nix
@@ -0,0 +1,24 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "funcy";
+  version = "1.17";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "40b9b9a88141ae6a174df1a95861f2b82f2fdc17669080788b73a3ed9370e968";
+  };
+
+  # No tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Collection of fancy functional tools focused on practicality";
+    homepage = "https://funcy.readthedocs.org/";
+    license = licenses.bsd3;
+  };
+
+}
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..5872ab8b7824
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/furl/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, flake8
+, orderedmultidict
+, pytestCheckHook
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "furl";
+  version = "2.1.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5a6188fe2666c484a12159c18be97a1977a71d632ef5bb867ef15f54af39cc4e";
+  };
+
+  propagatedBuildInputs = [
+    orderedmultidict
+    six
+  ];
+
+  checkInputs = [
+    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..cd97c2b5697c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/furo/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, sphinx
+, beautifulsoup4
+, sphinx-basic-ng
+}:
+
+buildPythonPackage rec {
+  pname = "furo";
+  version = "2022.6.21";
+  format = "wheel";
+  disable = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version format;
+    dist = "py3";
+    python = "py3";
+    sha256 = "sha256-Bhto4yM0Xif8ugJM8zoed/Pf2NmYdBC+gidJpwbirdY=";
+  };
+
+  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";
+    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..22fbcce40e5a
--- /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;
+    sha256 = "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..a24ea8ab9723
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/future/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "future";
+  version = "0.18.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b1bead90b70cf6ec3f0710ae53a525360fa360d306a86583adc6bf83a4db537d";
+  };
+
+  doCheck = false;
+
+  meta = {
+    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 = with 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..a422e5606b0b
--- /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";
+  };
+
+  checkInputs = [
+    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/fuzzywuzzy/default.nix b/nixpkgs/pkgs/development/python-modules/fuzzywuzzy/default.nix
new file mode 100644
index 000000000000..9059ba977b7b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fuzzywuzzy/default.nix
@@ -0,0 +1,21 @@
+{ lib, buildPythonPackage, fetchPypi, python-Levenshtein, pycodestyle, hypothesis, pytest }:
+
+buildPythonPackage rec {
+  pname = "fuzzywuzzy";
+  version = "0.18.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1s00zn75y2dkxgnbw8kl8dw4p1mc77cv78fwfa4yb0274s96w0a5";
+  };
+
+  propagatedBuildInputs = [ python-Levenshtein ];
+  checkInputs = [ 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/fx2/default.nix b/nixpkgs/pkgs/development/python-modules/fx2/default.nix
new file mode 100644
index 000000000000..e82679443562
--- /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 = "0.9";
+
+  src = fetchFromGitHub {
+    owner = "whitequark";
+    repo = "libfx2";
+    rev = "v${version}";
+    sha256 = "sha256-Uk+K7ym92JX4fC3PyTNxd0UvBzoNZmtbscBYjSWChuk=";
+  };
+
+  nativeBuildInputs = [ sdcc ];
+
+  propagatedBuildInputs = [ libusb1 crcmod ];
+
+  preBuild = ''
+    cd software
+    ${python.pythonForBuild.interpreter} setup.py build_ext
+  '';
+
+  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/galois/default.nix b/nixpkgs/pkgs/development/python-modules/galois/default.nix
new file mode 100644
index 000000000000..b4d66188e312
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/galois/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, pytestCheckHook
+, pytest-xdist
+, numpy
+, numba
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "galois";
+  version = "0.0.32";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "mhostetter";
+    repo = "galois";
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-+cxRLrfqk3N9pWKCVsTxruZwMYZ5dQyKJRnrb8y+ECM=";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    numba
+    typing-extensions
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    pytest-xdist
+  ];
+
+  postPatch = ''
+     substituteInPlace setup.cfg \
+       --replace "numpy >= 1.18.4, < 1.23" "numpy >= 1.18.4"
+    '';
+
+  pythonImportsCheck = [ "galois" ];
+
+  meta = {
+    description = "A Python 3 package that extends NumPy arrays to operate over finite fields";
+    homepage = "https://github.com/mhostetter/galois";
+    downloadPage = "https://github.com/mhostetter/galois/releases";
+    license = lib.licenses.mit;
+    maintainers = with lib.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..0df84510efd4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gamble/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "gamble";
+  version = "0.10";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1lb5x076blnnz2hj7k92pyq0drbjwsls6pmnabpvyvs4ddhz5w9w";
+  };
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "gamble"
+  ];
+
+  meta = with lib; {
+    description = "Collection of gambling classes/tools";
+    homepage = "https://github.com/jpetrucciani/gamble";
+    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..3c8933686b22
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gaphas/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, poetry-core
+, gobject-introspection
+, gtk3
+, pycairo
+, pygobject3
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "gaphas";
+  version = "3.6.0";
+  disabled = pythonOlder "3.7";
+
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-yleYbAJdDVzZrMQ3izi9UX3Ji1vIuQDc+RK5+wzrMi4=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  buildInputs = [ gobject-introspection gtk3 ];
+
+  propagatedBuildInputs = [
+    pycairo
+    pygobject3
+    typing-extensions
+  ];
+
+  pythonImportsCheck = [ "gaphas" ];
+
+  meta = with lib; {
+    description = "GTK+ based diagramming widget";
+    maintainers = with maintainers; [ wolfangaukang ];
+    homepage = "https://github.com/gaphor/gaphas";
+    license = licenses.asl20;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/garages-amsterdam/default.nix b/nixpkgs/pkgs/development/python-modules/garages-amsterdam/default.nix
new file mode 100644
index 000000000000..2b25decd4fc8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/garages-amsterdam/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "garages-amsterdam";
+  version = "4.1.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "klaasnicolaas";
+    repo = "garages_amsterdam";
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-ZWp543msRAgn/fFplEt6saSNbZ2flC5gwjxrll4w0W0=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace '"0.0.0"' '"${version}"'
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  # The only test requires network access
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "garages_amsterdam"
+  ];
+
+  meta = with lib; {
+    description = "Python client for getting garage occupancy in Amsterdam";
+    homepage = "https://github.com/klaasnicolaas/python-garages-amsterdam";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..19a931c2bf48
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/garminconnect/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, cloudscraper
+, fetchFromGitHub
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "garminconnect";
+  version = "0.1.45";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "cyberjunky";
+    repo = "python-garminconnect";
+    rev = "refs/tags/${version}";
+    hash = "sha256-8ORot3ZEh+1cAV/Ec63ghBQFt4LyaH+rRsgzYA6wEdI=";
+  };
+
+  propagatedBuildInputs = [
+    cloudscraper
+    requests
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "garminconnect"
+  ];
+
+  meta = with lib; {
+    description = "Garmin Connect Python API wrapper";
+    homepage = "https://github.com/cyberjunky/python-garminconnect";
+    license = licenses.mit;
+    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..110363b38322
--- /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;
+    sha256 = "sha256-0y2bHT7YEfTvDxTm6yLl3GmnPUYEieoGEnwkzfA6mOg=";
+  };
+
+  checkInputs = [
+    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..6242011b312f
--- /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; [ tomfitzhenry ];
+  };
+}
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..4aab9d1bc6ff
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gb-io/default.nix
@@ -0,0 +1,47 @@
+{ stdenv
+, lib
+, fetchFromGitHub
+, buildPythonPackage
+, rustPlatform
+, setuptools-rust
+}:
+
+buildPythonPackage rec {
+  pname = "gb-io";
+  version = "0.1.1";
+
+  src = fetchFromGitHub {
+    owner = "althonos";
+    repo = "gb-io.py";
+    rev = "v${version}";
+    sha256 = "05fpz11rqqjrb8lc8id6ssv7sni9i1h7x1ra5v5flw9ghpf29ncm";
+  };
+
+  cargoDeps = rustPlatform.fetchCargoTarball {
+    inherit src sourceRoot;
+    name = "${pname}-${version}";
+    sha256 = "1qh31jysg475f2qc70b3bczmzywmg9987kn2vsmk88h8sx4nnwc5";
+  };
+
+  sourceRoot = "source";
+
+  nativeBuildInputs = [ setuptools-rust ] ++ (with rustPlatform; [
+    cargoSetupHook
+    rust.cargo
+    rust.rustc
+  ]);
+
+  checkPhase = ''
+    python -m unittest discover
+  '';
+
+  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..42832ff45144
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gbinder-python/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, cython
+, pkg-config
+, libgbinder
+}:
+
+buildPythonPackage rec {
+  pname = "gbinder-python";
+  version = "1.0.0";
+
+  src = fetchFromGitHub {
+    owner = "erfanoabdi";
+    repo = pname;
+    rev = version;
+    sha256 = "0jgblzakjgsy0cj93bmh5gr7qnl2xgsrm0wzc6xjvzry9lrbs360";
+  };
+
+  buildInputs = [
+    libgbinder
+  ];
+
+  nativeBuildInputs = [
+    cython
+    pkg-config
+  ];
+
+  setupPyGlobalFlags = [ "--cython" ];
+
+  meta = with lib; {
+    description = "Python bindings for libgbinder";
+    homepage = "https://github.com/erfanoabdi/gbinder-python";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ mcaju ];
+    platforms = platforms.linux;
+  };
+}
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..a13dc09262fd
--- /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.3";
+
+  src = fetchFromGitHub {
+    owner = "beeware";
+    repo = "gbulb";
+    rev = "v${version}";
+    sha256 = "sha256-QNpZf1zfe6r6MtmYMWSrXPsXm5iX36oMx4GnXiTYPaQ=";
+  };
+
+  propagatedBuildInputs = [
+    pygobject3
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    gtk3
+    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..ea101117c135
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gcal-sync/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, aiohttp
+, pydantic
+, freezegun
+, pytest-aiohttp
+, pytest-asyncio
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "gcal-sync";
+  version = "0.10.0";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "allenporter";
+    repo = "gcal_sync";
+    rev = "refs/tags/${version}";
+    hash = "sha256-RwQOLeOGxT8FijDSrByhZC/T8pFRDfJbA1eAQ1l4qUU=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    pydantic
+  ];
+
+  checkInputs = [
+    freezegun
+    pytest-aiohttp
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "gcal_sync" ];
+
+  meta = {
+    description = "Python library for syncing Google Calendar to local storage";
+    homepage = "https://github.com/allenporter/gcal_sync";
+    license = lib.licenses.asl20;
+    maintainers = with lib.maintainers; [ dotlambda ];
+  };
+}
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..2661ae1503fd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gcovr/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, jinja2
+, lxml
+, pygments
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "gcovr";
+  version = "5.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-IXGVCF7JQ0YpGoe3sebZz97u5WKz4PmjKyXJUws7zo8=";
+  };
+
+  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/";
+    license = licenses.bsd0;
+    maintainers = with maintainers; [ ];
+  };
+}
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..85a88dc3d5b5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gcsfs/default.nix
@@ -0,0 +1,72 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, google-auth
+, google-auth-oauthlib
+, google-cloud-storage
+, requests
+, decorator
+, fsspec
+, ujson
+, aiohttp
+, crcmod
+, pytest-vcr
+, vcrpy
+}:
+
+buildPythonPackage rec {
+  pname = "gcsfs";
+  version = "2022.5.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "fsspec";
+    repo = pname;
+    rev = version;
+    hash = "sha256-gIkK1VSg1h04+MQBoxFtXIdn80faJlgQ9ayqV5p0RMU=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    crcmod
+    decorator
+    fsspec
+    google-auth
+    google-auth-oauthlib
+    google-cloud-storage
+    requests
+    ujson
+  ];
+
+  checkInputs = [
+    pytest-vcr
+    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";
+    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..3368706c8c12
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gdown/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, beautifulsoup4
+, buildPythonApplication
+, fetchPypi
+, filelock
+, requests
+, tqdm
+, setuptools
+, six
+}:
+
+buildPythonApplication rec {
+  pname = "gdown";
+  version = "4.5.1";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-ghcGEGPYr8qtnY4tVBD7wJicKz8JRqa9m/65RhYWzGo=";
+  };
+
+  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";
+    license = licenses.mit;
+    maintainers = with maintainers; [ breakds ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gdtoolkit/default.nix b/nixpkgs/pkgs/development/python-modules/gdtoolkit/default.nix
new file mode 100644
index 000000000000..5323e12e4c55
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gdtoolkit/default.nix
@@ -0,0 +1,46 @@
+{ lib, buildPythonPackage, fetchFromGitHub, pythonOlder, lark, docopt, pyyaml, setuptools }:
+
+let lark080 = lark.overrideAttrs (old: rec {
+  # gdtoolkit needs exactly this lark version
+  version = "0.8.0";
+  src = fetchFromGitHub {
+    owner = "lark-parser";
+    repo = "lark";
+    rev = version;
+    sha256 = "su7kToZ05OESwRCMPG6Z+XlFUvbEb3d8DgsTEcPJMg4=";
+  };
+});
+
+in
+buildPythonPackage rec {
+  pname = "gdtoolkit";
+  version = "3.3.1";
+
+  propagatedBuildInputs = [
+    lark080
+    docopt
+    pyyaml
+    setuptools
+  ];
+
+  # If we try to get using fetchPypi it requires GeoIP (but the package dont has that dep!?)
+  src = fetchFromGitHub {
+    owner = "Scony";
+    repo = "godot-gdscript-toolkit";
+    rev = version;
+    sha256 = "13nnpwy550jf5qnm9ixpxl1bwfnhhbiys8vqfd25g3aim4bm3gnn";
+  };
+
+  disabled = pythonOlder "3.7";
+
+  # Tests cannot be run because they need network to install additional dependencies using pip and tox
+  doCheck = false;
+  pythonImportsCheck = [ "gdtoolkit" "gdtoolkit.formatter" "gdtoolkit.linter" "gdtoolkit.parser" ];
+
+  meta = with lib; {
+    description = "Independent set of tools for working with Godot's GDScript - parser, linter and formatter";
+    homepage = "https://github.com/Scony/godot-gdscript-toolkit";
+    license = licenses.mit;
+    maintainers = with maintainers; [ shiryel ];
+  };
+}
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..f82e2878086a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ge25519/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, bitlist
+, buildPythonPackage
+, fe25519
+, fetchPypi
+, fountains
+, parts
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "ge25519";
+  version = "1.3.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-y9Nv59pLWk1kRjZG3EmalT34Mjx7RLZ4WkvJlRrK5LI=";
+  };
+
+  propagatedBuildInputs = [
+    fe25519
+    parts
+    bitlist
+    fountains
+  ];
+
+  checkInputs = [
+    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..6c4165481841
--- /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.gpl1;
+    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..b87182abdbd6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gehomesdk/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, aiohttp
+, bidict
+, buildPythonPackage
+, fetchPypi
+, humanize
+, lxml
+, pythonOlder
+, requests
+, slixmpp
+, websockets
+}:
+
+buildPythonPackage rec {
+  pname = "gehomesdk";
+  version = "0.5.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-XxJEiWiblnvKCfcM8sNFEjV2gw7cc7A9P6H4JEAleRQ=";
+  };
+
+  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";
+    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..8dc5bbdb3ae6
--- /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}";
+    sha256 = "sha256-eKGundh7j9LqFd71bx86rNBVu2iAcgLN25JfFa39+VA=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    bidict
+    humanize
+    lxml
+    requests
+    slixmpp
+    websockets
+  ];
+
+  checkInputs = [
+    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/gemfileparser/default.nix b/nixpkgs/pkgs/development/python-modules/gemfileparser/default.nix
new file mode 100644
index 000000000000..8aa4b8192319
--- /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";
+  };
+
+  checkInputs = [
+    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 = teams.determinatesystems.members;
+  };
+}
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..3989cf6f72c6
--- /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.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "bfacdcadd7903ed6afce6168e1977e473b431677b358f8fd42e80b48cedd19ab";
+  };
+
+  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..98e601140d49
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/generic/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, exceptiongroup
+, poetry-core
+}:
+
+buildPythonPackage rec {
+  pname = "generic";
+  version = "1.1.0";
+  disabled = pythonOlder "3.7";
+
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-/947oEvZSD5mjRD9qcuzKAFativTmaeejXxQ322UD+A=";
+  };
+
+  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";
+    license = licenses.bsdOriginal;
+  };
+}
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..019c1e1a21bc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/geniushub-client/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, aiohttp
+}:
+
+buildPythonPackage rec {
+  pname = "geniushub-client";
+  version = "0.6.30";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "390932b6e5051e221d104b2683d9deb6e352172c4ec4eeede0954bf2f9680211";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  # tests only implemented after 0.6.30
+  doCheck = false;
+
+  pythonImportsCheck = [ "geniushubclient" ];
+
+  meta = with lib; {
+    description = "Aiohttp-based client for Genius Hub systems";
+    homepage = "https://github.com/zxdavb/geniushub-client";
+    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..5b7600efe835
--- /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;
+    sha256 = "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 = [ maintainers.costrouc ];
+  };
+}
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..6dd458fefb4f
--- /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;
+    sha256 = "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..3a6fc0d254a9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gensim/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, cython
+, fetchPypi
+, mock
+, numpy
+, scipy
+, smart-open
+, testfixtures
+, pyemd
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "gensim";
+  version = "4.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-mV69KXCjHUfBAKqsECEvR+K/EuKwZTbTiIPJUf807vE=";
+  };
+
+  nativeBuildInputs = [
+    cython
+  ];
+
+  propagatedBuildInputs = [
+    smart-open
+    numpy
+    scipy
+  ];
+
+  checkInputs = [
+    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/";
+    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..14e1fc1c6098
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gentools/default.nix
@@ -0,0 +1,31 @@
+{ buildPythonPackage, lib, fetchFromGitHub, pytest
+, typing ? null, funcsigs ? null, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "gentools";
+  version = "1.1.0";
+
+  # Pypi doesn't ship the tests, so we fetch directly from GitHub
+  src = fetchFromGitHub {
+    owner = "ariebovenberg";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1sm6cqi7fv2k3pc68r7wvvjjz8y6cjmz8bvxgqfa4v4wxibwnwrl";
+  };
+
+  propagatedBuildInputs =
+    lib.optionals (pythonOlder "3.5") [ typing ] ++
+    lib.optionals (pythonOlder "3.4") [ funcsigs ];
+
+  checkInputs = [ pytest ];
+  checkPhase = "pytest";
+
+  meta = with lib; {
+    description = "Tools for generators, generator functions, and generator-based coroutines";
+    license = licenses.mit;
+    homepage = "https://gentools.readthedocs.io/";
+    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..db1996a90871
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/geoalchemy2/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, packaging
+, setuptools-scm
+, shapely
+, sqlalchemy
+, alembic
+, psycopg2
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "GeoAlchemy2";
+  version = "0.12.3";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-MSgMZF3EoPkMHSmdL1x9WrZ8eENTW0ULTCq4ifAB4EI=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    packaging
+    shapely
+    sqlalchemy
+  ];
+
+  checkInputs = [
+    alembic
+    psycopg2
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    # tests require live postgis database
+    "--deselect=tests/test_pickle.py::TestPickle::test_pickle_unpickle"
+    "--deselect=tests/gallery/test_specific_compilation.py::test_specific_compilation"
+  ];
+
+  disabledTestPaths = [
+    # tests require live postgis database
+    "tests/gallery/test_decipher_raster.py"
+    "tests/gallery/test_length_at_insert.py"
+    "tests/gallery/test_summarystatsagg.py"
+    "tests/gallery/test_type_decorator.py"
+    "tests/test_functional.py"
+    "tests/test_functional_postgresql.py"
+    "tests/test_alembic_migrations.py"
+  ];
+
+  pythonImportsCheck = [
+    "geoalchemy2"
+  ];
+
+  meta = with lib; {
+    description = "Toolkit for working with spatial databases";
+    homepage =  "http://geoalchemy.org/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+
+}
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..df537283efce
--- /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}";
+    sha256 = "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..12a542af509d
--- /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;
+    sha256 = "sha256-9/Qchdw+HC09k17IZmDcOyyEjIPhf5qeUbqdUUahWFk=";
+  };
+
+  checkInputs = [
+    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/geoip2/default.nix b/nixpkgs/pkgs/development/python-modules/geoip2/default.nix
new file mode 100644
index 000000000000..65f938fd6a97
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/geoip2/default.nix
@@ -0,0 +1,41 @@
+{ buildPythonPackage, lib, fetchPypi, pythonOlder
+, aiohttp
+, maxminddb
+, mocket
+, requests
+, requests-mock
+, urllib3
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  version = "4.6.0";
+  pname = "geoip2";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-8OgLzoCwa7OL0Iv0h31ahONU6TIJXmzPtNJ7tZj6T4M=";
+  };
+
+  patchPhase = ''
+    substituteInPlace requirements.txt --replace "requests>=2.24.0,<3.0.0" "requests"
+  '';
+
+  propagatedBuildInputs = [ aiohttp maxminddb requests urllib3 ];
+
+  checkInputs = [
+    mocket
+    requests-mock
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "geoip2" ];
+
+  meta = with lib; {
+    description = "GeoIP2 webservice client and database reader";
+    homepage = "https://github.com/maxmind/GeoIP2-python";
+    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..c67f40e799ce
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/geojson-client/default.nix
@@ -0,0 +1,47 @@
+{ 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 = "v${version}";
+    sha256 = "sha256-nzM5P1ww6yWM3e2v3hRw0ECoYmRPhTs0Q7Wwicl+IpU=";
+  };
+
+  propagatedBuildInputs = [
+    geojson
+    haversine
+    pytz
+    requests
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "geojson_client"
+  ];
+
+  meta = with lib; {
+    description = "Python module for convenient access to GeoJSON feeds";
+    homepage = "https://github.com/exxamalte/python-geojson-client";
+    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..b762434fb65a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/geojson/default.nix
@@ -0,0 +1,23 @@
+{ lib, buildPythonPackage, fetchPypi, glibcLocales }:
+
+buildPythonPackage rec {
+  pname = "geojson";
+  version = "2.5.0";
+
+  format = "wheel";
+
+  src = fetchPypi {
+    inherit pname version format;
+    sha256 = "1filqm050ixy53kdv81bd4n80vjvfapnmzizy7jg8a6pilv17gfc";
+  };
+
+  LC_ALL = "en_US.UTF-8";
+  checkInputs = [ glibcLocales ];
+
+  meta = {
+    homepage = "https://github.com/frewsxcv/python-geojson";
+    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..bace792ee84a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/geomet/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, click
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "geomet";
+  version = "0.3.0";
+
+  # pypi tarball doesn't include tests
+  src = fetchFromGitHub {
+    owner = "geomet";
+    repo = "geomet";
+    rev = version;
+    sha256 = "1lb0df78gkivsb7hy3ix0xccvcznvskip11hr5sgq5y76qnfc8p0";
+  };
+
+  propagatedBuildInputs = [ click six ];
+
+  meta = with lib; {
+    homepage = "https://github.com/geomet/geomet";
+    license = licenses.asl20;
+    description = "Convert GeoJSON to WKT/WKB (Well-Known Text/Binary), and vice versa.";
+    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..89f1e73ed9af
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/geometric/default.nix
@@ -0,0 +1,33 @@
+{ buildPythonPackage, lib, fetchFromGitHub
+, networkx, numpy, scipy, six
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "geometric";
+  version = "0.9.7.2";
+
+  src = fetchFromGitHub {
+    owner = "leeping";
+    repo = "geomeTRIC";
+    rev = version;
+    hash = "sha256-QFpfY6tWqcda6AJT17YBEuwu/4DYPbIMJU1c9/gHjaA=";
+  };
+
+  propagatedBuildInputs = [
+    networkx
+    numpy
+    scipy
+    six
+  ];
+
+  checkInputs = [ 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..02601febe6a2
--- /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.11.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "geopandas";
+    repo = "geopandas";
+    rev = "v${version}";
+    hash = "sha256-w3F2Uqr/+DdG2Td5YmHdF/LII2y29rQkGK5ooMUcfRk=";
+  };
+
+  propagatedBuildInputs = [
+    fiona
+    packaging
+    pandas
+    pyproj
+    shapely
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    Rtree
+  ];
+
+  doCheck = !stdenv.isDarwin;
+
+  preCheck = ''
+    export HOME=$(mktemp -d);
+  '';
+
+  disabledTests = [
+    # Requires network access
+    "test_read_file_remote_geojson_url"
+    "test_read_file_remote_zipfile_url"
+  ];
+
+  pytestFlagsArray = [
+    "geopandas"
+  ];
+
+  pythonImportsCheck = [
+    "geopandas"
+  ];
+
+  meta = with lib; {
+    description = "Python geospatial data analysis framework";
+    homepage = "https://geopandas.org";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ knedlsepp ];
+  };
+}
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..3ef58b9ec470
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/geopy/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, async_generator
+, buildPythonPackage
+, docutils
+, fetchFromGitHub
+, geographiclib
+, pytestCheckHook
+, pythonOlder
+, pytz
+}:
+
+buildPythonPackage rec {
+  pname = "geopy";
+  version = "2.2.0";
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-zFz0T/M/CABKkChuiKsFkWj2pphZuFeE5gz0HxZYaz8=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "geographiclib<2,>=1.49" "geographiclib"
+  '';
+
+  propagatedBuildInputs = [
+    geographiclib
+  ];
+
+  checkInputs = [
+    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..09365ff58586
--- /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}";
+    sha256 = "sha256-D1ggfEDU+vlFmi1USwdHj1due0PrCQCpKF4zaarHCFs=";
+  };
+
+  propagatedBuildInputs = [
+    haversine
+    xmltodict
+    requests
+    dateparser
+  ];
+
+  checkInputs = [
+    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..4345505f310c
--- /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}";
+    sha256 = "sha256-58NpACrJK29NUnx3RrsLFPPo+6A/JlIlkrv8N9juMu0=";
+  };
+
+  propagatedBuildInputs = [
+    georss-client
+  ];
+
+  checkInputs = [
+    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..ae923138d295
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/georss-ign-sismologia-client/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, georss-client
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "georss-ign-sismologia-client";
+  version = "0.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "exxamalte";
+    repo = "python-georss-ign-sismologia-client";
+    rev = "v${version}";
+    hash = "sha256-i3VdxntFwieCmB4ihHRSCV5YKDyYytl3XnU/G1LwLhg=";
+  };
+
+  propagatedBuildInputs = [
+    georss-client
+  ];
+
+  checkInputs = [
+    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";
+    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..512db4d8deee
--- /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}";
+    sha256 = "sha256-zqjo70NzpUt5zNEar0P1sl/gMb+ZcS+7GX7QGuFjMYY=";
+  };
+
+  propagatedBuildInputs = [
+    georss-client
+  ];
+
+  checkInputs = [
+    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..344c74b057f4
--- /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
+  ];
+
+  checkInputs = [
+    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..fb4b0e753ab4
--- /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
+  ];
+
+  checkInputs = [
+    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..fc19ea105c69
--- /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
+  ];
+
+  checkInputs = [
+    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..74c1a9994987
--- /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
+  ];
+
+  checkInputs = [
+    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..89e01fedc13d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/get-video-properties/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, ffmpeg
+}:
+
+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}/bin/ffprobe'"
+  '';
+
+  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/getkey/default.nix b/nixpkgs/pkgs/development/python-modules/getkey/default.nix
new file mode 100644
index 000000000000..c0cbec29145a
--- /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
+  '';
+
+  checkInputs = [
+    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..79f85ad95674
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/getmac/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-benchmark
+, pytest-mock
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "getmac";
+  version = "0.8.3";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "GhostofGoes";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-X4uuYisyobCxhoywaSXBZjVxrPAbBiZrWUJAi2/P5mw=";
+  };
+
+  checkInputs = [
+    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"
+  ];
+
+  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";
+    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..e2b1e11278b7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gevent/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, isPyPy
+, python
+, libev
+, greenlet
+, zope_event
+, zope_interface
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "gevent";
+  version = "21.12.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-9ItkV4w2e5H6eTv46qr0mVy5PIvEWGDkc7+GgHCtCU4=";
+  };
+
+  buildInputs = [
+    libev
+  ];
+
+  propagatedBuildInputs = [
+    zope_event
+    zope_interface
+  ] ++ lib.optionals (!isPyPy) [
+    greenlet
+  ];
+
+  # Bunch of failures.
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "gevent"
+  ];
+
+  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..47aaeb37c033
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/geventhttpclient/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, brotli
+, buildPythonPackage
+, certifi
+, dpkt
+, fetchPypi
+, gevent
+, pytestCheckHook
+, pythonOlder
+, six
+, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "geventhttpclient";
+  version = "2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-SegzLaon80HeCNk4h4KJs7dzaVzblvIpZRjC1uPr7JI=";
+  };
+
+  propagatedBuildInputs = [
+    brotli
+    certifi
+    gevent
+    six
+  ];
+
+  checkInputs = [
+    dpkt
+    pytestCheckHook
+    urllib3
+  ];
+
+  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";
+    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..9b3b92784d79
--- /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";
+  };
+
+  checkInputs = [ 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..162ea67ad29d
--- /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.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "fastai";
+    repo = "ghapi";
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-yFJ7Ek2kfFvkZwjrvvx3AXKFE4vRVsLYTSHfs+nr0Rg=";
+  };
+
+  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..efbdc2f59f9a
--- /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";
+  };
+
+  checkInputs = [ 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..0552dbbf62dc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ghrepo-stats/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, matplotlib
+, PyGithub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "ghrepo-stats";
+  version = "0.3.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "mrbean-bremen";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-W6RhVnMuOgB4GNxczx3UlSeq0RWIM7yISKEvpnrE9uk=";
+  };
+
+  propagatedBuildInputs = [
+    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";
+    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..df3b70c000d7
--- /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";
+  };
+
+  checkInputs = [
+    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..144a48f59324
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gidgethub/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, uritemplate
+, pyjwt
+, pytestCheckHook
+, aiohttp
+, httpx
+, importlib-resources
+, pytest-asyncio
+, pytest-tornasync
+}:
+
+buildPythonPackage rec {
+  pname = "gidgethub";
+  version = "5.2.0";
+  format = "flit";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-w1m3aRlOcvmE0uMo3g7o64G3AjQrCkTcXOuskhBOz0s=";
+  };
+
+  propagatedBuildInputs = [
+    uritemplate
+    pyjwt
+  ];
+
+  checkInputs = [
+    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 = [ maintainers.costrouc ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gigalixir/default.nix b/nixpkgs/pkgs/development/python-modules/gigalixir/default.nix
new file mode 100644
index 000000000000..ab05ccfc3b30
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gigalixir/default.nix
@@ -0,0 +1,70 @@
+{ stdenv
+, lib
+, buildPythonApplication
+, click
+, fetchPypi
+, git
+, httpretty
+, qrcode
+, pygments
+, pyopenssl
+, pytestCheckHook
+, requests
+, rollbar
+, stripe
+, pythonOlder
+, sure
+}:
+
+buildPythonApplication rec {
+  pname = "gigalixir";
+  version = "1.2.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-a2kU5vUSiOg0yFvGLxE2Edgyrar7psBD4NPEmDsP3IY=";
+  };
+
+  propagatedBuildInputs = [
+    click
+    pygments
+    pyopenssl
+    qrcode
+    requests
+    rollbar
+    stripe
+  ];
+
+  checkInputs = [
+    git
+    httpretty
+    pytestCheckHook
+    sure
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "'pytest-runner'," "" \
+      --replace "cryptography==" "cryptography>="
+  '';
+
+  disabledTests = [
+    # Test requires network access
+    "test_rollback_without_version"
+  ];
+
+  pythonImportsCheck = [
+    "gigalixir"
+  ];
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    description = "Gigalixir Command-Line Interface";
+    homepage = "https://github.com/gigalixir/gigalixir-cli";
+    license = licenses.mit;
+    maintainers = with 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..559723862625
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gios/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, aiohttp
+, aioresponses
+, buildPythonPackage
+, dacite
+, fetchFromGitHub
+, pytest-asyncio
+, pytest-error-for-skips
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "gios";
+  version = "2.1.0";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "bieniu";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-WjuDsu0EA+KtErusw5VADyvleVegXHCTEkuQ1lU/SRU=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    dacite
+  ];
+
+  checkInputs = [
+    aioresponses
+    pytest-asyncio
+    pytest-error-for-skips
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "--cov --cov-report term-missing " ""
+    substituteInPlace setup.py \
+      --replace "pytest-runner" ""
+  '';
+
+  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";
+    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..85d17ee3ab8a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gipc/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, gevent
+}:
+
+buildPythonPackage rec {
+  pname = "gipc";
+  version = "1.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-P8d2GIxFAAHeXjXgIxKGwahiH1TW/9fE+V0f9Ra54wo=";
+  };
+
+  propagatedBuildInputs = [ gevent ];
+
+  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..bcc4148c1953
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/git-annex-adapter/default.nix
@@ -0,0 +1,53 @@
+{ 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=";
+    })
+    (substituteAll {
+      src = ./git-annex-path.patch;
+      gitAnnex = "${git-annex}/bin/git-annex";
+    })
+  ];
+
+  checkInputs = [
+    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..e6a434c38bd3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/git-filter-repo/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "git-filter-repo";
+  version = "2.34.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-taCfODhl3goWSwa6F0Rh5V2RZ8xvuwbPKh5i2/DNumM=";
+  };
+
+  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..b4a771a4c3be
--- /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}";
+    sha256 = "sha256-xV1Z9O5FO4Q/XEpNwnX31tbv8CrXY+wF1Ltpfq+ITRg=";
+  };
+
+  disabled = pythonOlder "3.8";
+
+  checkInputs = [ 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..2d7da28535cf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/git-sweep/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, GitPython
+}:
+
+buildPythonPackage rec {
+  pname = "git-sweep";
+  version = "0.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1csp0zd049d643d409rfivbswwzrayb4i6gkypp5mc27fb1z2afd";
+  };
+
+  propagatedBuildInputs = [ GitPython ];
+
+  # 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/gitdb/default.nix b/nixpkgs/pkgs/development/python-modules/gitdb/default.nix
new file mode 100644
index 000000000000..0895270d6c9c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gitdb/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, smmap
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "gitdb";
+  version = "4.0.9";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "bac2fd45c0a1c9cf619e63a90d62bdc63892ef92387424b855792a6cabe789aa";
+  };
+
+  propagatedBuildInputs = [ smmap ];
+
+  postPatch = ''
+    substituteInPlace setup.py --replace ",<4" ""
+  '';
+
+  # Bunch of tests fail because they need an actual git repo
+  doCheck = false;
+
+  meta = {
+    description = "Git Object Database";
+    maintainers = [ ];
+    homepage = "https://github.com/gitpython-developers/gitdb";
+    license = lib.licenses.bsd3;
+  };
+}
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..dbdc4be45900
--- /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;
+    sha256 = "sha256-4wkwtcChcR7XH421wa3dGdIPhwgeaTFk247zIRX98xo=";
+  };
+
+  propagatedBuildInputs = [
+    sqlite-utils
+    pyyaml
+    requests
+  ];
+
+  checkInputs = [
+    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..08786916bd99
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/github3_py/default.nix
@@ -0,0 +1,55 @@
+{ 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;
+    sha256 = "sha256-Cbcr4Ul9NGsJaM3oNgoNavedwgbQFJpjzT7IbGXDd8w=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    uritemplate
+    python-dateutil
+    pyjwt
+  ];
+
+  checkInputs = [
+    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/glad/default.nix b/nixpkgs/pkgs/development/python-modules/glad/default.nix
new file mode 100644
index 000000000000..9d05720d84df
--- /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;
+    sha256 = "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; [ superherointj ];
+  };
+}
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..79f30b89d31d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/glances-api/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, httpx
+, poetry-core
+, pytest-asyncio
+, pytest-httpx
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "glances-api";
+  version = "0.3.6";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "home-assistant-ecosystem";
+    repo = "python-glances-api";
+    rev = version;
+    sha256 = "sha256-2H8S08tntCNKwMw553/wuWLXmri7b2tLxFlgCDJWQNQ=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    httpx
+  ];
+
+  checkInputs = [
+    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";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/glasgow/default.nix b/nixpkgs/pkgs/development/python-modules/glasgow/default.nix
new file mode 100644
index 000000000000..a8f658ac83a9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/glasgow/default.nix
@@ -0,0 +1,77 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, setuptools-scm
+, pythonOlder
+, sdcc
+, amaranth
+, fx2
+, libusb1
+, aiohttp
+, pyvcd
+, bitarray
+, crcmod
+, yosys
+, icestorm
+, nextpnr
+}:
+
+buildPythonPackage rec {
+  pname = "glasgow";
+  version = "unstable-2021-12-12";
+  disabled = pythonOlder "3.7";
+  # python software/setup.py --version
+  realVersion = "0.1.dev1679+g${lib.substring 0 7 src.rev}";
+
+  src = fetchFromGitHub {
+    owner = "GlasgowEmbedded";
+    repo = "glasgow";
+    rev = "e640a778c446b7e9812727e73c560d12aeb41d7c";
+    sha256 = "EsQ9ZjalKDQ54JOonra4yPDI56cF5n86y/Rd798cZsU=";
+  };
+
+  nativeBuildInputs = [ setuptools-scm sdcc ];
+
+  propagatedBuildInputs = [
+    setuptools
+    amaranth
+    fx2
+    libusb1
+    aiohttp
+    pyvcd
+    bitarray
+    crcmod
+  ];
+
+  checkInputs = [ yosys icestorm nextpnr ];
+
+  enableParallelBuilding = true;
+
+  preBuild = ''
+    make -C firmware LIBFX2=${fx2}/share/libfx2
+    cp firmware/glasgow.ihex software/glasgow
+    cd software
+    export SETUPTOOLS_SCM_PRETEND_VERSION="${realVersion}"
+  '';
+
+  # installCheck tries to build_ext again
+  doInstallCheck = false;
+
+  checkPhase = ''
+    python -W ignore::DeprecationWarning test.py
+  '';
+
+  makeWrapperArgs = [
+    "--set" "YOSYS" "${yosys}/bin/yosys"
+    "--set" "ICEPACK" "${icestorm}/bin/icepack"
+    "--set" "NEXTPNR_ICE40" "${nextpnr}/bin/nextpnr-ice40"
+  ];
+
+  meta = with lib; {
+    description = "Software for Glasgow, a digital interface multitool";
+    homepage = "https://github.com/GlasgowEmbedded/Glasgow";
+    license = licenses.bsd0;
+    maintainers = with maintainers; [ emily thoughtpolice ];
+  };
+}
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..a9306c181864
--- /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.3.6";
+
+  src = fetchFromGitHub {
+    owner = "moderngl";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-fE1fyoKQz1jmTBcAz2CbkLjRfgN5QedpMOLMU8keIZs=";
+  };
+
+  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..97ff89852d3b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/glean-parser/default.nix
@@ -0,0 +1,74 @@
+{ lib
+, appdirs
+, buildPythonPackage
+, click
+, diskcache
+, fetchPypi
+, jinja2
+, jsonschema
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, setuptools-scm
+, yamllint
+}:
+
+buildPythonPackage rec {
+  pname = "glean-parser";
+  version = "6.1.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    pname = "glean_parser";
+    inherit version;
+    hash = "sha256-EqD+ztwRRNd/pXHgQi/z/qTbrcOB1jG+qACmsvWPT38=";
+  };
+
+  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
+  ];
+
+  checkInputs = [
+    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";
+    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..8ede9275db89
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/glean-sdk/default.nix
@@ -0,0 +1,73 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, cargo
+, cffi
+, fetchPypi
+, glean-parser
+, iso8601
+, pytest-localserver
+, pytestCheckHook
+, pythonOlder
+, rustc
+, rustPlatform
+, setuptools-rust
+}:
+
+buildPythonPackage rec {
+  pname = "glean-sdk";
+  version = "51.1.0";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Rt+N/sqX7IyoXbytzF9UkyXsx0vQXbGs+XJkaMhevE0=";
+  };
+
+  cargoDeps = rustPlatform.fetchCargoTarball {
+    inherit src;
+    name = "${pname}-${version}";
+    hash = "sha256-oY94YVs6I+/klogyajBoCrYexp9oUSrQ6znWVbigf2E=";
+  };
+
+  nativeBuildInputs = [
+    cargo
+    rustc
+    rustPlatform.cargoSetupHook
+    setuptools-rust
+  ];
+
+  propagatedBuildInputs = [
+    cffi
+    glean-parser
+    iso8601
+  ];
+
+  checkInputs = [
+    pytest-localserver
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # RuntimeError: No ping received.
+    "test_client_activity_api"
+  ];
+
+  postPatch = ''
+    substituteInPlace glean-core/python/setup.py \
+      --replace "glean_parser==5.0.1" "glean_parser>=5.0.1"
+  '';
+
+  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 = [];
+  };
+}
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..5eac6a3f2c2f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/glfw/default.nix
@@ -0,0 +1,31 @@
+{ lib, buildPythonPackage, fetchFromGitHub, glfw3 }:
+
+buildPythonPackage rec {
+  pname = "glfw";
+  version = "2.5.4";
+
+  src = fetchFromGitHub {
+    owner = "FlorianRhiem";
+    repo = "pyGLFW";
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-4Ym3Vmkf+HwORbhR72Ws/cqLkNMPCY8FL35O2hSalGQ=";
+  };
+
+  # 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";
+    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..29028e6d32d8
--- /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 = [ maintainers.costrouc ];
+  };
+}
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..5debd1d0ab65
--- /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";
+  };
+
+  checkInputs = [ 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..cffe24b07e8e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/globus-sdk/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, buildPythonPackage
+, cryptography
+, fetchFromGitHub
+, mypy
+, pyjwt
+, pytestCheckHook
+, pythonOlder
+, requests
+, responses
+, six
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "globus-sdk";
+  version = "3.10.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "globus";
+    repo = "globus-sdk-python";
+    rev = "refs/tags/${version}";
+    hash = "sha256-Un6Fv1Lh4HdYwdU/iR+5JFcPjY2NrFfC9+MkGuaTF8M=";
+  };
+
+  propagatedBuildInputs = [
+    cryptography
+    requests
+    pyjwt
+  ] ++ lib.optionals (pythonOlder "3.10") [
+    typing-extensions
+  ];
+
+  checkInputs = [
+    mypy
+    pytestCheckHook
+    responses
+    six
+  ];
+
+  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";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ixxie ];
+  };
+}
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..5f8ab55e9088
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/glom/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, boltons
+, attrs
+, face
+, pytestCheckHook
+, pyyaml
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "glom";
+  version = "22.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-FRDGWHqPnGSiRmQbcAM8vF696Z8CrSRWk2eAOOghrrU=";
+  };
+
+  propagatedBuildInputs = [
+    boltons
+    attrs
+    face
+  ];
+
+  checkInputs = [
+    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"
+  ];
+
+  pythonImportsCheck = [
+    "glom"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/mahmoud/glom";
+    description = "Restructuring data, the Python way";
+    longDescription = ''
+      glom helps pull together objects from other objects in a
+      declarative, dynamic, and downright simple way.
+    '';
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ twey ];
+  };
+}
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..40748f86954e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/glymur/default.nix
@@ -0,0 +1,57 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, numpy
+, scikitimage
+, openjpeg
+, procps
+, pytestCheckHook
+, contextlib2
+, mock
+, importlib-resources
+, isPy27
+, lxml
+}:
+
+buildPythonPackage rec {
+  pname = "glymur";
+  version = "0.9.3";
+
+  src = fetchFromGitHub {
+    owner = "quintusdias";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1xlpax56qg5qqh0s19xidgvv2483sc684zj7rh6zw1m1z9m37drr";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+  ] ++ lib.optional isPy27 [ contextlib2 mock importlib-resources ];
+
+  checkInputs = [
+    scikitimage
+    procps
+    pytestCheckHook
+    lxml
+  ];
+
+  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"
+  ];
+
+
+  meta = with lib; {
+    description = "Tools for accessing JPEG2000 files";
+    homepage = "https://github.com/quintusdias/glymur";
+    license = licenses.mit;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..67cd4093374b
--- /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.0.7";
+
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "googlefonts";
+    repo = "glyphsLib";
+    rev = "v${version}";
+    sha256 = "sha256-PrHK9uEgs0DcNYW6EQ5Qw29CN4R2OcxOHrMeIswsxdA=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  propagatedBuildInputs = [
+    fonttools
+    openstep-plist
+    ufoLib2
+    unicodedata2
+    ufonormalizer
+    xmldiff
+    defcon
+    ufo2ft
+    skia-pathops
+  ];
+
+  checkInputs = [ 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..c0522587724a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gmpy/default.nix
@@ -0,0 +1,24 @@
+{ buildPythonPackage, fetchurl, isPyPy, gmp } :
+
+let
+  pname = "gmpy";
+  version = "1.17";
+in
+
+buildPythonPackage {
+  inherit pname version;
+
+  disabled = isPyPy;
+
+  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..27f6d8538d8b
--- /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}";
+    sha256 = "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..6a3b4cb4647a
--- /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;
+    sha256 = "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..d21b6335a7ff
--- /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.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-PveHE317p5fGSxgx7LQkpRYF55HwdzpZFY8/F8s3CBQ=";
+  };
+
+  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/goobook/default.nix b/nixpkgs/pkgs/development/python-modules/goobook/default.nix
new file mode 100644
index 000000000000..e196f0ec09d8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/goobook/default.nix
@@ -0,0 +1,43 @@
+{ lib, buildPythonPackage, fetchPypi, isPy3k
+, docutils, installShellFiles
+, google-api-python-client, simplejson, oauth2client, setuptools, xdg
+}:
+
+buildPythonPackage rec {
+  pname = "goobook";
+  version = "3.5.2";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-i24Hh10iXFUiWVgokMs7f8ZpIVN/ZEF421tfa2ByQ4c=";
+  };
+
+  nativeBuildInputs = [ docutils installShellFiles ];
+  propagatedBuildInputs = [
+    google-api-python-client simplejson oauth2client setuptools xdg
+  ];
+
+  postInstall = ''
+    rst2man goobook.1.rst goobook.1
+    installManPage goobook.1
+  '';
+
+  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.python.org/pypi/goobook";
+    changelog   = "https://gitlab.com/goobook/goobook/-/blob/${version}/CHANGES.rst";
+    license     = licenses.gpl3;
+    maintainers = with maintainers; [ primeos ];
+    platforms   = platforms.unix;
+  };
+}
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..65cf304acc24
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/goocalendar/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, pkg-config
+, gtk3
+, gobject-introspection
+, pygobject3
+, goocanvas2
+, isPy3k
+ }:
+
+buildPythonPackage rec {
+  pname = "GooCalendar";
+  version = "0.7.2";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "318b3b7790ac9d6d98881eee3b676fc9c17fc15d21dcdaff486e3c303333b41a";
+  };
+
+  nativeBuildInputs = [
+    pkg-config
+    gobject-introspection
+  ];
+
+  propagatedBuildInputs = [
+    pygobject3
+  ];
+
+  buildInputs = [
+    gtk3
+    goocanvas2
+  ];
+
+  # No upstream tests available
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A calendar widget for GTK using PyGoocanvas.";
+    homepage = "https://goocalendar.tryton.org/";
+    license = licenses.gpl2;
+    maintainers = [ 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..3d4fd154c3f2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/goodwe/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "goodwe";
+  version = "0.2.19";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "marcelblijleven";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-H3N0hAJsjBX3pQ2i03r4MRBQQLCXjLhftokZQx0bF80=";
+  };
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "'marcelblijleven@gmail.com" "marcelblijleven@gmail.com" \
+      --replace "version: file: VERSION" "version = ${version}"
+  '';
+
+  pythonImportsCheck = [
+    "goodwe"
+  ];
+
+  meta = with lib; {
+    description = "Python library for connecting to GoodWe inverter";
+    homepage = "https://github.com/marcelblijleven/goodwe";
+    license = licenses.mit;
+    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..50b58e5a3f15
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-api-core/default.nix
@@ -0,0 +1,80 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, google-auth
+, googleapis-common-protos
+, grpcio
+, grpcio-status
+, protobuf
+, proto-plus
+, requests
+, mock
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "google-api-core";
+  version = "2.8.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-BvckTGQDIrUIsSWQO7VwG+urzogy+Fq6kzXsALPQLtw=";
+  };
+
+  propagatedBuildInputs = [
+    googleapis-common-protos
+    google-auth
+    grpcio
+    grpcio-status
+    protobuf
+    proto-plus
+    requests
+  ];
+
+  checkInputs = [
+    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; [ SuperSandro2000 ];
+  };
+}
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..1997d88821b3
--- /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.53.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-kEs9aH4otT9N3iNrReRDxjh+FzYU6ZGD3FuKzb03DRg=";
+  };
+
+  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..0109175ab85c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-auth-httplib2/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, flask
+, google-auth
+, httplib2
+, mock
+, pytestCheckHook
+, pytest-localserver
+}:
+
+buildPythonPackage rec {
+  pname = "google-auth-httplib2";
+  version = "0.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a07c39fd632becacd3f07718dfd6021bf396978f03ad3ce4321d060015cc30ac";
+  };
+
+  propagatedBuildInputs = [
+    google-auth
+    httplib2
+  ];
+
+  checkInputs = [
+    flask
+    mock
+    pytestCheckHook
+    pytest-localserver
+  ];
+
+  meta = with lib; {
+    description = "Google Authentication Library: httplib2 transport";
+    homepage = "https://github.com/GoogleCloudPlatform/google-auth-library-python-httplib2";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..d5e7848b3e46
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-auth-oauthlib/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, click
+, mock
+, pytestCheckHook
+, google-auth
+, requests-oauthlib
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "google-auth-oauthlib";
+  version = "0.5.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-1emKcSAzMGmfkqJrwIhHqS6MOxuNgqAh8a80Fk2xQ64=";
+  };
+
+  propagatedBuildInputs = [
+    google-auth
+    requests-oauthlib
+  ];
+
+  checkInputs = [
+    click
+    mock
+    pytestCheckHook
+  ];
+
+  disabledTests = lib.optionals stdenv.isDarwin [
+    "test_run_local_server"
+  ];
+
+  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; [ SuperSandro2000 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..f1aba037ee01
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-auth/default.nix
@@ -0,0 +1,101 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchPypi
+, cachetools
+, pyasn1-modules
+, rsa
+, six
+, aiohttp
+, cryptography
+, pyopenssl
+, pyu2f
+, requests
+, aioresponses
+, asynctest
+, flask
+, freezegun
+, grpcio
+, mock
+, oauth2client
+, pytest-asyncio
+, pytest-localserver
+, pytestCheckHook
+, responses
+, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "google-auth";
+  version = "2.9.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-FCkvo0KfK7HpmGJVTN4e5zDWhA664GeBTT0V2FScCIg=";
+  };
+
+  propagatedBuildInputs = [
+    cachetools
+    pyasn1-modules
+    rsa
+    six
+  ];
+
+  passthru.optional-dependencies = {
+    aiohttp = [
+      aiohttp
+      requests
+    ];
+    enterprise_cert = [
+      cryptography
+      pyopenssl
+    ];
+    pyopenssl = [
+      pyopenssl
+    ];
+    reauth = [
+      pyu2f
+    ];
+  };
+
+  checkInputs = [
+    aioresponses
+    asynctest
+    flask
+    freezegun
+    grpcio
+    mock
+    oauth2client
+    pytest-asyncio
+    pytest-localserver
+    pytestCheckHook
+    responses
+    urllib3
+  ] ++ passthru.optional-dependencies.aiohttp
+  ++ passthru.optional-dependencies.enterprise_cert
+  ++ passthru.optional-dependencies.reauth;
+
+  pythonImportsCheck = [
+    "google.auth"
+    "google.oauth2"
+  ];
+
+  disabledTestPaths = [
+    # Disable tests related to pyopenssl
+    "tests/transport/test__mtls_helper.py"
+    "tests/transport/test_requests.py"
+    "tests/transport/test_urllib3.py"
+  ];
+
+  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; [ SuperSandro2000 ];
+  };
+}
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..0f75cccfac75
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-access-context-manager/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-access-context-manager";
+  version = "0.1.14";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-GFS9VvdXHxP1KvJzQkgjmYXO3qpMXl8yICGZEr18O8M=";
+  };
+
+  propagatedBuildInputs = [
+    google-api-core
+  ];
+
+  # 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";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ austinbutler SuperSandro2000 ];
+  };
+}
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..5378243fe1a6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-appengine-logging/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, grpc-google-iam-v1
+, mock
+, proto-plus
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-appengine-logging";
+  version = "1.1.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-pTakW1aYx5KlU8vgOXwu4kJDI4nEVi2y0YE0pTo3k30=";
+  };
+
+  propagatedBuildInputs = [
+    google-api-core
+    grpc-google-iam-v1
+    proto-plus
+  ];
+
+  checkInputs = [
+    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";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..b62326fac138
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-asset/default.nix
@@ -0,0 +1,62 @@
+{ 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
+, proto-plus
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, mock
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-asset";
+  version = "3.11.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-d/eDAp8QuXr2Zh/zk9ONeKd+SdmqXlugdpx9t1hkMIM=";
+  };
+
+  propagatedBuildInputs = [
+    grpc-google-iam-v1
+    google-api-core
+    google-cloud-access-context-manager
+    google-cloud-org-policy
+    google-cloud-os-config
+    libcst
+    proto-plus
+  ];
+
+  checkInputs = [
+    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";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..2fae768eb3a3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-audit-log/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchPypi, googleapis-common-protos, protobuf }:
+
+buildPythonPackage rec {
+  pname = "google-cloud-audit-log";
+  version = "0.2.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-Yi8baD1TgpLr1zNH2i+CBeY+3gwL7Aq5nnmgZcSSZr0=";
+  };
+
+  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";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..19bac6c4b55d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-automl/default.nix
@@ -0,0 +1,70 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, libcst
+, google-api-core
+, google-cloud-storage
+, google-cloud-testutils
+, pandas
+, proto-plus
+, pytest-asyncio
+, mock
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-automl";
+  version = "2.8.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-kpi3RU66JEWt0guFPRtetBqn8F21qjE8kW1zc4oSBPM=";
+  };
+
+  propagatedBuildInputs = [
+    google-api-core
+    libcst
+    proto-plus
+  ];
+
+  checkInputs = [
+    google-cloud-storage
+    google-cloud-testutils
+    mock
+    pandas
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    # do not shadow imports
+    rm -r google
+  '';
+
+  disabledTestPaths = [
+    # requires credentials
+    "tests/system/gapic/v1beta1/test_system_tables_client_v1.py"
+  ];
+
+  disabledTests = [
+    # requires credentials
+    "test_prediction_client_client_info"
+  ];
+
+  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/python-automl";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..8adc7d1b25a3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-bigquery-datatransfer/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, libcst
+, proto-plus
+, pytestCheckHook
+, pytest-asyncio
+, pytz
+, mock
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-bigquery-datatransfer";
+  version = "3.7.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-WSFulX1aN+mSW3RTukXDe0N/BsLDQX2RKjqzPUsWb2Y=";
+  };
+
+  propagatedBuildInputs = [
+    google-api-core
+    libcst
+    proto-plus
+    pytz
+  ];
+
+  checkInputs = [
+    mock
+    pytestCheckHook
+    pytest-asyncio
+  ];
+
+  pythonImportsCheck = [
+    "google.cloud.bigquery_datatransfer"
+    "google.cloud.bigquery_datatransfer_v1"
+  ];
+
+  meta = with lib; {
+    description = "BigQuery Data Transfer API client library";
+    homepage = "https://github.com/googleapis/python-bigquery-datatransfer";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..97d3ec13e99a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-bigquery-logging/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, grpc-google-iam-v1
+, mock
+, proto-plus
+, pytest-asyncio
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-bigquery-logging";
+  version = "1.0.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-n8LMhjyZmWnb8ALrOZkKZ8Ctlo70zjyTRF9HxJIudmQ=";
+  };
+
+  propagatedBuildInputs = [
+    google-api-core
+    grpc-google-iam-v1
+    proto-plus
+  ];
+
+  checkInputs = [
+    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";
+    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..3e3a16f76ddb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-bigquery-storage/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, google-auth
+, google-cloud-bigquery
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-bigquery-storage";
+  version = "2.14.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-nOwHaJxFVEi023iapg51lmTXV+sGavKjXUFOXgDPb7g=";
+  };
+
+  propagatedBuildInputs = [
+    google-api-core
+  ];
+
+  checkInputs = [
+    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";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..c939217ccd09
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-bigquery/default.nix
@@ -0,0 +1,106 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, db-dtypes
+, freezegun
+, google-cloud-bigquery-storage
+, google-cloud-core
+, google-cloud-datacatalog
+, google-cloud-storage
+, google-cloud-testutils
+, google-resumable-media
+, ipython
+, mock
+, pandas
+, proto-plus
+, psutil
+, pyarrow
+, pytest-xdist
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-bigquery";
+  version = "3.3.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-S2gYVMAaQnK4AmHd8biofYAvxVmM7UTc/HuDPLAsDhg=";
+  };
+
+  propagatedBuildInputs = [
+    google-cloud-core
+    google-cloud-bigquery-storage
+    google-resumable-media
+    proto-plus
+    pyarrow
+  ];
+
+  checkInputs = [
+    db-dtypes
+    freezegun
+    google-cloud-testutils
+    ipython
+    mock
+    pandas
+    psutil
+    google-cloud-datacatalog
+    google-cloud-storage
+    pytestCheckHook
+    pytest-xdist
+  ];
+
+  # 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"
+  ];
+
+  disabledTestPaths = [
+    # requires 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; {
+    description = "Google BigQuery API client library";
+    homepage = "https://github.com/googleapis/python-bigquery";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..35e05bff0eff
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-bigtable/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, google-cloud-core
+, grpc-google-iam-v1
+, libcst
+, mock
+, proto-plus
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-bigtable";
+  version = "2.11.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-3IEedcFLM46M+luI3wx/Q0V4rhyGmkZyIy1oU0rHzII=";
+  };
+
+  propagatedBuildInputs = [
+    google-api-core
+    google-cloud-core
+    grpc-google-iam-v1
+    libcst
+    proto-plus
+  ];
+
+  checkInputs = [
+    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";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ costrouc ];
+  };
+}
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..1b03d5285972
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-container/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, grpc-google-iam-v1
+, libcst
+, mock
+, proto-plus
+, pytestCheckHook
+, pytest-asyncio
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-container";
+  version = "2.11.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-KVLM4ytQh8260JYd3oviCattfZa73e5p5dNXQMgRKQQ=";
+  };
+
+  propagatedBuildInputs = [
+    google-api-core
+    grpc-google-iam-v1
+    libcst
+    proto-plus
+  ];
+
+  checkInputs = [
+    mock
+    pytestCheckHook
+    pytest-asyncio
+  ];
+
+  disabledTests = [
+    # 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/python-container";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..54dd6cb837a3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-core/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, google-api-core
+, mock
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-core";
+  version = "2.3.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-NDNDWcsEGHvcgN3PYT5GLf16Oqu8P+TRGFF6tLkwPVM=";
+  };
+
+  propagatedBuildInputs = [ google-api-core ];
+
+  checkInputs = [ mock pytestCheckHook ];
+
+  # 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";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..a58768417059
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-datacatalog/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, libcst
+, google-api-core
+, grpc-google-iam-v1
+, proto-plus
+, pytest-asyncio
+, pytestCheckHook
+, mock
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-datacatalog";
+  version = "3.9.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-1VhEg22JMfUDeMT5/A1uX7jwqND4i0zVScFpMJKyCro=";
+  };
+
+  propagatedBuildInputs = [
+    libcst
+    google-api-core
+    grpc-google-iam-v1
+    proto-plus
+  ];
+
+  checkInputs = [
+    pytest-asyncio
+    pytestCheckHook
+    mock
+  ];
+
+  pythonImportsCheck = [
+    "google.cloud.datacatalog"
+  ];
+
+  meta = with lib; {
+    description = "Google Cloud Data Catalog API API client library";
+    homepage = "https://github.com/googleapis/python-datacatalog";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..568cf16eed29
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-dataproc/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, mock
+, libcst
+, proto-plus
+, pytestCheckHook
+, pytest-asyncio
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-dataproc";
+  version = "5.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-ldFvWqMTpSY2YHJ+I1vsrTiPESNoi3b055bthwwFjY4=";
+  };
+
+  propagatedBuildInputs = [
+    google-api-core
+    libcst
+    proto-plus
+  ];
+
+  checkInputs = [
+    mock
+    pytestCheckHook
+    pytest-asyncio
+  ];
+
+  disabledTests = [
+    # 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";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..133a59300215
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-datastore/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, google-cloud-core
+, libcst
+, proto-plus
+, mock
+, pytestCheckHook
+, pytest-asyncio
+, google-cloud-testutils
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-datastore";
+  version = "2.8.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-/zqsy+xrgmjsSrybBpwCfphTGGVp2AOp+ANsYPSrVfA=";
+  };
+
+  propagatedBuildInputs = [
+    google-api-core
+    google-cloud-core
+    libcst
+    proto-plus
+  ];
+
+  checkInputs = [
+    google-cloud-testutils
+    mock
+    pytestCheckHook
+    pytest-asyncio
+  ];
+
+  preCheck = ''
+    # directory shadows imports
+    rm -r google
+  '';
+
+  disabledTestPaths = [
+    # Requires credentials
+    "tests/system/test_allocate_reserve_ids.py"
+    "tests/system/test_query.py"
+    "tests/system/test_put.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";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..5478fa83934c
--- /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
+, libcst
+, proto-plus
+, pytestCheckHook
+, pytest-asyncio
+, pytz
+, mock
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-dlp";
+  version = "3.8.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-xidZ7EteyDUFxxXOXgSg6OUkzlIzEgnAMRledha0s/Y=";
+  };
+
+  propagatedBuildInputs = [
+    google-api-core
+    libcst
+    proto-plus
+    pytz
+  ];
+
+  checkInputs = [
+    google-cloud-testutils
+    mock
+    pytestCheckHook
+    pytest-asyncio
+  ];
+
+  disabledTests = [
+    # requires credentials
+    "test_inspect_content"
+  ];
+
+  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";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..00bedca7c4ca
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-dns/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, google-cloud-core
+, pytestCheckHook
+, mock
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-dns";
+  version = "0.34.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-RPpi7pPFHGxXIWBY2S0qkRa3E6SocanRajqDuZ4wwfk=";
+  };
+
+  propagatedBuildInputs = [ google-api-core google-cloud-core ];
+
+  checkInputs = [ 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";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..3a7b81e16b6d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-error-reporting/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, google-cloud-logging
+, google-cloud-testutils
+, libcst
+, mock
+, proto-plus
+, pytest-asyncio
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-error-reporting";
+  version = "1.6.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-o0q3/M8PiiIZr7swJusn21CIOKF2uCAebuavxNsA/Hg=";
+  };
+
+  propagatedBuildInputs = [
+    google-cloud-logging
+    libcst
+    proto-plus
+  ];
+
+  checkInputs = [
+    google-cloud-testutils
+    mock
+    pytestCheckHook
+    pytest-asyncio
+  ];
+
+  disabledTests = [
+    # 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";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..922d94c83caa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-firestore/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, aiounittest
+, google-api-core
+, google-cloud-testutils
+, google-cloud-core
+, mock
+, proto-plus
+, pytestCheckHook
+, pytest-asyncio
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-firestore";
+  version = "2.6.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-Iq+rOR7gMAfhn5WxfpFQ7s8MlwOxPm868DpgKg/sT/k=";
+  };
+
+  propagatedBuildInputs = [
+    google-api-core
+    google-cloud-core
+    proto-plus
+  ];
+
+  checkInputs = [
+    aiounittest
+    google-cloud-testutils
+    mock
+    pytestCheckHook
+    pytest-asyncio
+  ];
+
+  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";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..ca0db441abcf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-iam-logging/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, grpc-google-iam-v1
+, mock
+, proto-plus
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-iam-logging";
+  version = "1.0.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-JUrzCSON1oMVH0U1d4tfl1nGDc+IyIMOSL4PxEflDAU=";
+  };
+
+  propagatedBuildInputs = [
+    google-api-core
+    grpc-google-iam-v1
+    proto-plus
+  ];
+
+  checkInputs = [
+    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";
+    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..bf2af25a42bd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-iam/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+, google-api-core
+, libcst
+, mock
+, proto-plus
+, pytest-asyncio
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-iam";
+  version = "2.8.0";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-3SBQKRr/dpNqksC7wLNCz4Oda/i90BAZLcxN9oMYOsA=";
+  };
+
+  propagatedBuildInputs = [ google-api-core libcst proto-plus ];
+
+  checkInputs = [ mock pytestCheckHook pytest-asyncio ];
+
+  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";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ austinbutler SuperSandro2000 ];
+  };
+}
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..12b9bfd7f1ac
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-iot/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, grpc-google-iam-v1
+, google-api-core
+, libcst
+, proto-plus
+, pytestCheckHook
+, pytest-asyncio
+, mock
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-iot";
+  version = "2.6.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-eQPmfjtWUXxrrMgRgZ+pXc6lGP5bWq1VSecaHEvSk8I=";
+  };
+
+  propagatedBuildInputs = [ grpc-google-iam-v1 google-api-core libcst proto-plus ];
+
+  checkInputs = [ mock pytestCheckHook pytest-asyncio ];
+
+  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";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..0d6732392a10
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-kms/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, grpc-google-iam-v1
+, google-api-core
+, libcst
+, mock
+, proto-plus
+, pytest-asyncio
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-kms";
+  version = "2.12.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-ySlCL0Ukppob6Iuu2+fVQjPDsAnmK1Yvbd2I8+DVylk=";
+  };
+
+  propagatedBuildInputs = [ grpc-google-iam-v1 google-api-core libcst proto-plus ];
+
+  checkInputs = [ mock pytestCheckHook pytest-asyncio ];
+
+  # 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";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..8cb9f8f9418d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-language/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, libcst
+, mock
+, proto-plus
+, pytestCheckHook
+, pytest-asyncio
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-language";
+  version = "2.5.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-+ECYt4DRf8UO/MIpaOiGITTp3ep1+nhbtUEA3t9G3aU=";
+  };
+
+  propagatedBuildInputs = [
+    google-api-core
+    libcst
+    proto-plus
+  ];
+
+  checkInputs = [
+    mock
+    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/python-language";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..e08ee40aa00d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-logging/default.nix
@@ -0,0 +1,70 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, django
+, flask
+, google-api-core
+, google-cloud-appengine-logging
+, google-cloud-audit-log
+, google-cloud-core
+, google-cloud-testutils
+, mock
+, proto-plus
+, pytestCheckHook
+, pytest-asyncio
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-logging";
+  version = "3.2.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-oREcVPdcbbBFMQz55xLm8Q0bemTrVwsj+4ew73A11Kw=";
+  };
+
+  propagatedBuildInputs = [
+    google-api-core
+    google-cloud-appengine-logging
+    google-cloud-audit-log
+    google-cloud-core
+    proto-plus
+  ];
+
+  checkInputs = [
+    django
+    flask
+    google-cloud-testutils
+    mock
+    pytestCheckHook
+    pytest-asyncio
+  ];
+
+  disabledTests = [
+    # requires credentials
+    "test_write_log_entries"
+  ];
+
+  preCheck = ''
+    # prevent google directory from shadowing google imports
+    rm -r google
+    # requires credentials
+    rm tests/system/test_system.py tests/unit/test__gapic.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";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..67a3f66c91ad
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-monitoring/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, google-cloud-testutils
+, libcst
+, proto-plus
+, pandas
+, pytestCheckHook
+, pytest-asyncio
+, mock
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-monitoring";
+  version = "2.11.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-eLd8lHhyGjJBTaNzP8amzWa3LyaAixzj+6EpRU2J0bg=";
+  };
+
+  propagatedBuildInputs = [
+    libcst
+    google-api-core
+    proto-plus
+  ];
+
+  checkInputs = [
+    google-cloud-testutils
+    mock
+    pandas
+    pytestCheckHook
+    pytest-asyncio
+  ];
+
+  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";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..3c096baca1aa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-org-policy/default.nix
@@ -0,0 +1,27 @@
+{ lib, buildPythonPackage, fetchPypi, pytestCheckHook, google-api-core, mock, proto-plus, protobuf, pytest-asyncio }:
+
+buildPythonPackage rec {
+  pname = "google-cloud-org-policy";
+  version = "1.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-7mlufFubKLJ7vRqpL8I6nRsFXfxcqyg063OUtkGxydo=";
+  };
+
+  propagatedBuildInputs = [ google-api-core proto-plus ];
+
+  # prevent google directory from shadowing google imports
+  preCheck = ''
+    rm -r google
+  '';
+  checkInputs = [ mock protobuf pytest-asyncio pytestCheckHook ];
+  pythonImportsCheck = [ "google.cloud.orgpolicy" ];
+
+  meta = with lib; {
+    description = "Protobufs for Google Cloud Organization Policy.";
+    homepage = "https://github.com/googleapis/python-org-policy";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ austinbutler SuperSandro2000 ];
+  };
+}
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..80f33305ffcd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-os-config/default.nix
@@ -0,0 +1,29 @@
+{ lib, buildPythonPackage, fetchPypi, google-api-core, libcst, mock, proto-plus, pytestCheckHook, pytest-asyncio }:
+
+buildPythonPackage rec {
+  pname = "google-cloud-os-config";
+  version = "1.12.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-eINiPP8CACiYP2nSY1U60EoYFlXhvA/0ykw2CUWP1lQ=";
+  };
+
+  propagatedBuildInputs = [ google-api-core libcst proto-plus ];
+
+  checkInputs = [ mock pytestCheckHook pytest-asyncio ];
+
+  pythonImportsCheck = [ "google.cloud.osconfig" ];
+
+  disabledTests = [
+    "test_patch_deployment"
+    "test_patch_job"
+  ];
+
+  meta = with lib; {
+    description = "Google Cloud OS Config API client library";
+    homepage = "https://github.com/googleapis/python-os-config";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..ae095ad5894d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-pubsub/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, google-api-core
+, google-cloud-testutils
+, grpc-google-iam-v1
+, grpcio-status
+, libcst
+, mock
+, proto-plus
+, pytest-asyncio
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-pubsub";
+  version = "2.13.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-bpokSPdTEE2dVytUsxhyb46fn+0lRvCeS/+3Cefn2+I=";
+  };
+
+  propagatedBuildInputs = [
+    grpc-google-iam-v1
+    google-api-core
+    grpcio-status
+    libcst
+    proto-plus
+  ];
+
+  checkInputs = [
+    google-cloud-testutils
+    mock
+    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://pypi.org/project/google-cloud-pubsub";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..3e03a9307daf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-redis/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, libcst
+, mock
+, proto-plus
+, pytestCheckHook
+, pytest-asyncio
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-redis";
+  version = "2.9.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-ghVCb0kur3gABkcfkvGjBo2QKPxyQuoZPtEtKyXOT1o=";
+  };
+
+  propagatedBuildInputs = [
+    google-api-core
+    libcst
+    proto-plus
+  ];
+
+  checkInputs = [
+    mock
+    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";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..d3be0ae5a1bb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-resource-manager/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, google-cloud-core
+, google-api-core
+, grpc-google-iam-v1
+, proto-plus
+, mock
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-resource-manager";
+  version = "1.6.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-loyEh0R4jtOThDJXntnWi/q74WmXmC7E4f6h059UccU=";
+  };
+
+  propagatedBuildInputs = [
+    google-api-core
+    google-cloud-core
+    grpc-google-iam-v1
+    proto-plus
+  ];
+
+  checkInputs = [
+    mock
+    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";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..3b435ac5adac
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-runtimeconfig/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, google-cloud-core
+, mock
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-runtimeconfig";
+  version = "0.33.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-MPmyvm2FSrUzb1y5i4xl5Cqea6sxixLoZ7V1hxNi7hw=";
+  };
+
+  propagatedBuildInputs = [ google-api-core google-cloud-core ];
+
+  checkInputs = [ 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://pypi.org/project/google-cloud-runtimeconfig";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..f52cd4572155
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-secret-manager/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, grpc-google-iam-v1
+, libcst
+, mock
+, proto-plus
+, pytestCheckHook
+, pytest-asyncio
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-secret-manager";
+  version = "2.12.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-FSJFryLFttU/HWIFl4buRYOQoSd5cGmUS+FlHO8YzNE=";
+  };
+
+  propagatedBuildInputs = [
+    google-api-core
+    grpc-google-iam-v1
+    libcst
+    proto-plus
+  ];
+
+  checkInputs = [
+    mock
+    pytestCheckHook
+    pytest-asyncio
+  ];
+
+  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";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ siriobalmelli SuperSandro2000 ];
+  };
+}
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..f141cc730ea8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-securitycenter/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, grpc-google-iam-v1
+, google-api-core
+, libcst
+, mock
+, proto-plus
+, pytestCheckHook
+, pytest-asyncio
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-securitycenter";
+  version = "1.12.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Tz8TFt1EwmEuQr2IPzTgz+PIkGJqJwXwfCndl/5DIbA=";
+  };
+
+  propagatedBuildInputs = [
+    grpc-google-iam-v1
+    google-api-core
+    libcst
+    proto-plus
+  ];
+
+  checkInputs = [
+    mock
+    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/python-securitycenter";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..30e359f40bca
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-spanner/default.nix
@@ -0,0 +1,71 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, grpc-google-iam-v1
+, google-cloud-core
+, google-cloud-testutils
+, libcst
+, mock
+, proto-plus
+, pytestCheckHook
+, pytest-asyncio
+, sqlparse
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-spanner";
+  version = "3.17.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-OSMlbvkvSzp2xqwPVoe4dfpYn2leox1huqD/WXlXlZk=";
+  };
+
+  propagatedBuildInputs = [
+    google-cloud-core
+    grpc-google-iam-v1
+    libcst
+    proto-plus
+    sqlparse
+  ];
+
+  checkInputs = [
+    google-cloud-testutils
+    mock
+    pytestCheckHook
+    pytest-asyncio
+  ];
+
+  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";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..50340a8dfbfb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-speech/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, libcst
+, mock
+, proto-plus
+, pytestCheckHook
+, pytest-asyncio
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-speech";
+  version = "2.15.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-/KQ8QM21L5aDy5NuNgrfTPTckU1d1AgdfzHY7/SPFdg=";
+  };
+
+  propagatedBuildInputs = [
+    libcst
+    google-api-core
+    proto-plus
+    setuptools
+  ];
+
+  checkInputs = [
+    mock
+    pytestCheckHook
+    pytest-asyncio
+  ];
+
+  disabledTestPaths = [
+    # Requrire credentials
+    "tests/system/gapic/v1/test_system_speech_v1.py"
+    "tests/system/gapic/v1p1beta1/test_system_speech_v1p1beta1.py"
+  ];
+
+  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/python-speech";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..8746510b505b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-storage/default.nix
@@ -0,0 +1,80 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, google-auth
+, google-cloud-iam
+, google-cloud-core
+, google-cloud-kms
+, google-cloud-testutils
+, google-resumable-media
+, mock
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-storage";
+  version = "2.4.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-X+JvE4GzDjzDKPRuE1McqFJUWPhwweMDxha963t/XGY=";
+  };
+
+  propagatedBuildInputs = [
+    google-auth
+    google-cloud-core
+    google-resumable-media
+  ];
+
+  checkInputs = [
+    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"
+  ];
+
+  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"
+  ];
+
+  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";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..42b4ddf07605
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-tasks/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, grpc-google-iam-v1
+, libcst
+, mock
+, proto-plus
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-tasks";
+  version = "2.10.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Us6K8gf8zzdbek9CDgitkhb40IA9MkqFNblLw/KmfSc=";
+  };
+
+  propagatedBuildInputs = [
+    google-api-core
+    grpc-google-iam-v1
+    libcst
+    proto-plus
+  ];
+
+  checkInputs = [
+    mock
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # 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";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..c2bd3f0a1466
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-testutils/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchPypi, click, google-auth, packaging, six }:
+
+buildPythonPackage rec {
+  pname = "google-cloud-testutils";
+  version = "1.3.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-bRjvNNmvsBy0sR4C0DoC/n7A9ez6AfXUJrXZiHKkz0g=";
+  };
+
+  propagatedBuildInputs = [ click google-auth packaging six ];
+
+  # 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";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..cc3d35c88599
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-texttospeech/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, google-api-core
+, libcst
+, mock
+, proto-plus
+, pytest-asyncio
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-texttospeech";
+  version = "2.12.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-HcLY/dpWQzsfCmwtwePidqlDuLHmlEgLUEdGkHOgdsw=";
+  };
+
+  propagatedBuildInputs = [ libcst google-api-core proto-plus ];
+
+  checkInputs = [ 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";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..9f5df9bd989e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-trace/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, google-cloud-core
+, google-cloud-testutils
+, mock
+, proto-plus
+, pytestCheckHook
+, pytest-asyncio
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-trace";
+  version = "1.7.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-4EC6jLcFNF8G0dXvc+cZB6Ok3zeltc6Xon8EGRTkyCs=";
+  };
+
+  propagatedBuildInputs = [ google-api-core google-cloud-core proto-plus ];
+
+  checkInputs = [ 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";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..f87d3e819e43
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-translate/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, google-api-core
+, google-cloud-core
+, google-cloud-testutils
+, libcst
+, mock
+, proto-plus
+, pytest-asyncio
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-translate";
+  version = "3.8.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-xdnMOy1JkmNnC+seLsxJp+Oq2G3oGXsKHS3//Bzfgq8=";
+  };
+
+  propagatedBuildInputs = [
+    google-api-core
+    google-cloud-core
+    libcst
+    proto-plus
+  ];
+
+  checkInputs = [
+    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";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..449d0edfd6f6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-videointelligence/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, mock
+, google-api-core
+, google-cloud-testutils
+, proto-plus
+, pytestCheckHook
+, pytest-asyncio
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-videointelligence";
+  version = "2.8.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-d5sEMQxHUTrCmGJehsFHBPK79YhpnscTGk9ilKpwrUQ=";
+  };
+
+  propagatedBuildInputs = [ google-api-core proto-plus ];
+
+  checkInputs = [ 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";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..52f3118063fb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-vision/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, libcst
+, mock
+, proto-plus
+, pytestCheckHook
+, pytest-asyncio
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-vision";
+  version = "3.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-y1nqjaVX7Sm2PGjRxhxnqTiFJAudsgg3x2qsebyMW+8=";
+  };
+
+  propagatedBuildInputs = [
+    libcst
+    google-api-core
+    proto-plus
+  ];
+
+  checkInputs = [
+    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";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..b162a6559b98
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-websecurityscanner/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, google-api-core
+, libcst
+, mock
+, protobuf
+, proto-plus
+, pytest-asyncio
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-websecurityscanner";
+  version = "1.8.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-sjw31xRPrLYF/kslmWn/UIYX95RZ+cSCz23AGToRbGc=";
+  };
+
+  propagatedBuildInputs = [
+    google-api-core
+    libcst
+    protobuf
+    proto-plus
+  ];
+
+  checkInputs = [
+    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";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..d3cc01e45380
--- /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.3.0";
+
+  src = fetchFromGitHub {
+    owner = "googleapis";
+    repo = "python-crc32c";
+    rev = "v${version}";
+    sha256 = "005ra4pfv71rq53198k7q6k63f529q3g6hkbxbwfcf82jr77hxga";
+  };
+
+  buildInputs = [ crc32c ];
+
+  propagatedBuildInputs = [ cffi ];
+
+  LDFLAGS = "-L${crc32c}/lib";
+  CFLAGS = "-I${crc32c}/include";
+
+  checkInputs = [ 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 SuperSandro2000 ];
+  };
+}
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..828d9ff5eb2b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-i18n-address/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, requests
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "google-i18n-address";
+  version = "2.5.2";
+
+  src = fetchFromGitHub {
+    owner = "mirumee";
+    repo = "google-i18n-address";
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-7t5sNpEVajdwcW8+xTNZQKZVgxhUzfbVbEVgn7JJ2MY=";
+  };
+
+  propagatedBuildInputs = [ requests ];
+
+  checkInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "i18naddress" ];
+
+  meta = with lib; {
+    description = "Google's i18n address data packaged for Python";
+    homepage = "https://github.com/mirumee/google-i18n-address";
+    maintainers = with maintainers; [ SuperSandro2000 ];
+    license = licenses.bsd3;
+  };
+}
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..85ac03ba3eb4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-nest-sdm/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, aiohttp
+, asynctest
+, buildPythonPackage
+, coreutils
+, fetchFromGitHub
+, google-auth
+, google-auth-oauthlib
+, google-cloud-pubsub
+, pytest-aiohttp
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, requests-oauthlib
+}:
+
+buildPythonPackage rec {
+  pname = "google-nest-sdm";
+  version = "2.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "allenporter";
+    repo = "python-google-nest-sdm";
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-af1oYeNEQdz6HivAhvQY0xm3J4s+uXpcdema37oG15U=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    google-auth
+    google-auth-oauthlib
+    google-cloud-pubsub
+    requests-oauthlib
+  ];
+
+  checkInputs = [
+    asynctest
+    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";
+    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..113bfeb514d2
--- /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 = "0.2.20220601";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-zBCYPcqgsyYKTNHAfHrcH6aWfbz6zJwajxHkwRjHeQU=";
+  };
+
+  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-resumable-media/default.nix b/nixpkgs/pkgs/development/python-modules/google-resumable-media/default.nix
new file mode 100644
index 000000000000..41b41be8fbb4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-resumable-media/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, google-auth
+, google-cloud-testutils
+, google-crc32c
+, mock
+, pytestCheckHook
+, pytest-asyncio
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "google-resumable-media";
+  version = "2.3.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-J8UmIL02TRyBFuqsTqKvy/uBrpE5+zGZZS/KwXJL+2w=";
+  };
+
+  propagatedBuildInputs = [ google-auth google-crc32c requests ];
+
+  checkInputs = [ google-cloud-testutils mock pytestCheckHook pytest-asyncio ];
+
+  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";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..2c35387b124d
--- /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.56.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-wlhzxHJ5OHz9y9r6NhSYh5AdNiAstkWg5PKWhr9uRBc=";
+  };
+
+  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; [ SuperSandro2000 ];
+  };
+}
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..f00a694dfcf4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/googlemaps/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-cov
+, pytestCheckHook
+, pythonOlder
+, requests
+, responses
+}:
+
+buildPythonPackage rec {
+  pname = "googlemaps";
+  version = "4.6.0";
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "googlemaps";
+    repo = "google-maps-services-python";
+    rev = "v${version}";
+    sha256 = "sha256-pzCM1uZupqJgoogwacuuy1P8I9LF65w7ZS6vY10VgeU=";
+  };
+
+  propagatedBuildInputs = [ requests ];
+
+  checkInputs = [
+    pytest-cov
+    pytestCheckHook
+    responses
+  ];
+
+  disabledTests = [
+    # touches network
+    "test_elevation_along_path_single"
+    "test_transit_without_time"
+  ];
+
+  pythonImportsCheck = [ "googlemaps" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/googlemaps/google-maps-services-python";
+    description = "Python client library for Google Maps API Web Services";
+    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/govee-ble/default.nix b/nixpkgs/pkgs/development/python-modules/govee-ble/default.nix
new file mode 100644
index 000000000000..99964db9806e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/govee-ble/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, bluetooth-sensor-state-data
+, buildPythonPackage
+, fetchFromGitHub
+, home-assistant-bluetooth
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+, sensor-state-data
+}:
+
+buildPythonPackage rec {
+  pname = "govee-ble";
+  version = "0.14.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "Bluetooth-Devices";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-gAhrhHTPwNipAFS22GXKjeVXqx0AGorvsqqEWKwRLzA=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    bluetooth-sensor-state-data
+    home-assistant-bluetooth
+    sensor-state-data
+  ];
+
+  checkInputs = [
+    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";
+    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..484321cd7cf7
--- /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;
+    sha256 = "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/gphoto2/default.nix b/nixpkgs/pkgs/development/python-modules/gphoto2/default.nix
new file mode 100644
index 000000000000..fa161a4b5025
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gphoto2/default.nix
@@ -0,0 +1,26 @@
+{ lib, fetchPypi, buildPythonPackage
+, pkg-config
+, libgphoto2 }:
+
+buildPythonPackage rec {
+  pname = "gphoto2";
+  version = "2.3.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-mEbF/fOtw0cU/bx7DgQcmmJ/yqal8Hs/1KaLGC3e4/c=";
+  };
+
+  nativeBuildInputs = [ pkg-config ];
+
+  buildInputs = [ libgphoto2 ];
+
+  doCheck = false; # No tests available
+
+  meta = with lib; {
+    description = "Python interface to libgphoto2";
+    homepage = "https://github.com/jim-easterbrook/python-gphoto2";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ jfrankenau ];
+  };
+}
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..639c5f0f69b2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gpiozero/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, sphinx-rtd-theme
+, sphinxHook
+, colorzero
+, mock
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "gpiozero";
+  version = "1.6.2";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "gpiozero";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-dmFc3DNTlEajYQ5e8QK2WfehwYwAsWyG2cxKg5ykEaI=";
+  };
+
+  outputs = [
+    "out"
+    "doc"
+  ];
+
+  nativeBuildInputs = [
+    sphinx-rtd-theme
+    sphinxHook
+  ];
+
+  propagatedBuildInputs = [
+    colorzero
+  ];
+
+  pythonImportsCheck = [
+    "gpiozero"
+    "gpiozero.tools"
+  ];
+
+  checkInputs = [
+    mock
+    pytestCheckHook
+  ];
+
+
+  meta = with lib; {
+    description = "A simple interface to GPIO devices with Raspberry Pi";
+    homepage = "https://github.com/gpiozero/gpiozero";
+    license = licenses.bsd3;
+    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..11ff2d6fc1e6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gplaycli/default.nix
@@ -0,0 +1,26 @@
+{ buildPythonPackage, lib, libffi, isPy3k, pyasn1, clint, ndg-httpsclient
+, protobuf, requests, args, matlink-gpapi, pyaxmlparser, setuptools, fetchFromGitHub
+}:
+
+buildPythonPackage rec {
+  pname = "gplaycli";
+  version = "3.29";
+
+  src = fetchFromGitHub {
+    owner = "matlink";
+    repo = "gplaycli";
+    rev = version;
+    sha256 = "10gc1wr259z5hxyk834wyyggvyh82agfq0zp711s4jf334inp45r";
+  };
+
+  disabled = !isPy3k;
+
+  propagatedBuildInputs = [ libffi pyasn1 clint ndg-httpsclient protobuf requests args matlink-gpapi pyaxmlparser setuptools ];
+
+  meta = with lib; {
+    homepage = "https://github.com/matlink/gplaycli";
+    description = "Google Play Downloader via Command line";
+    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..4eb3a79e5e87
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gprof2dot/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, fetchFromGitHub
+, buildPythonApplication
+, python
+, graphviz
+}:
+
+buildPythonApplication rec {
+  pname = "gprof2dot";
+  version = "2021.02.21";
+
+  src = fetchFromGitHub {
+    owner = "jrfonseca";
+    repo = "gprof2dot";
+    rev = version;
+    sha256 = "1jjhsjf5fdi1fkn7mvhnzkh6cynl8gcjrygd3cya5mmda3akhzic";
+  };
+
+  makeWrapperArgs = [
+    "--prefix PATH : ${lib.makeBinPath [ graphviz ]}"
+  ];
+
+  # Needed so dot is on path of the test script
+  checkInputs = [ 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; {
+    homepage = "https://github.com/jrfonseca/gprof2dot";
+    description = "Python script to convert the output from many profilers into a dot graph";
+    license = licenses.lgpl3Plus;
+    maintainers = [ 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..76321182dcb6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gps3/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+}:
+
+buildPythonPackage rec {
+  pname = "gps3";
+  version = "0.33.3";
+
+  src = fetchFromGitHub {
+    owner = "onkelbeh";
+    repo = pname;
+    rev = version;
+    sha256 = "0a0qpk7d2b1cld58qcdn6bxrkil6ascs51af01dy4p83062h1hi6";
+  };
+
+  # Project has no tests
+  doCheck = false;
+  pythonImportsCheck = [ "gps3" ];
+
+  meta = with lib; {
+    description = "Python client for GPSD";
+    homepage = "https://github.com/onkelbeh/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..fd8236fe0736
--- /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;
+    sha256 = "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..68f8cba8dc47
--- /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}";
+    sha256 = "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/gpxpy/default.nix b/nixpkgs/pkgs/development/python-modules/gpxpy/default.nix
new file mode 100644
index 000000000000..86e4a87a8681
--- /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}";
+    sha256 = "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..217039277ba5
--- /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 ];
+  checkInputs = [ 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/gpyopt/default.nix b/nixpkgs/pkgs/development/python-modules/gpyopt/default.nix
new file mode 100644
index 000000000000..8852c5696757
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gpyopt/default.nix
@@ -0,0 +1,33 @@
+{ lib, buildPythonPackage, fetchFromGitHub, setuptools
+, numpy, scipy, gpy, emcee, nose, cython }:
+
+buildPythonPackage rec {
+  pname = "GPyOpt";
+  version = "1.2.6";
+
+  src = fetchFromGitHub {
+    repo   = pname;
+    owner  = "SheffieldML";
+    rev    = "v${version}";
+    sha256 = "1sv13svaks67i9z560746hz4hslakdna0zd3gxj828il1cv7cslm";
+  };
+
+  nativeBuildInputs = [ cython ];
+
+  doCheck = false;  # requires several packages not available in Nix
+
+  checkInputs = [ nose ];
+
+  checkPhase = "nosetests -v GPyOpt/testing";
+
+  propagatedBuildInputs = [ setuptools numpy scipy gpy emcee ];
+
+  pythonImportsCheck = [ "GPyOpt" ];
+
+  meta = with lib; {
+    description = "Bayesian optimization toolbox in Python";
+    homepage = "https://sheffieldml.github.io/GPyOpt";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+}
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..0c8b2bd9378a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gql/default.nix
@@ -0,0 +1,77 @@
+{ lib
+, aiofiles
+, aiohttp
+, botocore
+, buildPythonPackage
+, fetchFromGitHub
+, graphql-core
+, mock
+, parse
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, requests
+, requests-toolbelt
+, urllib3
+, vcrpy
+, websockets
+, yarl
+}:
+
+buildPythonPackage rec {
+  pname = "gql";
+  version = "3.4.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "graphql-python";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-yr8IyAwZ6y2MPTe6bHRW+CIp19R3ZJWHuqdN5qultnQ=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    botocore
+    graphql-core
+    requests
+    requests-toolbelt
+    urllib3
+    websockets
+    yarl
+  ];
+
+  checkInputs = [
+    aiofiles
+    mock
+    parse
+    pytest-asyncio
+    pytestCheckHook
+    vcrpy
+  ];
+
+  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"
+  ];
+
+  pythonImportsCheck = [
+    "gql"
+  ];
+
+  meta = with lib; {
+    description = "GraphQL client in Python";
+    homepage = "https://github.com/graphql-python/gql";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..e81d815e8c20
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gradient-utils/default.nix
@@ -0,0 +1,70 @@
+{ 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 = "v${version}";
+    sha256 = "19plkgwwfs6298vjplgsvhirixi3jbngq5y07x9c0fjxk39fa2dk";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    hyperopt
+    prometheus-client
+    numpy
+  ];
+
+  checkInputs = [
+    mock
+    requests
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'wheel = "^0.35.1"' 'wheel = "*"' \
+      --replace 'prometheus-client = ">=0.8,<0.10"' 'prometheus-client = "*"'
+  '';
+
+  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;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ freezeboy ];
+  };
+}
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..b78373294326
--- /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.5";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-D0JX6tk6SY5seH9m21hwMZ2TnaAG6OrHo+ucJEredd0=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace 'attrs<=' 'attrs>=' \
+      --replace 'colorama==' 'colorama>=' \
+      --replace 'gql[requests]==3.0.0a6' 'gql' \
+      --replace 'PyYAML==' 'PyYAML>=' \
+      --replace 'marshmallow<' 'marshmallow>=' \
+      --replace 'websocket-client==' '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..e4d7127236e0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gradient_statsd/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, chardet
+, configparser
+, datadog
+, requests
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "gradient_statsd";
+  version = "1.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "iWlNX43ZtvU73wz4+8DgDulQNOnssJGxTBkvAaLj530=";
+  };
+
+  propagatedBuildInputs = [
+    chardet
+    datadog
+    requests
+  ]
+  ++ lib.optional python.isPy2 configparser;
+
+  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;
+    platforms   = platforms.unix;
+    maintainers = with maintainers; [ freezeboy ];
+  };
+}
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..c4e7eb4d7446
--- /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
+  ];
+
+  checkInputs = [
+    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..f5d9b7904594
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/graphene-django/default.nix
@@ -0,0 +1,75 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, fetchpatch
+
+, graphene
+, graphql-core
+, django
+, djangorestframework
+, promise
+, text-unidecode
+
+, django-filter
+, mock
+, pytest-django
+, pytest-random-order
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "graphene-django";
+  version = "unstable-2022-03-03";
+  format = "setuptools";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "graphql-python";
+    repo = pname;
+    rev = "f6ec0689c18929344c79ae363d2e3d5628fa4a2d";
+    hash = "sha256-KTZ5jcoeHYXnlaF47t8jIi6+7NyMyA4hDPv+il3bt+U=";
+  };
+
+  patches = [
+    ./graphene-3_2_0.patch
+    (fetchpatch {
+      url = "https://github.com/graphql-python/graphene-django/commit/ca555293a4334c26cf9a390dd1e3d0bd4c819a17.patch";
+      excludes = [ "setup.py" ];
+      sha256 = "sha256-RxG1MRhmpBKnHhSg4SV+DjZ3uA0nl9oUeei56xjtUpw=";
+    })
+  ];
+
+  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
+  '';
+
+  checkInputs = [
+    django-filter
+    mock
+    pytest-django
+    pytest-random-order
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Integrate GraphQL into your Django project";
+    homepage = "https://github.com/graphql-python/graphene-django";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/graphene-django/graphene-3_2_0.patch b/nixpkgs/pkgs/development/python-modules/graphene-django/graphene-3_2_0.patch
new file mode 100644
index 000000000000..0e8fa63464a3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/graphene-django/graphene-3_2_0.patch
@@ -0,0 +1,150 @@
+diff --git a/graphene_django/filter/tests/test_fields.py b/graphene_django/filter/tests/test_fields.py
+index 7d440f4..0aec6e4 100644
+--- a/graphene_django/filter/tests/test_fields.py
++++ b/graphene_django/filter/tests/test_fields.py
+@@ -1005,7 +1005,7 @@ def test_integer_field_filter_type():
+ 
+     schema = Schema(query=Query)
+ 
+-    assert str(schema) == dedent(
++    assert str(schema).rstrip() + "\n" == dedent(
+         """\
+         type Query {
+           pets(offset: Int = null, before: String = null, after: String = null, first: Int = null, last: Int = null, age: Int = null): PetTypeConnection
+@@ -1074,7 +1074,7 @@ def test_other_filter_types():
+ 
+     schema = Schema(query=Query)
+ 
+-    assert str(schema) == dedent(
++    assert str(schema).rstrip() + "\n" == dedent(
+         """\
+         type Query {
+           pets(offset: Int = null, before: String = null, after: String = null, first: Int = null, last: Int = null, age: Int = null, age_Isnull: Boolean = null, age_Lt: Int = null): PetTypeConnection
+diff --git a/graphene_django/tests/test_command.py b/graphene_django/tests/test_command.py
+index 70116b8..a4ab4db 100644
+--- a/graphene_django/tests/test_command.py
++++ b/graphene_django/tests/test_command.py
+@@ -49,7 +49,7 @@ def test_generate_graphql_file_on_call_graphql_schema():
+     assert handle.write.called_once()
+ 
+     schema_output = handle.write.call_args[0][0]
+-    assert schema_output == dedent(
++    assert schema_output.rstrip() + "\n" == dedent(
+         """\
+         type Query {
+           hi: String
+diff --git a/graphene_django/tests/test_types.py b/graphene_django/tests/test_types.py
+index bde72c7..0b64440 100644
+--- a/graphene_django/tests/test_types.py
++++ b/graphene_django/tests/test_types.py
+@@ -247,7 +247,7 @@ def test_schema_representation():
+         }
+         """
+     )
+-    assert str(schema) == expected
++    assert str(schema).rstrip() + "\n" == expected
+ 
+ 
+ def with_local_registry(func):
+@@ -515,7 +515,7 @@ class TestDjangoObjectType:
+ 
+         schema = Schema(query=Query)
+ 
+-        assert str(schema) == dedent(
++        assert str(schema).rstrip() + "\n" == dedent(
+             """\
+             type Query {
+               pet: Pet
+@@ -541,7 +541,7 @@ class TestDjangoObjectType:
+ 
+         schema = Schema(query=Query)
+ 
+-        assert str(schema) == dedent(
++        assert str(schema).rstrip() + "\n" == dedent(
+             """\
+             type Query {
+               pet: Pet
+@@ -576,7 +576,7 @@ class TestDjangoObjectType:
+ 
+         schema = Schema(query=Query)
+ 
+-        assert str(schema) == dedent(
++        assert str(schema).rstrip() + "\n" == dedent(
+             """\
+             type Query {
+               pet: Pet
+@@ -603,7 +603,7 @@ class TestDjangoObjectType:
+ 
+         schema = Schema(query=Query)
+ 
+-        assert str(schema) == dedent(
++        assert str(schema).rstrip() + "\n" == dedent(
+             """\
+             type Query {
+               pet: PetModelKind
+@@ -642,7 +642,7 @@ class TestDjangoObjectType:
+ 
+         schema = Schema(query=Query)
+ 
+-        assert str(schema) == dedent(
++        assert str(schema).rstrip() + "\n" == dedent(
+             """\
+             type Query {
+               pet: PetModelKind
+diff --git a/graphene_django/tests/test_views.py b/graphene_django/tests/test_views.py
+index 945fa87..e2e8b46 100644
+--- a/graphene_django/tests/test_views.py
++++ b/graphene_django/tests/test_views.py
+@@ -109,12 +109,10 @@ def test_reports_validation_errors(client):
+             {
+                 "message": "Cannot query field 'unknownOne' on type 'QueryRoot'.",
+                 "locations": [{"line": 1, "column": 9}],
+-                "path": None,
+             },
+             {
+                 "message": "Cannot query field 'unknownTwo' on type 'QueryRoot'.",
+                 "locations": [{"line": 1, "column": 21}],
+-                "path": None,
+             },
+         ]
+     }
+@@ -135,8 +133,6 @@ def test_errors_when_missing_operation_name(client):
+         "errors": [
+             {
+                 "message": "Must provide operation name if query contains multiple operations.",
+-                "locations": None,
+-                "path": None,
+             }
+         ]
+     }
+@@ -476,8 +472,7 @@ def test_handles_syntax_errors_caught_by_graphql(client):
+         "errors": [
+             {
+                 "locations": [{"column": 1, "line": 1}],
+-                "message": "Syntax Error: Unexpected Name 'syntaxerror'.",
+-                "path": None,
++                "message": "Syntax Error: Unexpected Name 'syntaxerror'."
+             }
+         ]
+     }
+diff --git a/graphene_django/views.py b/graphene_django/views.py
+index c23b020..f533f70 100644
+--- a/graphene_django/views.py
++++ b/graphene_django/views.py
+@@ -11,7 +11,6 @@ from django.views.decorators.csrf import ensure_csrf_cookie
+ from django.views.generic import View
+ from graphql import OperationType, get_operation_ast, parse, validate
+ from graphql.error import GraphQLError
+-from graphql.error import format_error as format_graphql_error
+ from graphql.execution import ExecutionResult
+ 
+ from graphene import Schema
+@@ -387,7 +386,7 @@ class GraphQLView(View):
+     @staticmethod
+     def format_error(error):
+         if isinstance(error, GraphQLError):
+-            return format_graphql_error(error)
++            return error.formatted
+ 
+         return {"message": str(error)}
+ 
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..926da5784b1a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/graphene/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, aniso8601
+, buildPythonPackage
+, fetchFromGitHub
+, graphql-core
+, graphql-relay
+, promise
+, pytest-asyncio
+, pytest-benchmark
+, pytest-mock
+, pytestCheckHook
+, pythonAtLeast
+, pythonOlder
+, pytz
+, snapshottest
+}:
+
+buildPythonPackage rec {
+  pname = "graphene";
+  version = "3.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "graphql-python";
+    repo = "graphene";
+    rev = "v${version}";
+    sha256 = "sha256-fKvaor9tOsJWXFMAH0/iDQi5NYJPec2sJevbQsKhQQ4=";
+  };
+
+  propagatedBuildInputs = [
+    aniso8601
+    graphql-core
+    graphql-relay
+  ];
+
+  checkInputs = [
+    promise
+    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";
+    license = licenses.mit;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..91def6f2886b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/graphite-web/default.nix
@@ -0,0 +1,73 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, cairocffi
+, django
+, django_tagging
+, fetchPypi
+, gunicorn
+, pyparsing
+, python-memcached
+, pythonOlder
+, pytz
+, six
+, txamqp
+, urllib3
+, whisper
+, whitenoise
+}:
+
+buildPythonPackage rec {
+  pname = "graphite-web";
+  version = "1.1.10";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Pxho1QWo2jJZYAMJx999bbELDVMr7Wp7wsssYPkc01o=";
+  };
+
+  propagatedBuildInputs = [
+    cairocffi
+    django
+    django_tagging
+    gunicorn
+    pyparsing
+    python-memcached
+    pytz
+    six
+    txamqp
+    urllib3
+    whisper
+    whitenoise
+  ];
+
+  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')"
+  '';
+
+  pythonImportsCheck = [
+    "graphite"
+  ];
+
+  meta = with lib; {
+    broken = (stdenv.isLinux && stdenv.isAarch64) || stdenv.isDarwin;
+    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..a5893d87c0cb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/graphql-core/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-benchmark
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "graphql-core";
+  version = "3.2.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "graphql-python";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-LLvfjlio0UmTwR2ZRpsoKTJoWHOEk740QE6K+5GNlrk=";
+  };
+
+  checkInputs = [
+    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..435f1f5d8d0f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/graphql-relay/default.nix
@@ -0,0 +1,54 @@
+{ 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=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    graphql-core
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    typing-extensions
+  ];
+
+  checkInputs = [
+    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; [ SuperSandro2000 ];
+  };
+}
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..e26e936f48fd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/graphql-server-core/default.nix
@@ -0,0 +1,50 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, lib
+, black
+, graphql-core
+, promise
+, fetchpatch
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "graphql-server-core";
+  version = "2.0.0";
+
+  src = fetchFromGitHub {
+    owner = "graphql-python";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1w3biv2za2m1brwjy0z049c2m94gm1zfwxzgc6lwrsci724jv9fr";
+  };
+
+  disable = pythonOlder "3.6";
+
+  patches = [
+    (fetchpatch {
+      url = "https://github.com/graphql-python/graphql-server-core/commit/865ee9d5602f352c958f6f7e15adbe9abe216784.patch";
+      sha256 = "03p44p4j8rys7mgamh2h9ibbnac2cqwvp5f5hrl2avj2hh0l6j46";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    graphql-core
+    promise
+  ];
+
+  checkPhase = "black --check graphql_server tests";
+
+  checkInputs = [
+    black
+  ];
+
+  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..40b7b0be6879
--- /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.6.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Danielhiversen";
+    repo = "PyGraphqlWebsocketManager";
+    rev = "refs/tags/${version}";
+    hash = "sha256-5+KHPm/JuazObvuC2ip6hwQxvjJH/lDgukJMH49cuwg=";
+  };
+
+  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..a1bec8f3a1f4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/graphtage/default.nix
@@ -0,0 +1,53 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, lib
+, pytestCheckHook
+, pythonOlder
+  # Python dependencies
+, colorama
+, intervaltree
+, json5
+, pyyaml
+, scipy
+, tqdm
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "graphtage";
+  version = "0.2.6";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "trailofbits";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-ZazqtrrCsoeJK7acj7Unpl+ZI2JL/khMN2aOSHdCHl0=";
+  };
+
+  propagatedBuildInputs = [
+    colorama
+    intervaltree
+    json5
+    pyyaml
+    scipy
+    tqdm
+    typing-extensions
+  ];
+
+  checkInputs = [ pytestCheckHook ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "json5==0.9.5" "json5>=0.9.5"
+  '';
+
+  pythonImportsCheck = [ "graphtage" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/trailofbits/graphtage";
+    description = "A utility to diff tree-like files such as JSON and XML";
+    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..2fa10120c18c
--- /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";
+
+  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-QyZwXxRbcMushxh/Ypy+v4FOTM4H1u5b7IZMSVgLyEs=";
+  };
+
+  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 ];
+  };
+
+  checkInputs = [
+    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..33b4c437dde2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/grappelli_safe/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  version = "1.1.1";
+  pname = "grappelli_safe";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ee34b3e2a3711498b1f8da3d9daa8a1239efdf255a212181742b6a5890fac039";
+  };
+
+  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/";
+    license = licenses.free;
+    maintainers = with maintainers; [ prikhi ];
+    platforms = platforms.unix;
+  };
+
+}
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..f16ba5fc4c77
--- /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 = "1.0.0";
+
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "microsoft";
+    repo = "graspologic";
+    rev = "v${version}";
+    sha256 = "sha256-mzJ3eFo77gnOh/Vs9u68yFDZW3ilXtcCCwKahKyRRmc=";
+  };
+
+  propagatedBuildInputs = [
+    hyppo
+    matplotlib
+    networkx
+    numpy
+    scikit-learn
+    scipy
+    seaborn
+  ];
+
+  checkInputs = [ 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..c2da89dc6c44
--- /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.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "cmroche";
+    repo = "greeclimate";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-4kR3Hc5M4FDG/WFtIW20a9d0vwLzmqtrlhd+teMiejA=";
+  };
+
+  propagatedBuildInputs = [
+    netifaces
+    pycryptodome
+  ];
+
+  checkInputs = [
+    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..103bcd2a526c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/green/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, isPy3k
+, fetchPypi
+, django
+, colorama
+, coverage
+, unidecode
+, lxml
+}:
+
+buildPythonPackage rec {
+  pname = "green";
+  version = "3.4.2";
+  format = "setuptools";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-Jbmes0KDoYVbLzDJHSuNwB22ystzFBZkAXkce8CWwiE=";
+  };
+
+  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..76da49a9ee6d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/greeneye-monitor/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, aiohttp
+, siobrultech-protocols
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "greeneye-monitor";
+  version = "3.0.3";
+
+  disabled = pythonOlder "3.5";
+
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "jkeljo";
+    repo = "greeneye-monitor";
+    rev = "v${version}";
+    hash = "sha256-weZTOVFBlB6TxFs8pLWfyB7WD/bn3ljBjX2tVi1Zc/I=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "siobrultech_protocols==" "siobrultech_protocols>="
+  '';
+
+  propagatedBuildInputs = [
+    aiohttp
+    siobrultech-protocols
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "greeneye.monitor" ];
+
+  meta = {
+    description = "Receive data packets from GreenEye Monitor";
+    homepage = "https://github.com/jkeljo/greeneye-monitor";
+    license = lib.licenses.mit;
+    maintainers = with lib.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..78ac1668b6f8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/greenlet/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPyPy
+, python
+}:
+
+
+buildPythonPackage rec {
+  pname = "greenlet";
+  version = "1.1.2";
+  disabled = isPyPy;  # builtin for pypy
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "e30f5ea4ae2346e62cedde8794a56858a67b878dd79f7df76a0767e356b1744a";
+  };
+
+  checkPhase = ''
+    runHook preCheck
+    ${python.interpreter} -m unittest discover -v greenlet.tests
+    runHook postCheck
+  '';
+
+  meta = with lib; {
+    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
+    ];
+  };
+}
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..3f7ca1011b52
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gremlinpython/default.nix
@@ -0,0 +1,77 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, aenum
+, aiohttp
+, importlib-metadata
+, isodate
+, nest-asyncio
+, six
+, pytestCheckHook
+, mock
+, pyhamcrest
+, radish-bdd
+}:
+
+buildPythonPackage rec {
+  pname = "gremlinpython";
+  version = "3.6.0";
+
+  # pypi tarball doesn't include tests
+  src = fetchFromGitHub {
+    owner = "apache";
+    repo = "tinkerpop";
+    rev = version;
+    sha256 = "0gyf3a0zbh1grc1vr9zzpqm5yfcjvn0f1akw9l1arq36isqwvydn";
+  };
+  sourceRoot = "source/gremlin-python/src/main/python";
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace 'pytest-runner==5.2' ' '
+  '';
+
+  # setup-requires requirements
+  nativeBuildInputs = [
+    importlib-metadata
+  ];
+  propagatedBuildInputs = [
+    aenum
+    aiohttp
+    isodate
+    nest-asyncio
+    six
+  ];
+
+  checkInputs = [
+    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; [ turion 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..50c95df7dc91
--- /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.6.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0rpnim3ppxjdsaa869h1jdimcyc66mamcs593rd7brk8cq68kv3x";
+  };
+
+  # 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/gridnet/default.nix b/nixpkgs/pkgs/development/python-modules/gridnet/default.nix
new file mode 100644
index 000000000000..5c55b8c6c55f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gridnet/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, poetry-core
+, aiohttp
+, yarl
+, aresponses
+, pytest-asyncio
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "gridnet";
+  version = "4.1.0";
+
+  disabled = pythonOlder "3.9";
+
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "klaasnicolaas";
+    repo = "python-gridnet";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-/UBZVbDRZMYHDrgifpYSTygAQTBiqgZ0tRGncE3GeT4=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "0.0.0" "${version}" \
+      --replace "--cov" ""
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    yarl
+  ];
+
+  checkInputs = [
+    aresponses
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "gridnet" ];
+
+  meta = with lib; {
+    description = "Asynchronous Python client for NET2GRID devices";
+    homepage = "https://github.com/klaasnicolaas/python-gridnet";
+    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..f7e9fd75855f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/griffe/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, aiofiles
+, buildPythonApplication
+, cached-property
+, fetchFromGitHub
+, git
+, pdm-pep517
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonApplication rec {
+  pname = "griffe";
+  version = "0.22.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "mkdocstrings";
+    repo = pname;
+    rev = version;
+    hash = "sha256-GqPXVi+SsfO0ufUJzEZ5eUzwJmM/wylLA1KMv+WaIsU=";
+  };
+
+  nativeBuildInputs = [
+    pdm-pep517
+  ];
+
+  propagatedBuildInputs = lib.optionals (pythonOlder "3.8") [
+    cached-property
+  ];
+
+  checkInputs = [
+    git
+    pytestCheckHook
+  ];
+
+  passthru.optional-dependencies = {
+    async = [
+      aiofiles
+    ];
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'dynamic = ["version"]' 'version = "${version}"'
+  '';
+
+  pythonImportsCheck = [
+    "griffe"
+  ];
+
+  meta = with lib; {
+    description = "Signatures for entire Python programs";
+    homepage = "https://github.com/mkdocstrings/griffe";
+    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..eab4b45547c1
--- /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}";
+    sha256 = "sha256-CHL2dy0H/i0pLo653F7aUHFvZHTeZA6jC/rwn1KrEW4=";
+  };
+
+  checkInputs = [ 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..859573d1ca53
--- /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.unfree;
+  };
+}
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..a10b1d709a2e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/growattserver/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "growattserver";
+  version = "1.2.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "indykoning";
+    repo = "PyPi_GrowattServer";
+    rev = version;
+    hash = "sha256-dS5Ng89aYzfegdFlyt1eo7vhva2ME77pQV2hkd/iNq8=";
+  };
+
+  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";
+    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..eb47b502d82a
--- /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.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-PwrCyUC5qFXXzn4x/eKL3bDZrDYtMtB8ZxSDBpMaDjA=";
+  };
+
+  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; [ SuperSandro2000 ];
+  };
+}
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..656e147ac50a
--- /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 = [ maintainers.costrouc ];
+  };
+}
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..37f3617ecf39
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/grpcio-status/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, googleapis-common-protos
+, grpcio
+, protobuf
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "grpcio-status";
+  version = "1.48.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "afac961fc3713889d3c48c11461aba49842ca62a54dfe8f346442046036e9856";
+  };
+
+  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-tools/default.nix b/nixpkgs/pkgs/development/python-modules/grpcio-tools/default.nix
new file mode 100644
index 000000000000..4797772086ad
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/grpcio-tools/default.nix
@@ -0,0 +1,29 @@
+{ lib, buildPythonPackage, fetchPypi, protobuf, grpcio, setuptools }:
+
+buildPythonPackage rec {
+  pname = "grpcio-tools";
+  version = "1.48.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "dd7f757608e7dfae4ab2e7fc1e8951e6eb9526ebdc7ce90597329bc4c408c9a1";
+  };
+
+  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..0ad6cabd9515
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/grpcio/default.nix
@@ -0,0 +1,56 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchpatch
+, grpc
+, six
+, protobuf
+, enum34 ? null
+, futures ? null
+, isPy27
+, pkg-config
+, cython
+, c-ares
+, openssl
+, zlib
+}:
+
+buildPythonPackage rec {
+  inherit (grpc) src version;
+  pname = "grpcio";
+
+  patches = [
+    # Fix build on armv6l
+    # https://github.com/grpc/grpc/pull/30401
+    (fetchpatch {
+      url = "https://github.com/grpc/grpc/commit/65dc9f3edeee4c2d0e9b30d5a3ee63175437bea3.patch";
+      hash = "sha256-pS4FsCcSjmjSs3J5Y96UonkxqPwfpkyhrEM0t6HaMd0=";
+    })
+  ];
+
+  outputs = [ "out" "dev" ];
+
+  nativeBuildInputs = [ cython pkg-config ];
+
+  buildInputs = [ c-ares openssl zlib ];
+  propagatedBuildInputs = [ six protobuf ]
+    ++ lib.optionals (isPy27) [ enum34 futures ];
+
+  preBuild = 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;
+
+  pythonImportsCheck = [ "grpc" ];
+
+  meta = with lib; {
+    description = "HTTP/2-based RPC framework";
+    license = licenses.asl20;
+    homepage = "https://grpc.io/grpc/python/";
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..1eb93ece6d6c
--- /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.3";
+in
+buildPythonPackage {
+  inherit pname version;
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "vmagamedov";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-zjctvsuX5yJl1EXIAaiukWGYJbdgU7OZllgOYAmp1b4=";
+  };
+
+  propagatedBuildInputs = [
+    h2
+    multidict
+  ];
+
+  checkInputs = [
+    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..f0824670731d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gruut-ipa/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, espeak
+, numpy
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "gruut-ipa";
+  version = "0.13.0";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "rhasspy";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "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
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+    ${python.interpreter} -m unittest discover
+    runHook postCheck
+  '';
+
+  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..f36c9daa12d8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gruut/default.nix
@@ -0,0 +1,96 @@
+{ lib
+, buildPythonPackage
+, callPackage
+, pythonOlder
+, fetchFromGitHub
+, babel
+, gruut-ipa
+, dateparser
+, jsonlines
+, num2words
+, python-crfsuite
+, dataclasses
+, 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}";
+    sha256 = "sha256-DD7gnvH9T2R6E19+exWE7Si+XEpfh0Iy5FYbycjgzgM=";
+  };
+
+  postPatch = ''
+    substituteInPlace requirements.txt \
+      --replace "dateparser~=1.0.0" "dateparser" \
+      --replace "gruut_lang_en~=2.0.0" "gruut_lang_en" \
+      --replace "jsonlines~=1.2.0" "jsonlines"
+  '';
+
+  propagatedBuildInputs = [
+    babel
+    gruut-ipa
+    jsonlines
+    num2words
+    python-crfsuite
+    dateparser
+    networkx
+  ] ++ lib.optionals (pythonOlder "3.7") [
+    dataclasses
+  ] ++ (map (lang: callPackage ./language-pack.nix {
+    inherit lang version format src;
+  }) langPkgs);
+
+  checkInputs = [ 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..0714352ed5ee
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gsd/default.nix
@@ -0,0 +1,35 @@
+{ lib, buildPythonPackage, fetchFromGitHub, isPy27
+, cython, numpy
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  version = "2.5.3";
+  pname = "gsd";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "glotzerlab";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-3CJKpvgJuFC/2qQdy0H/kvLbtmfF22gBAQustK99uEE=";
+  };
+
+  nativeBuildInputs = [ cython ];
+  propagatedBuildInputs = [ numpy ];
+
+  checkInputs = [ pytestCheckHook ];
+  preCheck = ''
+    pushd gsd/test
+  '';
+  postCheck = ''
+    popd
+  '';
+
+  meta = with lib; {
+    description = "General simulation data file format";
+    homepage = "https://github.com/glotzerlab/gsd";
+    license = licenses.bsd2;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..894af68a5537
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gspread/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, requests
+, google-auth
+, google-auth-oauthlib
+}:
+
+buildPythonPackage rec {
+  version = "5.4.0";
+  pname = "gspread";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-thcrYvqJnj5BmdLQ6hAItkMFVUugjT06lukSOCT97Eg=";
+  };
+
+  propagatedBuildInputs = [ requests google-auth google-auth-oauthlib ];
+
+  meta = with lib; {
+    description = "Google Spreadsheets client library";
+    homepage = "https://github.com/burnash/gspread";
+    license = licenses.mit;
+  };
+
+  # No tests included
+  doCheck = false;
+
+}
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..f703820a4f5c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gssapi/default.nix
@@ -0,0 +1,79 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, six
+, decorator
+, nose
+, krb5Full
+, GSS
+, parameterized
+, shouldbe
+, cython
+, python
+, k5test
+}:
+
+buildPythonPackage rec {
+  pname = "gssapi";
+  version = "1.7.3";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "pythongssapi";
+    repo = "python-${pname}";
+    rev = "v${version}";
+    sha256 = "sha256-/1YOnG6sCP8G8J3K2/RycTC95rXW9M+U3Mjz4GCt13s=";
+  };
+
+  # It's used to locate headers
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace 'get_output(f"{kc} gssapi --prefix")' '"${lib.getDev krb5Full}"'
+  '';
+
+  nativeBuildInputs = [
+    cython
+    krb5Full
+  ];
+
+  propagatedBuildInputs =  [
+    decorator
+    six
+  ];
+
+  buildInputs = lib.optionals stdenv.isDarwin [
+    GSS
+  ];
+
+  checkInputs = [
+    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..e14223c1fd6d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gst-python/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, fetchurl
+, meson
+, ninja
+
+, pkg-config
+, python
+, pygobject3
+, gobject-introspection
+, gst-plugins-base
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "gst-python";
+  version = "1.20.0";
+
+  format = "other";
+
+  outputs = [ "out" "dev" ];
+
+  src = fetchurl {
+    url = "${meta.homepage}/src/gst-python/${pname}-${version}.tar.xz";
+    sha256 = "j2e9xWBrozYGxryJbonefc2M9PykWfcTibG2/gdbXlQ=";
+  };
+
+  # Python 2.x is not supported.
+  disabled = !isPy3k;
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    pkg-config
+    python
+    gobject-introspection
+    gst-plugins-base
+  ];
+
+  propagatedBuildInputs = [
+    gst-plugins-base
+    pygobject3
+  ];
+
+  mesonFlags = [
+    "-Dpygi-overrides-dir=${placeholder "out"}/${python.sitePackages}/gi/overrides"
+  ];
+
+  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;
+  };
+}
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..3c76b987a12b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gtfs-realtime-bindings/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, protobuf
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "gtfs-realtime-bindings";
+  version = "0.0.7";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1vav7ah6gpkpi44rk202bwpl345rydg6n9zibzx5p7gcsblcwd45";
+    extension = "zip";
+  };
+
+  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/andystewart999/TransportNSW";
+    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..5870f448db98
--- /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";
+  };
+
+  buildInputs = [
+    makeWrapper
+    glibcLocales gobject-introspection 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..f3325aab8e6e
--- /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
+  ];
+
+  checkInputs = [ 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..3e3fabddf319
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gtts/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, beautifulsoup4
+, click
+, gtts-token
+, mock
+, pytest
+, requests
+, six
+, testfixtures
+, twine
+, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "gtts";
+  version = "2.2.4";
+
+  src = fetchFromGitHub {
+    owner = "pndurette";
+    repo = "gTTS";
+    rev = "v${version}";
+    sha256 = "sha256-hQnFHi85Rifco0afLF8kKNOy9oPxKoupfmdm+fht6Cg=";
+  };
+
+  propagatedBuildInputs = [
+    beautifulsoup4
+    click
+    gtts-token
+    requests
+    six
+    urllib3
+    twine
+  ];
+
+  checkInputs = [ 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..03b26927cf35
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gudhi/default.nix
@@ -0,0 +1,64 @@
+{ 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.4.1";
+
+  src = fetchFromGitHub {
+    owner = "GUDHI";
+    repo = "gudhi-devel";
+    rev = "tags/gudhi-release-${version}";
+    fetchSubmodules = true;
+    sha256 = "1m03qazzfraxn62l1cb11icjz4x8q2sg9c2k3syw5v0yv9ndgx1v";
+  };
+
+  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 ];
+  checkInputs = [ pytest ];
+
+  cmakeFlags = [
+    "-DCMAKE_BUILD_TYPE=Release"
+    "-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..da1bffb283b8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gudhi/remove_explicit_PYTHONPATH.patch
@@ -0,0 +1,174 @@
+diff --git a/src/python/CMakeLists.txt b/src/python/CMakeLists.txt
+index 5c1402a..48a1250 100644
+--- a/src/python/CMakeLists.txt
++++ b/src/python/CMakeLists.txt
+@@ -271,9 +271,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")
+-
+     install(CODE "execute_process(COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/setup.py install)")
+ 
+   # Documentation generation is available through sphinx - requires all modules
+@@ -295,14 +292,14 @@ 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 "PYTHONPATH=${CMAKE_CURRENT_BINARY_DIR}"
++                      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 "PYTHONPATH=${CMAKE_CURRENT_BINARY_DIR}"
++                           COMMAND ${CMAKE_COMMAND} -E env
+                            ${SPHINX_PATH} -b doctest ${CMAKE_CURRENT_SOURCE_DIR}/doc ${CMAKE_CURRENT_BINARY_DIR}/doctest)
+ 
+                   # Set missing or not modules
+@@ -346,13 +343,13 @@ 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 "PYTHONPATH=${CMAKE_CURRENT_BINARY_DIR}"
++               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)
+       # 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 "PYTHONPATH=${CMAKE_CURRENT_BINARY_DIR}"
++               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)
+ 
+@@ -361,13 +358,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 "PYTHONPATH=${CMAKE_CURRENT_BINARY_DIR}"
++               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 "PYTHONPATH=${CMAKE_CURRENT_BINARY_DIR}"
++               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)
+ 
+@@ -379,7 +376,7 @@ if(PYTHONINTERP_FOUND)
+       # Bottleneck
+       add_test(NAME bottleneck_basic_example_py_test
+                WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+-               COMMAND ${CMAKE_COMMAND} -E env "PYTHONPATH=${CMAKE_CURRENT_BINARY_DIR}"
++               COMMAND ${CMAKE_COMMAND} -E env
+                ${PYTHON_EXECUTABLE} "${CMAKE_CURRENT_SOURCE_DIR}/example/bottleneck_basic_example.py")
+ 
+       if (PYBIND11_FOUND)
+@@ -392,26 +389,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 "PYTHONPATH=${CMAKE_CURRENT_BINARY_DIR}"
++               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 "PYTHONPATH=${CMAKE_CURRENT_BINARY_DIR}"
++               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 "PYTHONPATH=${CMAKE_CURRENT_BINARY_DIR}"
++               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 "PYTHONPATH=${CMAKE_CURRENT_BINARY_DIR}"
++               COMMAND ${CMAKE_COMMAND} -E env
+                ${PYTHON_EXECUTABLE} "${CMAKE_CURRENT_SOURCE_DIR}/example/voronoi_graph_induced_complex.py"
+                -f human.off -n 700 -v)
+ 
+@@ -422,11 +419,11 @@ 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 "PYTHONPATH=${CMAKE_CURRENT_BINARY_DIR}"
++               COMMAND ${CMAKE_COMMAND} -E env
+                ${PYTHON_EXECUTABLE} "${CMAKE_CURRENT_SOURCE_DIR}/example/alpha_complex_from_points_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 "PYTHONPATH=${CMAKE_CURRENT_BINARY_DIR}"
++             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 -a 0.6)
+       add_gudhi_py_test(test_alpha_complex)
+@@ -441,13 +438,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 "PYTHONPATH=${CMAKE_CURRENT_BINARY_DIR}"
++             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 "PYTHONPATH=${CMAKE_CURRENT_BINARY_DIR}"
++             COMMAND ${CMAKE_COMMAND} -E env
+              ${PYTHON_EXECUTABLE} "${CMAKE_CURRENT_SOURCE_DIR}/example/random_cubical_complex_persistence_example.py"
+              10 10 10)
+ 
+@@ -456,19 +453,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 "PYTHONPATH=${CMAKE_CURRENT_BINARY_DIR}"
++             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 -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 "PYTHONPATH=${CMAKE_CURRENT_BINARY_DIR}"
++             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 "PYTHONPATH=${CMAKE_CURRENT_BINARY_DIR}"
++             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)
+@@ -476,7 +473,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 "PYTHONPATH=${CMAKE_CURRENT_BINARY_DIR}"
++             COMMAND ${CMAKE_COMMAND} -E env
+              ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/example/simplex_tree_example.py)
+ 
+     add_gudhi_py_test(test_simplex_tree)
+@@ -485,7 +482,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 "PYTHONPATH=${CMAKE_CURRENT_BINARY_DIR}"
++             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..8b85a488512a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/guessit/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python-dateutil
+, babelfish
+, rebulk
+, pythonOlder
+, importlib-resources
+, pytestCheckHook
+, pytest-mock
+, pytest-benchmark
+, pyyaml
+}:
+
+buildPythonPackage rec {
+  pname = "guessit";
+  version = "3.4.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "731e96e6a1f3b065d05accc8c19f35d4485d880b77ab8dc4b262cc353df294f7";
+  };
+
+  propagatedBuildInputs = [
+    rebulk
+    babelfish
+    python-dateutil
+  ] ++ lib.optionals (pythonOlder "3.9") [ importlib-resources ];
+
+  checkInputs = [ pytestCheckHook pytest-mock pytest-benchmark pyyaml ];
+
+  pytestFlagsArray = [ "--benchmark-disable" ];
+
+  pythonImportsCheck = [ "guessit" ];
+
+  meta = {
+    homepage = "https://doc.guessit.io/";
+    description = "A Python library that extracts as much information as possible from a video filename";
+    changelog = "https://github.com/guessit-io/guessit/raw/v${version}/CHANGELOG.md";
+    license = lib.licenses.lgpl3Only;
+  };
+}
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..0f1d2ddf05cc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/guestfs/default.nix
@@ -0,0 +1,24 @@
+{ 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 ];
+  };
+}
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..601aecdf331c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gumath/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, python
+, numba
+, ndtypes
+, xnd
+, libndtypes
+, libxnd
+, libgumath
+, isPy27
+}:
+
+buildPythonPackage {
+  pname = "gumath";
+  disabled = isPy27;
+  inherit (libgumath) src version meta;
+
+  checkInputs = [ numba ];
+  propagatedBuildInputs = [ ndtypes xnd ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace 'add_include_dirs = [".", "libgumath", "ndtypes/python/ndtypes", "xnd/python/xnd"] + INCLUDES' \
+                'add_include_dirs = [".", "${libndtypes}/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..72852ae1f12c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gunicorn/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, pythonOlder
+, eventlet
+, gevent
+, pytestCheckHook
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "gunicorn";
+  version = "20.1.0";
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "benoitc";
+    repo = "gunicorn";
+    rev = version;
+    sha256 = "sha256-xdNHm8NQWlAlflxof4cz37EoM74xbWrNaf6jlwwzHv4=";
+  };
+
+  patches = [
+    (fetchpatch {
+      # fix eventlet 0.30.3+ compability
+      url = "https://github.com/benoitc/gunicorn/commit/6a8ebb4844b2f28596ffe7421eb9f7d08c8dc4d8.patch";
+      sha256 = "sha256-+iApgohzPZ/cHTGBNb7XkqLaHOVVPF26BnPUsvISoZw=";
+    })
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "--cov=gunicorn --cov-report=xml" ""
+  '';
+
+  propagatedBuildInputs = [
+    setuptools
+  ];
+
+  checkInputs = [
+    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; [ SuperSandro2000 ];
+  };
+}
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..df409599cd1f
--- /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.2";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "zhuyifei1999";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-f7YpaZ85PU/CSsDwSm2IJ/x2ZxzHoMOVbdbzT1i8y/w=";
+  };
+
+  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..6f765bd98d6b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/guzzle_sphinx_theme/default.nix
@@ -0,0 +1,22 @@
+{ lib, buildPythonPackage, sphinx, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "guzzle_sphinx_theme";
+  version = "0.7.11";
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1rnkzrrsbnifn3vsb4pfaia3nlvgvw6ndpxp7lzjrh23qcwid34v";
+  };
+
+  doCheck = false; # no tests
+
+  propagatedBuildInputs = [ sphinx ];
+
+  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 ];
+    platforms = platforms.unix;
+  };
+}
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..fef545f6bf92
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gvm-tools/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytestCheckHook
+, python-gvm
+, pythonAtLeast
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "gvm-tools";
+  version = "22.6.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "greenbone";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-pU/KNdWt+Iy/YiIAQFFgkaGHOvXK6v4Loia9MD4qmWc=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    python-gvm
+  ];
+
+  checkInputs = [
+    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";
+    license = with licenses; [ gpl3Plus ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..1616343f8b43
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gym/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, numpy
+, cloudpickle
+}:
+
+buildPythonPackage rec {
+  pname = "gym";
+  version = "0.21.0";
+
+  src = fetchFromGitHub {
+    owner = "openai";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "12b545xz0r2g4z5r7f8amxl7nm0lqymkzwcwhg1bni9h0sxwpv6c";
+  };
+
+  propagatedBuildInputs = [
+    cloudpickle
+    numpy
+  ];
+
+  # 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/gyp/default.nix b/nixpkgs/pkgs/development/python-modules/gyp/default.nix
new file mode 100644
index 000000000000..ca9a8dc5a2d7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gyp/default.nix
@@ -0,0 +1,36 @@
+{ 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" ];
+
+  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..98dd8eef6cbd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/h11/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "h11";
+  version = "0.13.0";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-cIE8ETUIeiSKTTjMDhoBgf+rIYgUGpPq9WeUDDlX/wY=";
+  };
+
+  checkInputs = [ pytestCheckHook ];
+
+  # Some of the tests use localhost networking.
+  __darwinAllowLocalNetworking = true;
+
+  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; [ SuperSandro2000 ];
+  };
+}
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..97ccb7b91206
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/h2/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, hpack
+, hyperframe
+, pytestCheckHook
+, hypothesis
+}:
+
+buildPythonPackage rec {
+  pname = "h2";
+  version = "4.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-qDrKCPvnqst5/seIycC6yTY0NWDtnsGLgqE6EsKNKrs=";
+  };
+
+  propagatedBuildInputs = [
+    hpack
+    hyperframe
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    hypothesis
+  ];
+
+  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; [ SuperSandro2000 ];
+  };
+}
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..e638997be79e
--- /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.4";
+
+  # pypi version does not include tests
+  src = fetchFromGitHub {
+    owner = "uber";
+    repo = "h3-py";
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-/DtQD2M+5kBn1RxAOobVqtu32+1cxN8lZSuGH613Bwc=";
+  };
+
+  dontConfigure = true;
+
+  checkInputs = [ 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..cf4b9671b731
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/h5netcdf/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, h5py
+, pytestCheckHook
+, netcdf4
+, pythonOlder
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "h5netcdf";
+  version = "1.0.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-iAih4JXwEitPtAjMmMYK3zmb1X/vSNHKfN9M2h0Ka0o=";
+  };
+
+ nativeBuildInputs = [
+   setuptools-scm
+ ];
+
+  propagatedBuildInputs = [
+    h5py
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    netcdf4
+  ];
+
+  dontUseSetuptoolsCheck = true;
+
+  pythonImportsCheck = [
+    "h5netcdf"
+  ];
+
+  meta = with lib; {
+    description = "netCDF4 via h5py";
+    homepage = "https://github.com/shoyer/h5netcdf";
+    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..cd78af010aae
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/h5py/default.nix
@@ -0,0 +1,56 @@
+{ lib, fetchPypi, isPy27, buildPythonPackage, pythonOlder
+, numpy, hdf5, cython, six, pkgconfig, unittest2
+, 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.7.0";
+  pname = "h5py";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-P883iEODxdpkhGq1EBkHIAJ9ygdo3vNN2Ny2Wdvly/M=";
+  };
+
+  # avoid strict pinning of numpy
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "numpy ==" "numpy >=" \
+      --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 = if mpiSupport then "export CC=${mpi}/bin/mpicc" else "";
+
+  # tests now require pytest-mpi, which isn't available and difficult to package
+  doCheck = false;
+  checkInputs = lib.optional isPy27 unittest2 ++ [ pytestCheckHook openssh ];
+  nativeBuildInputs = [ pkgconfig cython ];
+  buildInputs = [ hdf5 ]
+    ++ lib.optional mpiSupport mpi;
+  propagatedBuildInputs = [ numpy six]
+    ++ lib.optionals mpiSupport [ mpi4py openssh ]
+    ++ lib.optionals (pythonOlder "3.8") [ cached-property ];
+
+  pythonImportsCheck = [ "h5py" ];
+
+  meta = with lib; {
+    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..9fd1295733c4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ha-ffmpeg/default.nix
@@ -0,0 +1,32 @@
+{ lib, buildPythonPackage, fetchPypi, isPy3k
+, async-timeout }:
+
+buildPythonPackage rec {
+  pname = "ha-ffmpeg";
+  version = "3.0.2";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "8d92f2f5790da038d828ac862673e0bb43e8e972e4c70b1714dd9a0fb776c8d1";
+  };
+
+  propagatedBuildInputs = [ async-timeout ];
+
+  # only manual tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "haffmpeg.camera"
+    "haffmpeg.sensor"
+    "haffmpeg.tools"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/pvizeli/ha-ffmpeg";
+    description = "Library for home-assistant to handle ffmpeg";
+    license = licenses.bsd3;
+    maintainers = teams.home-assistant.members;
+  };
+}
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..f8aecee9a67c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ha-philipsjs/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, cryptography
+, fetchFromGitHub
+, httpx
+, pytest-aiohttp
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+, respx
+}:
+
+buildPythonPackage rec {
+  pname = "ha-philipsjs";
+  version = "2.9.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "danielperna84";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-B2AQoVyoG6wyE9pTWf/ASQd8iZfIrjUr078rSkoARf0=";
+  };
+
+  propagatedBuildInputs = [
+    cryptography
+    httpx
+  ];
+
+  checkInputs = [
+    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";
+    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..0c8c724426ad
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/habanero/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, requests
+, tqdm
+, nose
+, vcrpy
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "habanero";
+  version = "1.2.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "sckott";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-i6tgMEiaDcaBR8XfGvEMXQfTaDp1RJRosj/EfF1dQU4=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    tqdm
+  ];
+
+  checkInputs = [
+    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..d20c89e82e79
--- /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
+  ];
+
+  checkInputs = [
+    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..c7d4178e3bf9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hachoir/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, urwid
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "hachoir";
+  version = "3.1.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "vstinner";
+    repo = pname;
+    rev = version;
+    hash = "sha256-HlxDwkU0GccO+IUzbtVpLbsAo+Mcacm4/WrXWCsmpBg=";
+  };
+
+  propagatedBuildInputs = [
+    urwid
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "hachoir"
+  ];
+
+  meta = with lib; {
+    description = "Python library to view and edit a binary stream";
+    homepage = "https://hachoir.readthedocs.io/";
+    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..ad7d4a9def73
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hacking/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pbr
+, flake8
+, stestr
+, ddt
+, testscenarios
+}:
+
+buildPythonPackage rec {
+  pname = "hacking";
+  version = "4.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0fg19rlcky3n1y1ri61xyjp7534yzf8r102z9dw3zqg93f4kj20m";
+  };
+
+  postPatch = ''
+    substituteInPlace requirements.txt \
+      --replace "flake8<3.9.0,>=3.8.0" "flake8"
+    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
+  ];
+
+  checkInputs = [
+    ddt
+    stestr
+    testscenarios
+  ];
+
+  checkPhase = ''
+    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..f90e414d17e7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hahomematic/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, pydevccu
+, pytest-aiohttp
+, pytestCheckHook
+, python-slugify
+, pythonOlder
+, voluptuous
+, websocket-client
+, xmltodict
+}:
+
+buildPythonPackage rec {
+  pname = "hahomematic";
+  version = "2022.8.10";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "danielperna84";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-JyHIX0G6REIRJDxSrGwZr0mMvAE0R1/zkullh/SXAXA=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    python-slugify
+    voluptuous
+  ];
+
+  checkInputs = [
+    pydevccu
+    pytest-aiohttp
+    pytestCheckHook
+  ];
+
+  # Starting with 0.30 the tests are broken, check with the next major release
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "hahomematic"
+  ];
+
+  meta = with lib; {
+    description = "Python module to interact with HomeMatic devices";
+    homepage = "https://github.com/danielperna84/hahomematic";
+    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..7d8dbe2efbb8
--- /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;
+    sha256 = "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/hangups/default.nix b/nixpkgs/pkgs/development/python-modules/hangups/default.nix
new file mode 100644
index 000000000000..18dd31f8af56
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hangups/default.nix
@@ -0,0 +1,70 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, configargparse
+, aiohttp
+, async-timeout
+, appdirs
+, readlike
+, requests
+, reparser
+, protobuf
+, urwid
+, mechanicalsoup
+, httpretty
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "hangups";
+  version = "0.4.18";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "tdryer";
+    repo = "hangups";
+    rev = "v${version}";
+    hash = "sha256-vq1OrOUPMQtezBFlisP2f/bvvYprDjhOuwUcT8rmIvw=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "protobuf>=3.1.0,<3.20" "protobuf" \
+      --replace "MechanicalSoup>=0.6.0,<0.13" "MechanicalSoup"
+  '';
+
+  propagatedBuildInputs = [
+    configargparse
+    aiohttp
+    async-timeout
+    appdirs
+    readlike
+    requests
+    reparser
+    protobuf
+    urwid
+    mechanicalsoup
+  ];
+
+  checkInputs = [
+    httpretty
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "hangups"
+    "hangups.client"
+    "hangups.event"
+    "hangups.parsers"
+    "hangups.user"
+  ];
+
+  meta = with lib; {
+    description = "The first third-party instant messaging client for Google Hangouts";
+    homepage = "https://github.com/tdryer/hangups";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
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..6756aae4d372
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hap-python/default.nix
@@ -0,0 +1,75 @@
+{ lib
+, buildPythonPackage
+, base36
+, chacha20poly1305-reuseable
+, cryptography
+, fetchFromGitHub
+, h11
+, orjson
+, pyqrcode
+, pytest-asyncio
+, pytest-timeout
+, pytestCheckHook
+, pythonOlder
+, zeroconf
+}:
+
+buildPythonPackage rec {
+  pname = "hap-python";
+  version = "4.5.0";
+  format = "setuptools";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "ikalchev";
+    repo = "HAP-python";
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-/XJvCL9hMIrOUwGPcrvSrJ6SZ/E6BQy+isFFlAniIM4=";
+  };
+
+  propagatedBuildInputs = [
+    chacha20poly1305-reuseable
+    cryptography
+    h11
+    orjson
+    zeroconf
+  ];
+
+  passthru.optional-dependencies.QRCode = [
+    base36
+    pyqrcode
+  ];
+
+  checkInputs = [
+    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; {
+    homepage = "https://github.com/ikalchev/HAP-python";
+    description = "HomeKit Accessory Protocol implementation in python";
+    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..36b626e4dc02
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hass-nabucasa/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, acme
+, aiohttp
+, asynctest
+, atomicwrites-homeassistant
+, attrs
+, buildPythonPackage
+, fetchFromGitHub
+, pycognito
+, pytest-aiohttp
+, pytestCheckHook
+, snitun
+, warrant
+}:
+
+buildPythonPackage rec {
+  pname = "hass-nabucasa";
+  version = "0.54.1";
+
+  src = fetchFromGitHub {
+    owner = "nabucasa";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-usxyONJZQOfLWtfuGUOOHL/Js2ROo7nODqgw++LgTis=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "acme==" "acme>=" \
+      --replace "cryptography>=2.8,<37.0" "cryptography" \
+      --replace "pycognito==" "pycognito>=" \
+      --replace "snitun==" "snitun>=" \
+  '';
+
+  propagatedBuildInputs = [
+    acme
+    aiohttp
+    atomicwrites-homeassistant
+    attrs
+    pycognito
+    snitun
+    warrant
+  ];
+
+  doCheck = lib.versionAtLeast pytest-aiohttp.version "1.0.0";
+
+  checkInputs = [
+    asynctest
+    pytest-aiohttp
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "hass_nabucasa" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/NabuCasa/hass-nabucasa";
+    description = "Python module for the Home Assistant cloud integration";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ Scriptkiddi ];
+  };
+}
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..d41fca17e471
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hatasmota/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, attrs
+, buildPythonPackage
+, fetchFromGitHub
+, voluptuous
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "hatasmota";
+  version = "0.5.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "emontnemery";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-1tCTkmhO9HyfdQuymTtFdCvxG9+Xs5/dEN5tB3/2fpQ=";
+  };
+
+  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";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..4f5c1f9bf3e6
--- /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.2.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "hatch_vcs";
+    inherit version;
+    sha256 = "sha256-mRPXM7NO7JuwNF0GJsoyFlpK0t4V0c5kPDbQnKkIq/8=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    hatchling
+    setuptools-scm
+  ];
+
+  checkInputs = [
+    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..eedebeff3108
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hatchling/default.nix
@@ -0,0 +1,78 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+
+# runtime
+, editables
+, importlib-metadata # < 3.8
+, packaging
+, pathspec
+, pluggy
+, tomli
+
+# tests
+, build
+, python
+, requests
+, virtualenv
+}:
+
+let
+  pname = "hatchling";
+  version = "1.6.0";
+in
+buildPythonPackage {
+  inherit pname version;
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-vW6FBd5RGsQhf/UJJ/bRhFSUYI5AHmOmK4MMMfthNUQ=";
+  };
+
+  # listed in backend/src/hatchling/ouroboros.py
+  propagatedBuildInputs = [
+    editables
+    packaging
+    pathspec
+    pluggy
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ] ++ 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
+  checkInputs = [
+    build
+    packaging
+    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/";
+    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..d7fd299419ce
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/haversine/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, numpy
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "haversine";
+  version = "2.6.0";
+
+  src = fetchFromGitHub {
+    owner = "mapado";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-cFb2DsXIwaaJK3tiOTCc0k45FVJ4/Vudkq0rzqalGJs=";
+  };
+
+  checkInputs = [
+    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..3d8c2e53db27
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hcloud/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, future
+, mock
+, pytestCheckHook
+, python-dateutil
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "hcloud";
+  version = "1.18.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-oh2UDN6PDB/RCgWBsGGOuECm9ZJAT6r9tgcBAfRSX/Y=";
+  };
+
+  propagatedBuildInputs = [
+    future
+    requests
+    python-dateutil
+  ];
+
+  checkInputs = [
+    mock
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "hcloud"
+  ];
+
+  meta = with lib; {
+    description = "Library for the Hetzner Cloud API";
+    homepage = "https://github.com/hetznercloud/hcloud-python";
+    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..5dd94e5de2ea
--- /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 ];
+  checkInputs = [ 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..42736d0a04c2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hdate/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, astral
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+, pytz
+}:
+
+buildPythonPackage rec {
+  pname = "hdate";
+  version = "0.10.4";
+  disabled = pythonOlder "3.6";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "py-libhdate";
+    repo = "py-libhdate";
+    rev = "v${version}";
+    sha256 = "sha256-NF2ZA9ruW7sL2tLY11VAtyPRxGg2o5/mpv3ZsH/Zxb8=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    astral
+    pytz
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml --replace "^2020.5" ">=2020.5"
+  '';
+
+  pytestFlagsArray = [
+    "tests"
+  ];
+
+  pythonImportsCheck = [ "hdate" ];
+
+  meta = with lib; {
+    description = "Python module for Jewish/Hebrew date and Zmanim";
+    homepage = "https://github.com/py-libhdate/py-libhdate";
+    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..9fa932c7e418
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hdbscan/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchpatch
+, cython
+, numpy
+, pytestCheckHook
+, scipy
+, scikit-learn
+, fetchPypi
+, joblib
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "hdbscan";
+  version = "0.8.27";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "e3a418d0d36874f7b6a1bf0b7461f3857fc13a525fd48ba34caed2fe8973aa26";
+  };
+  patches = [
+    # This patch fixes compatibility with numpy 1.20. It will be in the next release
+    # after 0.8.27
+    (fetchpatch {
+      url = "https://github.com/scikit-learn-contrib/hdbscan/commit/5b67a4fba39c5aebe8187a6a418da677f89a63e0.patch";
+      sha256 = "07d7jdwk0b8kgaqkifd529sarji01j1jiih7cfccc5kxmlb5py9h";
+    })
+  ];
+
+  nativeBuildInputs = [ cython ];
+  propagatedBuildInputs = [ numpy scipy scikit-learn joblib six ];
+  preCheck = ''
+    cd hdbscan/tests
+    rm __init__.py
+  '';
+  checkInputs = [ 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"
+  ];
+
+  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;
+    maintainers = with maintainers; [ ixxie ];
+  };
+}
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..05faf08bc5e4
--- /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";
+  # See https://github.com/mtth/hdfs/issues/176.
+  version = "2.5.8";
+
+  src = fetchFromGitHub {
+    owner = "mtth";
+    repo = pname;
+    rev = version;
+    hash = "sha256-94Q3IUoX1Cb+uRqvsfpVZJ1koJSx5cQ3/XpYJ0gkQNU=";
+  };
+
+  propagatedBuildInputs = [ docopt requests six ];
+
+  checkInputs = [ fastavro nose pytestCheckHook ];
+
+  pythonImportsCheck = [ "hdfs" ];
+
+  meta = with lib; {
+    description = "Python API and command line interface for HDFS";
+    homepage = "https://github.com/mtth/hdfs";
+    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..cc953aa696e3
--- /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 = [ maintainers.costrouc ];
+  };
+}
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..6a07f1f07ca7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/headerparser/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "headerparser";
+  version = "0.4.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "jwodder";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-KJJt85iC/4oBoIelB2zUJVyHSppFem/22v6F30P5nYM=";
+  };
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  checkInputs = [
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace tox.ini \
+      --replace "--cov=headerparser" "" \
+      --replace "--no-cov-on-fail" "" \
+      --replace "--flakes" ""
+  '';
+
+  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";
+    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/heatzypy/default.nix b/nixpkgs/pkgs/development/python-modules/heatzypy/default.nix
new file mode 100644
index 000000000000..578a359778a6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/heatzypy/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, requests
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "heatzypy";
+  version = "2.0.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "Cyr-ius";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-i5tGV9nJrLRqZwJZ3y5c65MHykz34bnr3yz+OdaQEoM=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    requests
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "heatzypy"
+  ];
+
+  meta = with lib; {
+    description = "Python module to interact with Heatzy devices";
+    homepage = "https://github.com/Cyr-ius/heatzypy";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..1697c7270397
--- /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
+  ];
+
+  checkInputs = [
+    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..9bfd4de36f78
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hepunits/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools-scm
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "hepunits";
+  version = "2.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-6A5hb+8oF/PGbHXcDkHtJjYkiMzgX5Stz977jgXry1g=";
+  };
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  checkInputs = [
+    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/herepy/default.nix b/nixpkgs/pkgs/development/python-modules/herepy/default.nix
new file mode 100644
index 000000000000..045910d8a1a8
--- /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.5.8";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "abdullahselek";
+    repo = "HerePy";
+    rev = "refs/tags/${version}";
+    hash = "sha256-BwuH3GxEXiIFFM0na8Jhgp7J5TPW41/u89LWf+EprG4=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  checkInputs = [
+    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..4e65f5b91721
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/heudiconv/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, pytest
+, mock
+, dcm2niix
+, nibabel
+, pydicom
+, nipype
+, dcmstack
+, etelemetry
+, filelock
+}:
+
+buildPythonPackage rec {
+  version = "0.8.0";
+  pname = "heudiconv";
+
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    #sha256 = "0gzqqa4pzhywdbvks2qjniwhr89sgipl5k7h9hcjs7cagmy9gb05";
+    sha256 = "1r6y93125mc84c09970ifps5xysp8ffp62rwlzili3q2k1m3fh4v";
+  };
+
+  postPatch = ''
+    # doesn't exist as a separate package with Python 3:
+    substituteInPlace heudiconv/info.py --replace "'pathlib'," ""
+  '';
+
+  propagatedBuildInputs = [
+    dcm2niix nibabel pydicom nipype dcmstack etelemetry filelock
+  ];
+
+  checkInputs = [ dcm2niix pytest mock ];
+
+  # test_monitor and test_dlad require 'inotify' and 'datalad' respectively,
+  # and these aren't in Nixpkgs
+  checkPhase = "pytest -k 'not test_dlad and not test_monitor' heudiconv/tests";
+
+  meta = with lib; {
+    homepage = "https://heudiconv.readthedocs.io";
+    description = "Flexible DICOM converter for organizing imaging data";
+    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..79fc42ae3d02
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hexbytes/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, eth-utils
+, hypothesis
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "hexbytes";
+  version = "0.2.2";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "ethereum";
+    repo = "hexbytes";
+    rev = "v${version}";
+    sha256 = "sha256-SZscM6ze9yY+iRDx/5F4XbrLXIbp6QkFnzxN7zvP9CQ=";
+  };
+
+  checkInputs = [
+    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";
+    license = licenses.mit;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..75da23e9859b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hexdump/default.nix
@@ -0,0 +1,32 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "hexdump";
+  version = "3.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-14GkOwwWrOP5Nmqt5z6K06e9UTfVjwtFqy0/VIdvINs=";
+    extension = "zip";
+  };
+
+  # the source zip has no prefix, so everything gets unpacked to /build otherwise
+  sourceRoot = "source";
+  unpackPhase = ''
+    runHook preUnpack
+    mkdir source
+    pushd source
+    unzip $src
+    popd
+    runHook postUnpack
+  '';
+
+  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/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..831ed1235e72
--- /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 = "10.5.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-45FOAQDJgAfhlTF/XBmIfvmMM1X7LUzsHAb7NMQl9Fs=";
+  };
+
+  checkInputs = [
+    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..6ccde29313b7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hg-git/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, dulwich
+, mercurial
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "hg-git";
+  version = "1.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-ORGDOWLrnImca+qPtJZmyC8hGxJNCEC+tq2V4jpGIbY=";
+  };
+
+  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/hglib/default.nix b/nixpkgs/pkgs/development/python-modules/hglib/default.nix
new file mode 100644
index 000000000000..a6ed6b935ad1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hglib/default.nix
@@ -0,0 +1,43 @@
+{ lib, buildPythonPackage, fetchPypi, fetchpatch, substituteAll, python, nose, mercurial }:
+
+buildPythonPackage rec {
+  pname = "python-hglib";
+  version = "2.6.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "7c1fa0cb4d332dd6ec8409b04787ceba4623e97fb378656f7cab0b996c6ca3b2";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./hgpath.patch;
+      hg = "${mercurial}/bin/hg";
+    })
+
+    # These two patches are needed to fix the tests.
+    # They will need to be removed on the next update.
+    (fetchpatch {
+      url = "https://www.mercurial-scm.org/repo/python-hglib/raw-rev/12e6aaef0f6e";
+      sha256 = "159pmhy23gqcc6rkh5jrni8fba4xbhxwcc0jf02wqr7f82kv8a7x";
+    })
+    (fetchpatch {
+      url = "https://www.mercurial-scm.org/repo/python-hglib/raw-rev/1a318162f06f";
+      sha256 = "04lxfc15m3yw5kvp133xg8zv09l8kndi146xk3lnbbm07fgcnn1z";
+    })
+  ];
+
+  checkInputs = [ nose ];
+
+  checkPhase = ''
+    ${python.interpreter} test.py --with-hg "${mercurial}/bin/hg" -v
+  '';
+
+  meta = with lib; {
+    description = "Mercurial Python library";
+    homepage = "http://selenic.com/repo/python-hglib";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dfoxfranke ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hglib/hgpath.patch b/nixpkgs/pkgs/development/python-modules/hglib/hgpath.patch
new file mode 100644
index 000000000000..2141aa32a139
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hglib/hgpath.patch
@@ -0,0 +1,24 @@
+diff -r 2d0ec6097d78 hglib/__init__.py
+--- a/hglib/__init__.py	Mon Apr 30 15:43:29 2018 +0900
++++ b/hglib/__init__.py	Tue Mar 19 23:30:01 2019 +0100
+@@ -1,7 +1,7 @@
+ import subprocess
+ from hglib import client, util, error
+ 
+-HGPATH = 'hg'
++HGPATH = '@hg@'
+ 
+ def open(path=None, encoding=None, configs=None):
+     '''starts a cmdserver for the given path (or for a repository found
+diff -r 2d0ec6097d78 tests/common.py
+--- a/tests/common.py	Mon Apr 30 15:43:29 2018 +0900
++++ b/tests/common.py	Tue Mar 19 23:30:01 2019 +0100
+@@ -26,7 +26,7 @@
+         os.mkdir(self._testtmp)
+         os.chdir(self._testtmp)
+         # until we can run norepo commands in the cmdserver
+-        os.system('hg init')
++        os.system('@hg@ init')
+         self.client = hglib.open()
+ 
+     def tearDown(self):
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..21af8addaac0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hickle/default.nix
@@ -0,0 +1,52 @@
+{ buildPythonPackage
+, fetchPypi
+, pythonOlder
+, h5py
+, numpy
+, dill
+, astropy
+, scipy
+, pandas
+, codecov
+, pytest
+, pytest-cov
+, pytest-runner
+, coveralls
+, twine
+, check-manifest
+, lib
+}:
+
+buildPythonPackage rec {
+  pname   = "hickle";
+  version = "4.0.4";
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0d35030a76fe1c7fa6480088cde932689960ed354a2539ffaf5f3c90c578c06f";
+  };
+
+  postPatch = ''
+    substituteInPlace requirements_test.txt \
+      --replace 'astropy<3.1;' 'astropy;' --replace 'astropy<3.0;' 'astropy;'
+  '';
+
+  propagatedBuildInputs = [ h5py numpy dill ];
+
+  doCheck = false; # incompatible with latest astropy
+  checkInputs = [
+    pytest pytest-cov pytest-runner coveralls scipy pandas astropy twine check-manifest codecov
+  ];
+
+  pythonImportsCheck = [ "hickle" ];
+
+  meta = {
+    # incompatible with h5py>=3.0, see https://github.com/telegraphic/hickle/issues/143
+    broken = true;
+    description = "Serialize Python data to HDF5";
+    homepage = "https://github.com/telegraphic/hickle";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ bcdarwin ];
+  };
+}
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..5546b71fea0e
--- /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;
+    sha256 = "sha256-HpVOf3q5t8nfx421lQRpLBfbO3EklJK5drFSW5fbsOg=";
+  };
+
+  propagatedBuildInputs = [ hidapi ];
+
+  checkInputs = [ 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..977d94e8a20c
--- /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.12.0.post2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "8ebb2117be8b27af5c780936030148e1971b6b7fda06e0581ff0bfb15e94ed76";
+  };
+
+  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..ae657fcd06d6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hijri-converter/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "hijri-converter";
+  version = "2.2.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-nh2fpMIg9oZ9oquxqWJAZ1rpdKu6lRxoangfTvasIY8=";
+  };
+
+  checkInputs = [
+    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";
+    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..274157c9616d
--- /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
+  ];
+
+  checkInputs = [
+    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..eea5e5bf8043
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hiredis/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+
+# tested using
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "hiredis";
+  version = "2.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "81d6d8e39695f2c37954d1011c0480ef7cf444d4e3ae24bc5e89ee5de360139a";
+  };
+
+  pythonImportsCheck = [ "hiredis" ];
+
+  checkPhase = ''
+    mv hiredis _hiredis
+    ${python.interpreter} test.py
+  '';
+
+  meta = with lib; {
+    description = "Wraps protocol parsing code in hiredis, speeds up parsing of multi bulk replies";
+    homepage = "https://github.com/redis/hiredis-py";
+    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..00b560609641
--- /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 = "0.5.1";
+  src = fetchPypi {
+    inherit pname version;
+
+    sha256 = "d10e3b7f27b36673b4fa1283cd38d610326ba1ff1291260d0275152f15ae4bc7";
+  };
+
+  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/hiyapyco/default.nix b/nixpkgs/pkgs/development/python-modules/hiyapyco/default.nix
new file mode 100644
index 000000000000..5ecad9656783
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hiyapyco/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pyyaml
+, jinja2
+}:
+
+buildPythonPackage rec {
+  pname = "hiyapyco";
+  version = "0.5.0";
+
+  src = fetchFromGitHub {
+    owner = "zerwes";
+    repo = pname;
+    rev = "refs/tags/release-${version}";
+    sha256 = "sha256-v+q7MOJvRc8rzBzwf27jmuIHpZeYGDK7VbzB98qnhrQ=";
+  };
+
+  propagatedBuildInputs = [
+    pyyaml
+    jinja2
+  ];
+
+  postPatch = ''
+    # Should no longer be needed with the next release
+    # https://github.com/zerwes/hiyapyco/pull/42
+    substituteInPlace setup.py \
+      --replace "Jinja2>1,<3" "Jinja2>1"
+  '';
+
+  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..43e7a8f4ce35
--- /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";
+  };
+
+  checkInputs = [ 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/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..8c699af97526
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hmmlearn/default.nix
@@ -0,0 +1,27 @@
+{ lib, fetchurl, buildPythonPackage
+, numpy, scikit-learn, pybind11, setuptools-scm, cython
+, pytestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "hmmlearn";
+  version = "0.2.7";
+
+  src = fetchurl {
+    url = "mirror://pypi/h/hmmlearn/${pname}-${version}.tar.gz";
+    sha256 = "sha256-a0snIPJ6912pNnq02Q3LAPONozFo322Rf57F3mZw9uE=";
+  };
+
+  buildInputs = [ setuptools-scm cython pybind11 ];
+  propagatedBuildInputs = [ numpy scikit-learn ];
+  checkInputs = [ 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/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..3175a8fabb58
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hole/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, aiohttp
+, async-timeout
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "hole";
+  version = "0.7.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-yZpzGfB5RTWaRn2DmT+cbSDC0pL16FyUc0Nr/V6TlhU=";
+  };
+
+  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";
+    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..446774de681e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/holidays/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, convertdate
+, python-dateutil
+, fetchPypi
+, hijri-converter
+, korean-lunar-calendar
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "holidays";
+  version = "0.14.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-DnD9F0gErqHIcLFRMZ+uvNXNsNlVt4IwQ04a/Rd4SY4=";
+  };
+
+  propagatedBuildInputs = [
+    convertdate
+    python-dateutil
+    hijri-converter
+    korean-lunar-calendar
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "holidays"
+  ];
+
+  meta = with lib; {
+    description = "Generate and work with holidays in Python";
+    homepage = "https://github.com/dr-prodigy/python-holidays";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jluttine ];
+  };
+}
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..d0d2de64660d
--- /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.15.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-MS5g0kQGw6euxGJhg2s426JYXjZrzLReR0eVBIBetbo=";
+  };
+
+  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 = "http://www.holoviews.org/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ costrouc ];
+  };
+}
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..17c25f74b765
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/home-assistant-bluetooth/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, poetry-core
+, bleak
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "home-assistant-bluetooth";
+  version = "1.4.0";
+  format = "pyproject";
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "home-assistant-libs";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-viJOrmvrooHh47yyJJomOGBhQvcoWM3jKMRwZ+6/UJ8=";
+  };
+
+  postPatch = ''
+    # drop pytest parametrization (coverage, etc.)
+    sed -i '/addopts/d' pyproject.toml
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    bleak
+  ];
+
+  pythonImportsCheck = [
+    "home_assistant_bluetooth"
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Basic bluetooth models used by Home Assistant";
+    changelog = "https://github.com/home-assistant-libs/home-assistant-bluetooth/blob/main/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/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..a3e5c2ddb1dc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/homeconnect/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, requests
+, requests-oauthlib
+, pythonOlder
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "homeconnect";
+  version = "0.7.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-wCx8Jh3NBTnYI+essH9toacjUaT4fS61SaAAZDCYZ4g=";
+  };
+
+  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..451a383f84a6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/homematicip/default.nix
@@ -0,0 +1,92 @@
+{ 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.7";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "hahn-th";
+    repo = "homematicip-rest-api";
+    rev = "refs/tags/${version}";
+    hash = "sha256-1nT5P3HNwwEJSSRbl77DXCuPPxGqiVFXNUK6Q3ZiByU=";
+  };
+
+  propagatedBuildInputs = [
+    aenum
+    aiohttp
+    async-timeout
+    requests
+    websocket-client
+    websockets
+  ];
+
+  checkInputs = [
+    aiohttp-wsgi
+    pytest-aiohttp
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "--asyncio-mode=legacy"
+  ];
+
+  disabledTests = [
+    # Assert issues with datetime
+    "test_contact_interface_device"
+    "test_dimmer"
+    "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";
+    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..bc4ddc0e0b56
--- /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;
+    sha256 = "sha256-COOGqfYiR4tueQHXuCvVxShrYS0XNltcW4mclbFWcfA=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    pyjwt
+    yarl
+  ];
+
+  checkInputs = [
+    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..f726340b7c88
--- /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 = [ maintainers.costrouc ];
+  };
+
+}
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..995f10073c67
--- /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.gpl1;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..7b5c63c95b43
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/howdoi/default.nix
@@ -0,0 +1,78 @@
+{ stdenv
+, lib
+, appdirs
+, buildPythonPackage
+, cachelib
+, cssselect
+, fetchFromGitHub
+, keep
+, lxml
+, pygments
+, pyquery
+, requests
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "howdoi";
+  version = "2.0.19";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "gleitz";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-uLAc6E8+8uPpo070vsG6Od/855N3gTQMf5pSUvtlh0I=";
+  };
+
+  propagatedBuildInputs = [
+    appdirs
+    cachelib
+    cssselect
+    keep
+    lxml
+    pygments
+    pyquery
+    requests
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  disabledTests = [
+    # AssertionError: "The...
+    "test_get_text_with_one_link"
+    "test_get_text_without_links"
+    # Those tests are failing in the sandbox
+    # OSError: [Errno 24] Too many open files
+    "test_answers"
+    "test_answers_bing"
+    "test_colorize"
+    "test_json_output"
+    "test_missing_pre_or_code_query"
+    "test_multiple_answers"
+    "test_position"
+    "test_unicode_answer"
+    "test_answer_links_using_l_option"
+  ];
+
+  pythonImportsCheck = [
+    "howdoi"
+  ];
+
+  meta = with lib; {
+    broken = (stdenv.isLinux && stdenv.isAarch64) || stdenv.isDarwin;
+    description = "Instant coding answers via the command line";
+    homepage = "https://github.com/gleitz/howdoi";
+    license = licenses.mit;
+    maintainers = with maintainers; [ costrouc ];
+  };
+}
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..842c6d5f8bfc
--- /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}";
+    sha256 = "sha256-2CehGy3K5fKbkB1J8+8x1D4XvnBn1Mbapx+p8rdXDYc=";
+  };
+
+  checkInputs = [
+    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; [ SuperSandro2000 ];
+  };
+}
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..74372f57641e
--- /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.8.0";
+
+  src = fetchFromGitHub {
+    owner = "NVIDIA";
+    repo = "hpc-container-maker";
+    rev = "v${version}";
+    sha256 = "sha256-nq1zixIu/Kv2CtkQX1Sw7Q3BsOZKcCJjV0+uroXPEBs=";
+  };
+
+  propagatedBuildInputs = [ six archspec ];
+  checkInputs = [ 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/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..00e50e8259d7
--- /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.3";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "hsluv";
+    repo = "hsluv-python";
+    rev = "v${version}";
+    sha256 = "sha256-p3KD+zhHCOs/rLUVf1IkW/isfpUPQstB2VHGmZ/aEPU=";
+  };
+
+  checkInputs = [
+    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..249c9abff842
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hstspreload/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "hstspreload";
+  version = "2022.8.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "sethmlarson";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-lQ28j4vOtxSjkMZXTKG+vesAN9KWj5T4sZ3QbaWP9Gw=";
+  };
+
+  # 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; [ costrouc SuperSandro2000 ];
+  };
+}
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..09539b590cb3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/html-sanitizer/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, lxml
+, beautifulsoup4
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "html-sanitizer";
+  version = "1.9.3";
+
+  src = fetchFromGitHub {
+    owner = "matthiask";
+    repo = pname;
+    rev = version;
+    hash = "sha256-1JSdi1PFM+N+UuEPfgWkOZw8S2PZ4ntadU0wnVJNnjw=";
+  };
+
+  propagatedBuildInputs = [
+    lxml
+    beautifulsoup4
+  ];
+
+  checkInputs = [
+    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";
+    license = with licenses; [ bsd3 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..51b92c8a4f69
--- /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";
+  };
+
+  checkInputs = [ 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..3909c352185f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/html5-parser/default.nix
@@ -0,0 +1,22 @@
+{ lib, buildPythonPackage, fetchPypi, pkgs, pkg-config, chardet, lxml }:
+
+buildPythonPackage rec {
+  pname = "html5-parser";
+  version = "0.4.10";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f9294418c0da95c2d5facc19d3dc32941093a6b8e3b3e4b36cc7b5a1697fbca4";
+  };
+
+  nativeBuildInputs = [ pkg-config ];
+  propagatedBuildInputs = [ chardet lxml pkgs.libxml2 ];
+
+  doCheck = false; # No such file or directory: 'run_tests.py'
+
+  meta = with lib; {
+    description = "Fast C based HTML 5 parsing for python";
+    homepage = "https://html5-parser.readthedocs.io";
+    license = licenses.asl20;
+  };
+}
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..58da63d02edd
--- /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";
+      sha256 = "sha256-VGCeB6o2QO/skeCZs8XLPfgEYVOSRL8cCpG7ajbZWEs=";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    six
+    webencodings
+  ];
+
+  # latest release not compatible with pytest 6
+  doCheck = false;
+  checkInputs = [
+    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/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/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/httmock/default.nix b/nixpkgs/pkgs/development/python-modules/httmock/default.nix
new file mode 100644
index 000000000000..7928189c7cd1
--- /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;
+    sha256 = "sha256-yid4vh1do0zqVzd1VV7gc+Du4VPrkeGFsDHqNbHL28I=";
+  };
+
+  checkInputs = [
+    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..638191ee7fc4
--- /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 ];
+
+  checkInputs = [ 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..fb67dd34c7b5
--- /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.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "pyauth";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-CMF9p913P04Hx/221ck1e0AoAsP7aXkX2UKp4S1nnU0=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    cryptography
+    http-sfv
+  ];
+
+  checkInputs = [
+    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..d98785576f48
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/http-parser/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "http-parser";
+  version = "0.9.0";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "benoitc";
+    repo = pname;
+    rev = version;
+    sha256 = "05byv1079qi7ypvzm13yf5nc23ink6gr6c5wrhq7fwld4syscy2q";
+  };
+
+  checkInputs = [ pytest ];
+
+  checkPhase = "pytest testing/";
+
+  pythonImportsCheck = [ "http_parser" ];
+
+  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..abee83637215
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/http-sfv/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, 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=";
+  };
+
+  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..fae412075bc1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/httpagentparser/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "httpagentparser";
+  version = "1.9.3";
+
+  # Github version does not have any release tags
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1x20j4gyx4vfsxs3bx8qcbdhq7n34gjr8gd01qlri96wpmn4c3rp";
+  };
+
+  # PyPi version does not include test directory
+  doCheck = false;
+
+  pythonImportsCheck = [ "httpagentparser" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/shon/httpagentparser";
+    description = "Extracts OS Browser etc information from http user agent string";
+    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..98c50fd15232
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/httpbin/default.nix
@@ -0,0 +1,77 @@
+{ lib
+, brotlipy
+, buildPythonPackage
+, decorator
+, fetchpatch
+, fetchPypi
+, flask
+, flask-limiter
+, itsdangerous
+, markupsafe
+, raven
+, six
+, pytestCheckHook
+, werkzeug
+}:
+
+buildPythonPackage rec {
+  pname = "httpbin";
+  version = "0.7.0";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-y7N3kMkVdfTxV1f0KtQdn3KesifV7b6J5OwXVIbbjfo=";
+  };
+
+  patches = [
+    (fetchpatch {
+      # Replaces BaseResponse class with Response class for Werkezug 2.1.0 compatibility
+      # https://github.com/postmanlabs/httpbin/pull/674
+      url = "https://github.com/postmanlabs/httpbin/commit/5cc81ce87a3c447a127e4a1a707faf9f3b1c9b6b.patch";
+      hash = "sha256-SbEWjiqayMFYrbgAPZtSsXqSyCDUz3z127XgcKOcrkE=";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    brotlipy
+    decorator
+    flask
+    flask-limiter
+    itsdangerous
+    markupsafe
+    raven
+    six
+    werkzeug
+  ] ++ raven.optional-dependencies.flask;
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "test_httpbin.py"
+  ];
+
+  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/kennethreitz/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..5016ece96f2f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/httpcore/default.nix
@@ -0,0 +1,76 @@
+{ lib
+, anyio
+, buildPythonPackage
+, certifi
+, fetchFromGitHub
+, h11
+, h2
+, pproxy
+, pytest-asyncio
+, pytest-httpbin
+, pytest-trio
+, pytestCheckHook
+, pythonOlder
+, sniffio
+, socksio
+}:
+
+buildPythonPackage rec {
+  pname = "httpcore";
+  version = "0.15.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "encode";
+    repo = pname;
+    rev = version;
+    hash = "sha256-FF3Yzac9nkVcA5bHVOz2ymvOelSfJ0K6oU8UWpBDcmo=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "h11>=0.11,<0.13" "h11>=0.11,<0.14"
+  '';
+
+  propagatedBuildInputs = [
+    anyio
+    certifi
+    h11
+    sniffio
+  ];
+
+  passthru.optional-dependencies = {
+    http2 = [
+      h2
+    ];
+    socks = [
+      socksio
+    ];
+  };
+
+  checkInputs = [
+    pproxy
+    pytest-asyncio
+    pytest-httpbin
+    pytest-trio
+    pytestCheckHook
+  ] ++ passthru.optional-dependencies.http2
+    ++ passthru.optional-dependencies.socks;
+
+  pythonImportsCheck = [
+    "httpcore"
+  ];
+
+  pytestFlagsArray = [
+    "--asyncio-mode=strict"
+  ];
+
+  meta = with lib; {
+    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..143822de63b9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/httpie/default.nix
@@ -0,0 +1,105 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, installShellFiles
+, pandoc
+, pythonOlder
+# BuildInputs
+, charset-normalizer
+, defusedxml
+, multidict
+, pygments
+, requests
+, requests-toolbelt
+, setuptools
+, rich
+, pysocks
+# CheckInputs
+, pytest-httpbin
+, pytest-lazy-fixture
+, pytest-mock
+, pytestCheckHook
+, responses
+, werkzeug
+}:
+
+buildPythonPackage rec {
+  pname = "httpie";
+  version = "3.2.1";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "httpie";
+    repo = "httpie";
+    rev = version;
+    hash = "sha256-WEe8zSlNckl7bPBi6u8mHQ1/xPw3kE81F8Xr15TchgM=";
+  };
+
+  nativeBuildInputs = [
+    installShellFiles
+    pandoc
+  ];
+
+  propagatedBuildInputs = [
+    charset-normalizer
+    defusedxml
+    multidict
+    pygments
+    requests
+    requests-toolbelt
+    setuptools
+    rich
+    pysocks
+  ];
+
+  checkInputs = [
+    pytest-httpbin
+    pytest-lazy-fixture
+    pytest-mock
+    pytestCheckHook
+    responses
+    werkzeug
+  ];
+
+  postInstall = ''
+    # install completions
+    installShellCompletion --bash \
+      --name http.bash extras/httpie-completion.bash
+    installShellCompletion --fish \
+      --name http.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"
+  ] ++ 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/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ antono relrod schneefux SuperSandro2000 ];
+  };
+}
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..7f331c8edad4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/httplib2/default.nix
@@ -0,0 +1,79 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, cryptography
+, fetchFromGitHub
+, isPy27
+, mock
+, pyparsing
+, pytest-forked
+, pytest-randomly
+, pytest-timeout
+, pytestCheckHook
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "httplib2";
+  version = "0.20.4";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-eLvxmG9PUX+2RB3M6oG442Wmh6c5GI/aKP/Z8Z5Ixq8=";
+  };
+
+  propagatedBuildInputs = [
+    pyparsing
+  ];
+
+  checkInputs = [
+    cryptography
+    mock
+    pytest-forked
+    pytest-randomly
+    pytest-timeout
+    six
+    pytestCheckHook
+  ];
+
+  # Don't run tests for Python 2.7
+  doCheck = !isPy27;
+
+  postPatch = ''
+    sed -i "/--cov/d" setup.cfg
+  '';
+
+  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..a47d531e332b
--- /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 ];
+
+  checkInputs = [
+    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..963a9ff5ebfe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/httptools/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+}:
+
+buildPythonPackage rec {
+  pname = "httptools";
+  version = "0.4.0";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-LJqTDDeLPRXWtpX7levP+BpzlbT5d1xPEKB2vrCywf8=";
+  };
+
+  # 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";
+    license = licenses.mit;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..a014872ad696
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/httpx-ntlm/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, cryptography
+, fetchPypi
+, httpx
+, pyspnego
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "httpx-ntlm";
+  version = "1.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "httpx_ntlm";
+    inherit version;
+    hash = "sha256-pv/OxgcO0JWk2nCZp+bKlOdX7NqV6V5xZRDy5dd13qQ=";
+  };
+
+  propagatedBuildInputs = [
+    cryptography
+    httpx
+    pyspnego
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "pyspnego==0.3.*" "pyspnego>=0.3.*" \
+      --replace "cryptography==36.0.*" "cryptography>=36.0.*"
+  '';
+
+  # 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";
+    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..74f2f41eb260
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/httpx-socks/default.nix
@@ -0,0 +1,72 @@
+{ lib
+, async-timeout
+, buildPythonPackage
+, curio
+, fetchFromGitHub
+, flask
+, httpcore
+, httpx
+, hypercorn
+, pytest-asyncio
+, pytest-trio
+, pytestCheckHook
+, python-socks
+, pythonOlder
+, sniffio
+, starlette
+, trio
+, yarl
+}:
+
+buildPythonPackage rec {
+  pname = "httpx-socks";
+  version = "0.7.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "romis2012";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-+eWGmCHkXQA+JaEgofqUeFyGyMxSctal+jsqsShFM58=";
+  };
+
+  propagatedBuildInputs = [
+    httpx
+    httpcore
+    python-socks
+  ];
+
+  passthru.optional-dependencies = {
+    asyncio = [ async-timeout ];
+    trio = [ trio ];
+  };
+
+  checkInputs = [
+    flask
+    hypercorn
+    pytest-asyncio
+    pytest-trio
+    pytestCheckHook
+    starlette
+    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";
+    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..ab5a6820529e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/httpx/default.nix
@@ -0,0 +1,116 @@
+{ lib
+, brotli
+, brotlicffi
+, buildPythonPackage
+, certifi
+, chardet
+, click
+, fetchFromGitHub
+, h2
+, httpcore
+, isPyPy
+, pygments
+, python
+, pythonOlder
+, rfc3986
+, rich
+, sniffio
+, socksio
+, pytestCheckHook
+, pytest-asyncio
+, pytest-trio
+, trustme
+, uvicorn
+}:
+
+buildPythonPackage rec {
+  pname = "httpx";
+  version = "0.23.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "encode";
+    repo = pname;
+    rev = version;
+    hash = "sha256-s11Yeizm3y3w5D6ACQ2wp/KJ0+1ALY/R71IlTP2pMC4=";
+  };
+
+  propagatedBuildInputs = [
+    certifi
+    httpcore
+    rfc3986
+    sniffio
+  ];
+
+  passthru.optional-dependencies = {
+    http2 = [
+      h2
+    ];
+    socks = [
+      socksio
+    ];
+    brotli = if isPyPy then [
+      brotlicffi
+    ] else [
+      brotli
+    ];
+    cli = [
+      click
+      rich
+      pygments
+    ];
+  };
+
+  checkInputs = [
+    chardet
+    pytestCheckHook
+    pytest-asyncio
+    pytest-trio
+    trustme
+    uvicorn
+  ] ++ passthru.optional-dependencies.http2
+    ++ passthru.optional-dependencies.brotli
+    ++ passthru.optional-dependencies.socks;
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --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"
+  ];
+
+  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; {
+    description = "The next generation HTTP client";
+    homepage = "https://github.com/encode/httpx";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ costrouc 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..2effc358f5dd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/huawei-lte-api/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, pycryptodomex
+, pytestCheckHook
+, requests
+, xmltodict
+}:
+
+buildPythonPackage rec {
+  pname = "huawei-lte-api";
+  version = "1.6.1";
+
+  disabled = pythonOlder "3.4";
+
+  src = fetchFromGitHub {
+    owner = "Salamek";
+    repo = "huawei-lte-api";
+    rev = "refs/tags/${version}";
+    hash = "sha256-ZjSD+/okbFF14YQgCzzH1+FDS+MZQZb1JUINOKdSshs=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "pytest-runner" ""
+  '';
+
+  propagatedBuildInputs = [
+    pycryptodomex
+    requests
+    xmltodict
+  ];
+
+  checkInputs = [
+    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";
+    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..38c25fa1b0c8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/huey/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchFromGitHub, redis }:
+
+buildPythonPackage rec {
+  pname = "huey";
+  version = "2.4.2";
+
+  src = fetchFromGitHub {
+    owner = "coleifer";
+    repo = pname;
+    rev = version;
+    sha256 = "00fi04991skq61gjrmig8ry6936pc8zs7p8py8spfipbxf1irkjg";
+  };
+
+  propagatedBuildInputs = [ redis ];
+
+  # connects to redis
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A little task queue for python";
+    homepage = "https://github.com/coleifer/huey";
+    license = licenses.mit;
+    maintainers = [ maintainers.globin ];
+  };
+}
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..f19c7a9dd39f
--- /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 ];
+
+  checkInputs = [ 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..26c703b4c254
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/huggingface-hub/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, pythonOlder
+, filelock
+, importlib-metadata
+, packaging
+, pyyaml
+, requests
+, ruamel-yaml
+, tqdm
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "huggingface-hub";
+  version = "0.8.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "huggingface";
+    repo = "huggingface_hub";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-XerI4dkGsnxbOE1Si70adVIwLIrStZ3HSuQPAQoJtnQ=";
+  };
+
+  propagatedBuildInputs = [
+    filelock
+    packaging
+    pyyaml
+    requests
+    ruamel-yaml
+    tqdm
+    typing-extensions
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  # 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; [ ];
+  };
+}
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..a8db5e2abc93
--- /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
+  ];
+
+  checkInputs = [
+    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..a995e56b1da6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/humanize/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, freezegun
+, gettext
+, importlib-metadata
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  version = "4.3.0";
+  pname = "humanize";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "python-humanize";
+    repo = pname;
+    rev = version;
+    hash = "sha256-sccv3HtCgG/znZs/sfmeeOHK3xchv9zRrNX/SxyEbCQ=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+    gettext
+  ];
+
+  propagatedBuildInputs = [
+    setuptools
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  postBuild = ''
+    scripts/generate-translation-binaries.sh
+  '';
+
+  postInstall = ''
+    cp -r 'src/humanize/locale' "$out/lib/"*'/site-packages/humanize/'
+  '';
+
+  checkInputs = [
+    freezegun
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "humanize"
+  ];
+
+  meta = with lib; {
+    description = "Python humanize utilities";
+    homepage = "https://github.com/python-humanize/humanize";
+    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..58672a3663e5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/humblewx/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, wxPython_4_0
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "humblewx";
+  version = "0.2.2";
+
+  src = fetchFromGitHub {
+    owner = "thetimelineproj";
+    repo = pname;
+    rev = version;
+    sha256 = "0fv8gwlbcj000qq34inbwgxf0xgibs590dsyqnw0mmyb7f1iq210";
+  };
+
+  # timeline is not compatible with wxPython_4_1. reported upstream
+  propagatedBuildInputs = [ wxPython_4_0 ];
+
+  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..972606974602
--- /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.10.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-zW9Rtyx1h7ybzopl7NAloelfGwMoRRm/6RKE0BAxbNk=";
+  };
+
+  # 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)
+  checkInputs = [
+    pytestCheckHook
+  ] ++ lib.optional (!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..0df01749e953
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/huum/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchPypi
+, poetry-core
+, pydantic
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "huum";
+  version = "0.6.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-PYOjfLPa/vZZP0IZuUZnQ74IrTRvizgYhKOmhd83aMQ=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    pydantic
+  ];
+
+  # Tests are not shipped and source not tagged
+  # https://github.com/frwickst/pyhuum/issues/2
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "huum"
+  ];
+
+  meta = with lib; {
+    description = "Library for for Huum saunas";
+    homepage = "https://github.com/frwickst/pyhuum";
+    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..c30566a45109
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hvac/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pyhcl
+, requests
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "hvac";
+  version = "0.11.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f905c59d32d88d3f67571fe5a8a78de4659e04798ad809de439f667247d13626";
+  };
+
+  propagatedBuildInputs = [
+    pyhcl
+    requests
+    six
+  ];
+
+  # Requires running a Vault server
+  doCheck = false;
+
+  pythonImportsCheck = [ "hvac" ];
+
+  meta = with lib; {
+    description = "HashiCorp Vault API client";
+    homepage = "https://github.com/ianunruh/hvac";
+    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..c39fc338a176
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hvplot/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, bokeh
+, buildPythonPackage
+, colorcet
+, fetchPypi
+, holoviews
+, pandas
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "hvplot";
+  version = "0.8.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-hjDbo0lpsQXiZ8vhQjfi1W2ZacgBmArl5RkLwYsnktY=";
+  };
+
+  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";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ costrouc ];
+  };
+}
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..fabe8c3f95df
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hwi/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, bitbox02
+, cbor
+, ecdsa
+, hidapi
+, libusb1
+, mnemonic
+, pyaes
+, pyserial
+, typing-extensions
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "hwi";
+  version = "2.1.1";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "bitcoin-core";
+    repo = "HWI";
+    rev = version;
+    sha256 = "sha256-jsJjGezf2JrPYr3YNZGx23Jo14DbmM1S6bu7+xgZh58=";
+  };
+
+  propagatedBuildInputs = [
+    bitbox02
+    cbor
+    ecdsa
+    hidapi
+    libusb1
+    mnemonic
+    pyaes
+    pyserial
+    typing-extensions
+  ];
+
+  # relax required dependencies:
+  # libusb1           - https://github.com/bitcoin-core/HWI/issues/579
+  # typing-extensions - https://github.com/bitcoin-core/HWI/issues/572
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace 'libusb1>=1.7,<3' 'libusb1>=1.7,<4' \
+      --replace 'typing-extensions>=3.7,<4.0' 'typing-extensions>=3.7,<5.0'
+  '';
+
+  # 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";
+    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..a962f86854f2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hy/default.nix
@@ -0,0 +1,77 @@
+{ lib
+, astor
+, buildPythonPackage
+, colorama
+, fetchFromGitHub
+, funcparserlib
+, hy
+, pytestCheckHook
+, python
+, pythonOlder
+, rply
+, testers
+, toPythonApplication
+, hyDefinedPythonPackages ? python-packages: [ ] /* Packages like with python.withPackages */
+}:
+
+buildPythonPackage rec {
+  pname = "hy";
+  version = "1.0a4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "hylang";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-MBzp3jqBg/kH233wcgYYHc+Yg9GuOaBsXIfjFDihD1E=";
+  };
+
+  # https://github.com/hylang/hy/blob/1.0a4/get_version.py#L9-L10
+  HY_VERSION = version;
+
+  propagatedBuildInputs = [
+    colorama
+    funcparserlib
+    rply # TODO: remove on the next release
+  ]
+  ++ lib.optionals (pythonOlder "3.9") [
+    astor
+  ]
+  # for backwards compatibility with removed pkgs/development/interpreters/hy
+  # See: https://github.com/NixOS/nixpkgs/issues/171428
+  ++ (hyDefinedPythonPackages python.pkgs);
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Don't test the binary
+    "test_bin_hy"
+    "test_hystartup"
+    "est_hy2py_import"
+  ];
+
+  pythonImportsCheck = [ "hy" ];
+
+  passthru = {
+    tests.version = testers.testVersion {
+      package = hy;
+      command = "hy -v";
+    };
+    # also for backwards compatibility with removed pkgs/development/interpreters/hy
+    withPackages = python-packages: (toPythonApplication hy).override {
+      hyDefinedPythonPackages = python-packages;
+    };
+  };
+
+  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..8c1fd56b8d3a
--- /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.4";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.10";
+
+  src = fetchFromGitHub {
+    owner = "nix-community";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-voSbpOPJUPjwzdMLVt2TC/FIi6LKk01PLd/GczOAUR8=";
+  };
+
+  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/default.nix b/nixpkgs/pkgs/development/python-modules/hydra/default.nix
new file mode 100644
index 000000000000..82409936d6ab
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hydra/default.nix
@@ -0,0 +1,64 @@
+{ stdenv
+, lib
+, antlr4_9-python3-runtime
+, buildPythonPackage
+, fetchFromGitHub
+, importlib-resources
+, jre_headless
+, omegaconf
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "hydra";
+  version = "1.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "facebookresearch";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-4r0ZWW9SGl35Oupf0ejwL/s6Nas6RoSN2egiBrvFZIA=";
+  };
+
+  nativeBuildInputs = [
+    jre_headless
+  ];
+
+  propagatedBuildInputs = [
+    antlr4_9-python3-runtime
+    omegaconf
+  ] ++ lib.optionals (pythonOlder "3.9") [
+    importlib-resources
+  ];
+
+  checkInputs = [
+    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"
+  ];
+
+  meta = with lib; {
+    broken = (stdenv.isLinux && stdenv.isAarch64) || stdenv.isDarwin;
+    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..3dfeff72609f
--- /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 ];
+
+  checkInputs = [
+    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/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..35a9f8f6bb85
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hypercorn/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitLab
+, pythonOlder
+, typing-extensions
+, wsproto
+, toml
+, h2
+, priority
+, mock
+, poetry-core
+, pytest-asyncio
+, pytest-cov
+, pytest-sugar
+, pytest-trio
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "Hypercorn";
+  version = "0.13.2";
+  disabled = pythonOlder "3.7";
+  format = "pyproject";
+
+  src = fetchFromGitLab {
+    owner = "pgjones";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-fIjw5A6SvFUv8cU7xunVlPYphv+glypY4pzvHNifYLQ=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [ wsproto toml h2 priority ]
+    ++ lib.optionals (pythonOlder "3.8") [ typing-extensions ];
+
+  checkInputs = [
+    pytest-asyncio
+    pytest-cov
+    pytest-sugar
+    pytest-trio
+    pytestCheckHook
+  ] ++ lib.optionals (pythonOlder "3.8") [ mock ];
+
+  pytestFlagsArray = [
+    "--asyncio-mode=legacy"
+  ];
+
+  pythonImportsCheck = [ "hypercorn" ];
+
+  meta = with lib; {
+    homepage = "https://pgjones.gitlab.io/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..e22dc0761a78
--- /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";
+  };
+
+  checkInputs = [ 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; [ SuperSandro2000 ];
+  };
+}
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..ed57ad767b07
--- /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}";
+    sha256 = "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
+  ];
+
+  checkInputs = [
+    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/hypothesis-auto/default.nix b/nixpkgs/pkgs/development/python-modules/hypothesis-auto/default.nix
new file mode 100644
index 000000000000..692db49adce6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hypothesis-auto/default.nix
@@ -0,0 +1,36 @@
+{ lib, buildPythonPackage, fetchPypi
+, hypothesis
+, poetry
+, pydantic
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "hypothesis-auto";
+  version = "1.1.4";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1c9jksza0gg2gva3liy0s8riv6imjavhnqw05m8l5660knq2yb2y";
+  };
+
+  nativeBuildInputs = [
+    poetry
+  ];
+
+  propagatedBuildInputs = [
+    pydantic
+    hypothesis
+    pytest
+  ];
+
+  pythonImportsCheck = [ "hypothesis_auto" ];
+
+  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..1e8afe9e543a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hypothesis/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, attrs
+, exceptiongroup
+, pexpect
+, doCheck ? true
+, pytestCheckHook
+, pytest-xdist
+, sortedcontainers
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "hypothesis";
+  version = "6.50.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "HypothesisWorks";
+    repo = "hypothesis";
+    rev = "hypothesis-python-${version}";
+    hash = "sha256-G7OXlYaCPBfdXtmX/f/6i2LRCZZk5yvzhLc6sissuRo=";
+  };
+
+  postUnpack = "sourceRoot=$sourceRoot/hypothesis-python";
+
+  propagatedBuildInputs = [
+    attrs
+    sortedcontainers
+  ] ++ lib.optionals (pythonOlder "3.11") [
+    exceptiongroup
+  ];
+
+  checkInputs = [
+    pexpect
+    pytest-xdist
+    pytestCheckHook
+  ];
+
+  inherit doCheck;
+
+  # This file changes how pytest runs and breaks it
+  preCheck = ''
+    rm tox.ini
+  '';
+
+  pytestFlagsArray = [
+    "tests/cover"
+  ];
+
+  pythonImportsCheck = [
+    "hypothesis"
+  ];
+
+  meta = with lib; {
+    description = "Library for property based testing";
+    homepage = "https://github.com/HypothesisWorks/hypothesis";
+    license = licenses.mpl20;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..4bac9c0bb022
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hypothesmith/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, hypothesis
+, lark
+, libcst
+, parso
+, pytestCheckHook
+, pytest-xdist
+}:
+
+buildPythonPackage rec {
+  pname = "hypothesmith";
+  version = "0.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0fb7b3fd03d76eddd4474b0561e1c2662457593a74cc300fd27e5409cd4d7922";
+  };
+
+  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 ];
+
+  checkInputs = [ parso pytestCheckHook pytest-xdist ];
+
+  pytestFlagsArray = [
+    "-v"
+  ];
+
+  disabledTests = [
+    # https://github.com/Zac-HD/hypothesmith/issues/21
+    "test_source_code_from_libcst_node_type"
+  ];
+
+  pythonImportsCheck = [ "hypothesmith" ];
+
+  meta = with lib; {
+    description = "Hypothesis strategies for generating Python programs, something like CSmith";
+    homepage = "https://github.com/Zac-HD/hypothesmith";
+    license = licenses.mpl20;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..565f350b06b4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hypothesmith/remove-black.patch
@@ -0,0 +1,88 @@
+diff --git a/tests/test_cst.py b/tests/test_cst.py
+index c436183..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.FileMode())
+-@given(
+-    source_code=hypothesmith.from_node(),
+-    mode=st.builds(
+-        black.FileMode,
+-        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 7ea42e9..a77ac39 100644
+--- a/tests/test_syntactic.py
++++ b/tests/test_syntactic.py
+@@ -3,8 +3,6 @@ import ast
+ import io
+ import tokenize
+ 
+-import black
+-import blib2to3
+ import parso
+ import pytest
+ from hypothesis import example, given, reject, strategies as st
+@@ -58,34 +56,6 @@ def test_ast_unparse_from_grammar(source_code):
+     assert ast.dump(first) == ast.dump(second)
+ 
+ 
+-@example("\\", black.FileMode())
+-@example("A#\r#", black.FileMode())
+-@given(
+-    source_code=hypothesmith.from_grammar(),
+-    mode=st.builds(
+-        black.FileMode,
+-        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..de089ba39d2d
--- /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.3.2";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "neurodata";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-DQ5DrQrFBJ3dnGAjD1c/7GCJeR3g+aL2poR4hwOvmPA=";
+  };
+
+  propagatedBuildInputs = [
+    autograd
+    numba
+    numpy
+    scikit-learn
+    scipy
+  ];
+
+  checkInputs = [ 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..201809d4538c
--- /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.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "hylang";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-/YHgJq+C5+yc+44s76OR0WELUm8KHL2xxtJmGDTChCM=";
+  };
+
+  propagatedBuildInputs = [
+    hy
+  ];
+
+  checkInputs = [
+    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..340e3618be1a
--- /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 ];
+
+  checkInputs = [
+    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..3805d501305b
--- /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
+  checkInputs = [ 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/iapws/default.nix b/nixpkgs/pkgs/development/python-modules/iapws/default.nix
new file mode 100644
index 000000000000..76330af43eeb
--- /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.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "781285acaedff49d72c074aa308aabf7ca17f486cca490e5ed3f35526bbe4153";
+  };
+
+  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..5806104d419f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/iaqualink/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-runner
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "iaqualink";
+  version = "0.4.1";
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "flz";
+    repo = "iaqualink-py";
+    rev = "v${version}";
+    sha256 = "0xgxajw38jrc55xh8w8mq0dk82ml77mfs8yn05gcpv8l24y70chq";
+  };
+
+  nativeBuildInputs = [ pytest-runner ];
+
+  propagatedBuildInputs = [ aiohttp ];
+
+  checkInputs = [ pytestCheckHook ];
+
+  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/ibis-framework/default.nix b/nixpkgs/pkgs/development/python-modules/ibis-framework/default.nix
new file mode 100644
index 000000000000..3638ee3d3e48
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ibis-framework/default.nix
@@ -0,0 +1,170 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, pythonOlder
+, pytestCheckHook
+, atpublic
+, click
+, clickhouse-cityhash
+, clickhouse-driver
+, dask
+, datafusion
+, duckdb
+, duckdb-engine
+, filelock
+, geoalchemy2
+, geopandas
+, graphviz-nox
+, lz4
+, multipledispatch
+, numpy
+, packaging
+, pandas
+, parsy
+, poetry-core
+, poetry-dynamic-versioning
+, psycopg2
+, pyarrow
+, pydantic
+, pymysql
+, pyspark
+, pytest-benchmark
+, pytest-randomly
+, pytest-mock
+, pytest-xdist
+, python
+, pytz
+, regex
+, rsync
+, shapely
+, sqlalchemy
+, sqlite
+, tabulate
+, toolz
+}:
+let
+  testBackends = [
+    "dask"
+    "datafusion"
+    "duckdb"
+    "pandas"
+    "sqlite"
+  ];
+
+  ibisTestingData = fetchFromGitHub {
+    owner = "ibis-project";
+    repo = "testing-data";
+    rev = "3c39abfdb4b284140ff481e8f9fbb128b35f157a";
+    sha256 = "sha256-BZWi4kEumZemQeYoAtlUSw922p+R6opSWp/bmX0DjAo=";
+  };
+in
+
+buildPythonPackage rec {
+  pname = "ibis-framework";
+  version = "3.1.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    repo = "ibis";
+    owner = "ibis-project";
+    rev = version;
+    hash = "sha256-/mQWQLiJa1DRZiyiA6F0/lMyn3wSY1IUwJl2S0IFkvs=";
+  };
+
+  patches = [
+    (fetchpatch {
+      name = "xfail-datafusion-0.4.0";
+      url = "https://github.com/ibis-project/ibis/compare/c162abba4df24e0d531bd2e6a3be3109c16b43b9...6219d6caee19b6fd3171983c49cd8d6872e3564b.patch";
+      hash = "sha256-pCYPntj+TwzqCtYWRf6JF5/tJC4crSXHp0aepRocHck=";
+      excludes = ["poetry.lock"];
+    })
+  ];
+
+  nativeBuildInputs = [ poetry-core ];
+
+  propagatedBuildInputs = [
+    atpublic
+    multipledispatch
+    numpy
+    packaging
+    pandas
+    parsy
+    poetry-dynamic-versioning
+    pydantic
+    pytz
+    regex
+    tabulate
+    toolz
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    click
+    filelock
+    pytest-benchmark
+    pytest-mock
+    pytest-randomly
+    pytest-xdist
+    rsync
+  ] ++ lib.concatMap (name: passthru.optional-dependencies.${name}) testBackends;
+
+  preBuild = ''
+    # setup.py exists only for developer convenience and is automatically generated
+    # it gets in the way in nixpkgs so we remove it
+    rm setup.py
+  '';
+
+  pytestFlagsArray = [
+    "--dist=loadgroup"
+    "-m"
+    "'${lib.concatStringsSep " or " testBackends} or core'"
+    # this test fails on nixpkgs datafusion version (0.4.0), but works on
+    # datafusion 0.6.0
+    "-k"
+    "'not datafusion-no_op'"
+  ];
+
+  preCheck = ''
+    set -eo pipefail
+
+    export IBIS_TEST_DATA_DIRECTORY
+    IBIS_TEST_DATA_DIRECTORY="$(mktemp -d)"
+
+    # copy the test data to a directory
+    rsync --chmod=Du+rwx,Fu+rw --archive "${ibisTestingData}/" "$IBIS_TEST_DATA_DIRECTORY"
+  '';
+
+  postCheck = ''
+    rm -r "$IBIS_TEST_DATA_DIRECTORY"
+  '';
+
+  pythonImportsCheck = [
+    "ibis"
+  ] ++ map (backend: "ibis.backends.${backend}") testBackends;
+
+  passthru = {
+    optional-dependencies = {
+      clickhouse = [ clickhouse-cityhash clickhouse-driver lz4 ];
+      dask = [ dask pyarrow ];
+      datafusion = [ datafusion ];
+      duckdb = [ duckdb duckdb-engine sqlalchemy ];
+      geospatial = [ geoalchemy2 geopandas shapely ];
+      mysql = [ pymysql sqlalchemy ];
+      pandas = [ ];
+      postgres = [ psycopg2 sqlalchemy ];
+      pyspark = [ pyarrow pyspark ];
+      sqlite = [ sqlalchemy sqlite ];
+      visualization = [ graphviz-nox ];
+    };
+  };
+
+  meta = with lib; {
+    description = "Productivity-centric Python Big Data Framework";
+    homepage = "https://github.com/ibis-project/ibis";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ costrouc 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..a58fb34080a5
--- /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;
+    sha256 = "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; [ costrouc ];
+  };
+}
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..3e2d61843de2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ibm-cloud-sdk-core/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pyjwt
+, pytestCheckHook
+, python-dateutil
+, pythonOlder
+, requests
+, responses
+, tox
+}:
+
+buildPythonPackage rec {
+  pname = "ibm-cloud-sdk-core";
+  version = "3.16.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-MfWZGWbU0k586EYY0uhHHo2LuhQSmCfgs9Lz50Ds5Hc=";
+  };
+
+  propagatedBuildInputs = [
+    pyjwt
+    python-dateutil
+    requests
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    responses
+    tox
+  ];
+
+  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"
+  ];
+
+  meta = with lib; {
+    description = "Client library for the IBM Cloud services";
+    homepage = "https://github.com/IBM/python-sdk-core";
+    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..375748d75cc6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ibm-watson/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, responses
+, pytestCheckHook
+, python-dotenv
+, pytest-rerunfailures
+, tox
+, requests
+, python-dateutil
+, websocket-client
+, ibm-cloud-sdk-core
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "ibm-watson";
+  version = "6.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "watson-developer-cloud";
+    repo = "python-sdk";
+    rev = "v${version}";
+    sha256 = "sha256-AvWcw1VV47v2yvaqukPSql7rA7wVwrvtCDsvYtPZXKs=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    python-dateutil
+    websocket-client
+    ibm-cloud-sdk-core
+  ];
+
+  checkInputs = [
+    responses
+    pytestCheckHook
+    python-dotenv
+    pytest-rerunfailures
+    tox
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace websocket-client==1.1.0 websocket-client>=1.1.0
+  '';
+
+  pythonImportsCheck = [
+    "ibm_watson"
+  ];
+
+  meta = with lib; {
+    description = "Client library to use the IBM Watson Services";
+    homepage = "https://github.com/watson-developer-cloud/python-sdk";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ globin ];
+  };
+}
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..5ef8864417d4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/icalendar/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools
+, python-dateutil
+, pytz
+}:
+
+buildPythonPackage rec {
+  version = "4.1.0";
+  pname = "icalendar";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-l0i3wC78xD5Y0GFa4JdqxPJl6Q2t7ptPiE3imQXBs5U=";
+  };
+
+  buildInputs = [ setuptools ];
+  propagatedBuildInputs = [ python-dateutil pytz ];
+
+  meta = with lib; {
+    description = "A parser/generator of iCalendar files";
+    homepage = "https://icalendar.readthedocs.org/";
+    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..45dc837665cf
--- /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;
+    sha256 = "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/icmplib/default.nix b/nixpkgs/pkgs/development/python-modules/icmplib/default.nix
new file mode 100644
index 000000000000..aae5785fccfb
--- /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.3";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "ValentinBELYN";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-EQyu7lV8F/U8cZklYYIMk9ut1FTcoBvGc8Ggx6JerDk=";
+  };
+
+  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..05c24ec7c37e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/icnsutil/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, python
+, fetchFromGitHub
+, buildPythonPackage
+}:
+
+buildPythonPackage rec {
+  pname = "icnsutil";
+  version = "1.0.1";
+
+  src = fetchFromGitHub {
+    owner = "relikd";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-TfQvAbP7iCpRQg2G+ejl245NCYo9DpYwMgiwY2BuJnY=";
+  };
+
+  doCheck = true;
+
+  checkPhase = ''
+    ${python.interpreter} tests/test_icnsutil.py
+    ${python.interpreter} tests/test_cli.py
+  '';
+
+  meta = {
+    homepage = "https://github.com/relikd/icnsutil";
+    description = "Create and extract .icns files.";
+    license = lib.licenses.mit;
+    maintainers = [ lib.maintainers.reckenrode ];
+  };
+}
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..7b7d20ce17f0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/icontract/default.nix
@@ -0,0 +1,78 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, asttokens
+, typing-extensions
+, pytestCheckHook
+, yapf
+, docutils
+, pygments
+, dpcontracts
+, tabulate
+, py-cpuinfo
+, typeguard
+, astor
+, numpy
+, asyncstdlib
+}:
+
+buildPythonPackage rec {
+  pname = "icontract";
+  version = "2.6.1";
+  format = "setuptools";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "Parquery";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-QyuegyjVyRLQS0DjBJXpTDNeBM7LigGJ5cztVOO7e3Y=";
+  };
+
+  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
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    yapf
+    docutils
+    pygments
+    dpcontracts
+    tabulate
+    py-cpuinfo
+    typeguard
+    astor
+    numpy
+    asyncstdlib
+  ];
+
+  disabledTestPaths = [
+    # needs an old version of deal to comply with the tests
+    # see https://github.com/Parquery/icontract/issues/244
+    "tests_with_others/test_deal.py"
+    # mypy decorator checks don't pass. For some reaseon mypy
+    # doesn't check the python file provided in the test.
+    "tests/test_mypy_decorators.py"
+  ];
+
+  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/master/CHANGELOG.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ gador ];
+  };
+}
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..c62b738b28bd
--- /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}";
+    sha256 = "sha256-hdtnET7YfSb85+TGwpwzoxOfxPT7VSj9eKSiV6AXUS8=";
+  };
+
+  propagatedBuildInputs = [
+    arrow
+    tatsu
+  ];
+
+  checkInputs = [
+    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/idasen/default.nix b/nixpkgs/pkgs/development/python-modules/idasen/default.nix
new file mode 100644
index 000000000000..ee14b6fc1f1d
--- /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.9.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "newAM";
+    repo = "idasen";
+    rev = "v${version}";
+    hash = "sha256-7Tg+/3BXRmzG39jIC281MKxyJyf9e9/1uOqUji08B3U=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    bleak
+    pyyaml
+    voluptuous
+  ];
+
+  checkInputs = [
+    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..b33d53abd4cc
--- /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.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "pre-commit";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-7Glq1R0GT2rIFdEpvZdzi4yf4t42ryRIeeTbz8znJmg=";
+  };
+
+  checkInputs = [
+    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..dd0112860105
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/idna/default.nix
@@ -0,0 +1,23 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "idna";
+  version = "3.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d";
+  };
+
+  checkInputs = [ 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..319b080c3472
--- /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;
+    sha256 = "sha256-zAy/yqv3ZdRFlYJfuWqZuxLHlxa3O0QzDqOO4rDErtQ=";
+  };
+
+  checkInputs = [
+    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 = [ maintainers.costrouc ];
+  };
+}
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..3d17085a0e31
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ifcopenshell/default.nix
@@ -0,0 +1,60 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, gcc10
+, cmake
+, boost17x
+, icu
+, swig
+, pcre
+, opencascade-occt
+, opencollada
+, libxml2
+}:
+
+buildPythonPackage rec {
+  pname = "ifcopenshell";
+  version = "210410";
+  format = "other";
+
+  src = fetchFromGitHub {
+    owner  = "IfcOpenShell";
+    repo   = "IfcOpenShell";
+    rev    = "blenderbim-${version}";
+    fetchSubmodules = true;
+    sha256 = "1g52asxrqcfj01iqvf03k3bb6rg3v04hh1wc3nmn329a2lwjbxpw";
+  };
+
+  nativeBuildInputs = [ gcc10 cmake ];
+
+  buildInputs = [
+    boost17x
+    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..9898ef4b3d52
--- /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
+, pytorch
+, scikit-learn
+, tqdm
+}:
+
+buildPythonPackage rec {
+  pname = "ignite";
+  version = "0.4.9";
+
+  src = fetchFromGitHub {
+    owner = "pytorch";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-KBEoMV9lwlEra4DiGDLgPb85+HrnK4Qiy3XYDa9hO3s=";
+  };
+
+  checkInputs = [ pytestCheckHook matplotlib mock pytest-xdist torchvision ];
+  propagatedBuildInputs = [ packaging pytorch scikit-learn tqdm ];
+
+  # runs succesfully 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..6afa32d35bfb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/igraph/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, pkg-config
+, igraph
+, texttable
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "igraph";
+  version = "0.9.11";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "igraph";
+    repo = "python-igraph";
+    rev = version;
+    hash = "sha256-tvkV5ve9X+LXx3LOdHIPljQKZc1v6yts0juo4SwDmfY=";
+  };
+
+  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" ];
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest
+  '';
+
+  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/ihatemoney/default.nix b/nixpkgs/pkgs/development/python-modules/ihatemoney/default.nix
new file mode 100644
index 000000000000..d6933c25ac47
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ihatemoney/default.nix
@@ -0,0 +1,129 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, nixosTests
+, fetchPypi
+, alembic
+, aniso8601
+, babel
+, blinker
+, cachetools
+, click
+, dnspython
+, email-validator
+, flask
+, flask-babel
+, flask-cors
+, flask_mail
+, flask_migrate
+, flask-restful
+, flask-talisman
+, flask-wtf
+, debts
+, idna
+, itsdangerous
+, jinja2
+, Mako
+, markupsafe
+, python-dateutil
+, pytz
+, requests
+, sqlalchemy
+, sqlalchemy-utils
+, sqlalchemy-continuum
+, sqlalchemy-i18n
+, werkzeug
+, wtforms
+, psycopg2 # optional, for postgresql support
+, flask-testing
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "ihatemoney";
+  version = "5.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-uQgZBbpqqbZYHpR+GwHWX0c7di2rVvEz0jPRY6+BkkQ=";
+  };
+
+  propagatedBuildInputs = [
+    aniso8601
+    babel
+    blinker
+    cachetools
+    click
+    debts
+    dnspython
+    email-validator
+    flask
+    flask_mail
+    flask_migrate
+    flask-wtf
+    flask-babel
+    flask-cors
+    flask-restful
+    flask-talisman
+    idna
+    itsdangerous
+    jinja2
+    Mako
+    markupsafe
+    psycopg2
+    python-dateutil
+    pytz
+    requests
+    sqlalchemy
+    sqlalchemy-continuum
+    werkzeug
+    wtforms
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "cachetools>=4.1,<5" "cachetools>=4.1" \
+      --replace "SQLAlchemy>=1.3.0,<1.4" "SQLAlchemy>=1.3.0,<1.5" \
+      --replace "WTForms>=2.3.1,<3.1" "WTForms"
+  '';
+
+  checkInputs = [
+    flask-testing
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "ihatemoney"
+  ];
+
+  disabledTests = [
+    # Requires running service
+    "test_notifications"
+    "test_invite"
+    "test_access_other_projects"
+    "test_authentication"
+    "test_manage_bills"
+    "test_member_delete_method"
+    "test_membership"
+    "test_bill_add_remove_add"
+    "test_clear_ip_records"
+    "test_disable_clear_no_new_records"
+    "test_logs_for_common_actions"
+    # Requires DNS resolution
+    "test_invitation_email_failure"
+  ];
+
+  passthru.tests = {
+    inherit (nixosTests.ihatemoney) ihatemoney-postgresql ihatemoney-sqlite;
+  };
+
+  meta = with lib; {
+    description = "Shared budget manager web application";
+    homepage = "https://ihatemoney.org";
+    license = licenses.beerware;
+    maintainers = with maintainers; [ symphorien ];
+  };
+}
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..3211aed644e0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ijson/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildPythonPackage, fetchPypi, yajl, cffi, pytestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "ijson";
+  version = "3.1.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1d1003ae3c6115ec9b587d29dd136860a81a23c7626b682e2b5b12c9fd30e4ea";
+  };
+
+  buildInputs = [ yajl ];
+  propagatedBuildInputs = [ cffi ];
+  checkInputs = [ pytestCheckHook ];
+
+  doCheck = true;
+
+  meta = with lib; {
+    description = "Iterative JSON parser with a standard Python iterator interface";
+    homepage = "https://github.com/ICRAR/ijson";
+    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..5b5c129c2749
--- /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;
+    sha256 = "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-go-nord/default.nix b/nixpkgs/pkgs/development/python-modules/image-go-nord/default.nix
new file mode 100644
index 000000000000..a8fb5df9433d
--- /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.5";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Schrodinger-Hat";
+    repo = "ImageGoNord-pip";
+    rev = "v${version}";
+    sha256 = "sha256-O34COlGsXExJShRd2zvhdescNfYXWLNuGpkjcH3koPU=";
+  };
+
+  propagatedBuildInputs = [ pillow ];
+
+  checkInputs = [ 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/image-match/default.nix b/nixpkgs/pkgs/development/python-modules/image-match/default.nix
new file mode 100644
index 000000000000..a59f7e08b988
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/image-match/default.nix
@@ -0,0 +1,35 @@
+{ lib, buildPythonPackage, fetchFromGitHub, pytest-runner, scikitimage }:
+
+buildPythonPackage {
+  pname = "image-match";
+  version = "1.1.2";
+
+  src = fetchFromGitHub {
+    owner = "ascribe";
+    repo = "image-match";
+    rev = "1c5f3170555540bdf43ff8b8189c4e8c13a8b950";
+    sha256 = "0vlmpidmhkpgdzw2k03x5layhijcrjpmyfd93yv2ls77ihz00ix5";
+  };
+
+  buildInputs = [ pytest-runner ];
+
+  propagatedBuildInputs = [
+    scikitimage
+  ];
+
+  # remove elasticsearch requirement due to version incompatibility
+  postPatch = ''
+    substituteInPlace setup.py --replace "'elasticsearch>=5.0.0,<6.0.0'," ""
+  '';
+
+  # tests cannot work without elasticsearch
+  doCheck = false;
+  pythonImportsCheck = [ "image_match" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/ascribe/image-match";
+    description = "Quickly search over billions of images";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ cmcdragonkai ];
+  };
+}
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..f71127971638
--- /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
+  ];
+
+  checkInputs = [
+    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..ee1df820a401
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/imagecorruptions/default.nix
@@ -0,0 +1,38 @@
+{ buildPythonPackage
+, fetchPypi
+, numpy
+, scikitimage
+, lib
+, opencv3
+}:
+
+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
+    scikitimage
+    opencv3
+  ];
+
+  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/imageio-ffmpeg/default.nix b/nixpkgs/pkgs/development/python-modules/imageio-ffmpeg/default.nix
new file mode 100644
index 000000000000..2fa5f47d5837
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/imageio-ffmpeg/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, isPy3k
+, fetchPypi
+, substituteAll
+, ffmpeg_4
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "imageio-ffmpeg";
+  version = "0.4.7";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-egiDj5fzY+N8pBghuGT9P9yZqx/iQhBAx4619Wqecj4=";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./ffmpeg-path.patch;
+      ffmpeg = "${ffmpeg_4}/bin/ffmpeg";
+    })
+  ];
+
+  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..d193ec199f9b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/imageio-ffmpeg/ffmpeg-path.patch
@@ -0,0 +1,39 @@
+diff --git a/imageio_ffmpeg/_utils.py b/imageio_ffmpeg/_utils.py
+index 1399cfd..c0eb9be 100644
+--- a/imageio_ffmpeg/_utils.py
++++ b/imageio_ffmpeg/_utils.py
+@@ -23,33 +23,7 @@ def get_ffmpeg_exe():
+     if exe:
+         return 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
+-
+-    # Nothing was found
+-    raise RuntimeError(
+-        "No ffmpeg exe could be found. Install ffmpeg on your system, "
+-        "or set the IMAGEIO_FFMPEG_EXE environment variable."
+-    )
++    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..f657f73a7e41
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/imageio/default.nix
@@ -0,0 +1,70 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, isPy27
+, fetchPypi
+, substituteAll
+, imageio-ffmpeg
+, numpy
+, pillow
+, psutil
+, pytestCheckHook
+, tifffile
+, fsspec
+, libGL
+}:
+
+buildPythonPackage rec {
+  pname = "imageio";
+  version = "2.19.3";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    sha256 = "sha256-DJ34DkLy7mi+qSAB5/z2EqoUmRDv4EDrdX9c4yMlCuE=";
+    inherit pname version;
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./libgl-path.patch;
+      libgl = "${libGL.out}/lib/libGL${stdenv.hostPlatform.extensions.sharedLibrary}";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    imageio-ffmpeg
+    numpy
+    pillow
+  ];
+
+  checkInputs = [
+    fsspec
+    psutil
+    pytestCheckHook
+    tifffile
+  ];
+
+  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"
+  ];
+
+  meta = with lib; {
+    description = "Library for reading and writing a wide range of image, video, scientific, and volumetric data formats";
+    homepage = "http://imageio.github.io/";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ ];
+  };
+}
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..0f06d36df4f2
--- /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;
+    sha256 = "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..3b02ac440349
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/imantics/default.nix
@@ -0,0 +1,46 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, lib
+, numpy
+, opencv3
+, sphinx-rtd-theme
+, lxml
+, xmljson
+}:
+
+buildPythonPackage rec {
+  pname = "imantics";
+  version = "0.1.12";
+
+  src = fetchFromGitHub {
+    owner = "jsbroks";
+    repo = "imantics";
+    rev = "76d81036d8f92854d63ad9938dd76c718f8b482e";
+    sha256 = "1zv2gj8cbakhh2fyr2611cbqhfk37a56x973ny9n43y70n26pzm8";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    opencv3
+    sphinx-rtd-theme
+    lxml
+    xmljson
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "'opencv-python>=3'," ""
+  '';
+
+  # failing on NixOS
+  doCheck = false;
+
+  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..95f988a34951
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/imap-tools/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, isPy27
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "imap-tools";
+  version = "0.56.0";
+
+  disabled = isPy27;
+
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "ikvk";
+    repo = "imap_tools";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-g1m44hUtD/x7zEe/ELY6zj2hJikSmZB6S8ZHEHPrvz0=";
+  };
+
+  checkInputs = [
+    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..c1394a7b6b53
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/imapclient/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, six
+, pytestCheckHook
+, mock
+}:
+
+buildPythonPackage rec {
+  pname = "imapclient";
+  version = "2.2.0";
+
+  src = fetchFromGitHub {
+    owner = "mjs";
+    repo = "imapclient";
+    rev = version;
+    sha256 = "sha256-q/8LFKHgrY3pQV7Coz+5pZAw696uABMTEkYoli6C2KA=";
+  };
+
+  propagatedBuildInputs = [ six ];
+
+  checkInputs = [ pytestCheckHook mock ];
+
+  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..c58b698a4a46
--- /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";
+  };
+
+  checkInputs = [
+    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..8a53e856b330
--- /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.9.1";
+  disabled = isPy27; # scikit-learn>=0.21 doesn't work on python2
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-ThT3rmB4tauEO3PDebKsULIHRGQV2cJDjIhdbLWv2WI=";
+  };
+
+  propagatedBuildInputs = [ scikit-learn ];
+  checkInputs = [ 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.nix b/nixpkgs/pkgs/development/python-modules/img2pdf/default.nix
new file mode 100644
index 000000000000..791edcb2fb20
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/img2pdf/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, buildPythonPackage
+, isPy27
+, fetchPypi
+, pikepdf
+, pillow
+, stdenv
+, exiftool
+, ghostscript
+, imagemagick
+, mupdf
+, netpbm
+, numpy
+, poppler_utils
+, pytestCheckHook
+, scipy
+}:
+
+buildPythonPackage rec {
+  pname = "img2pdf";
+  version = "0.4.4";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "8ec898a9646523fd3862b154f3f47cd52609c24cc3e2dc1fb5f0168f0cbe793c";
+  };
+
+  propagatedBuildInputs = [
+    pikepdf
+    pillow
+  ];
+
+  # https://gitlab.mister-muffin.de/josch/img2pdf/issues/128
+  doCheck = !stdenv.isAarch64;
+
+  checkInputs = [
+    exiftool
+    ghostscript
+    imagemagick
+    mupdf
+    netpbm
+    numpy
+    poppler_utils
+    pytestCheckHook
+    scipy
+  ];
+
+  preCheck = ''
+    export img2pdfprog="$out/bin/img2pdf"
+  '';
+
+  disabledTests = [
+    "test_tiff_rgb"
+  ];
+
+  pythonImportsCheck = [ "img2pdf" ];
+
+  meta = with lib; {
+    description = "Convert images to PDF via direct JPEG inclusion";
+    homepage = "https://gitlab.mister-muffin.de/josch/img2pdf";
+    license = licenses.lgpl2;
+    maintainers = with maintainers; [ veprbl dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/imgaug/default.nix b/nixpkgs/pkgs/development/python-modules/imgaug/default.nix
new file mode 100644
index 000000000000..50faf89d600a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/imgaug/default.nix
@@ -0,0 +1,81 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, imageio
+, imagecorruptions
+, numpy
+, opencv3
+, pytestCheckHook
+, scikitimage
+, scipy
+, shapely
+, six
+, lib
+}:
+
+buildPythonPackage rec {
+  pname = "imgaug";
+  version = "0.4.0";
+
+  src = fetchFromGitHub {
+    owner = "aleju";
+    repo = "imgaug";
+    rev = version;
+    sha256 = "17hbxndxphk3bfnq35y805adrfa6gnm5x7grjxbwdw4kqmbbqzah";
+  };
+
+  postPatch = ''
+    substituteInPlace requirements.txt \
+      --replace "opencv-python-headless" ""
+    substituteInPlace setup.py \
+      --replace "opencv-python-headless" ""
+    substituteInPlace pytest.ini \
+      --replace "--xdoctest --xdoctest-global-exec=\"import imgaug as ia\nfrom imgaug import augmenters as iaa\"" ""
+  '';
+
+  propagatedBuildInputs = [
+    imageio
+    imagecorruptions
+    numpy
+    opencv3
+    scikitimage
+    scipy
+    shapely
+    six
+  ];
+
+  checkInputs = [
+    opencv3
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Tests are outdated
+    "test_quokka_segmentation_map"
+    "test_pool"
+    "test_avg_pool"
+    "test_max_pool"
+    "test_min_pool"
+    "est_median_pool"
+    "test_alpha_is_080"
+    "test_face_and_lines_at_half_visibility"
+    "test_polygon_fully_inside_image__no_rectangular_shape"
+    # flaky due to timing-based assertions
+    "test_imap_batches_output_buffer_size"
+    "test_imap_batches_unordered_output_buffer_size"
+  ];
+
+  disabledTestPaths = [
+    # TypeError:  int() argument must be a string, a bytes-like object or a number, not 'NoneType'
+    "test/augmenters/test_pooling.py"
+  ];
+
+  pythonImportsCheck = [ "imgaug" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/aleju/imgaug";
+    description = "Image augmentation for machine learning experiments";
+    license = licenses.mit;
+    maintainers = with maintainers; [ cmcdragonkai rakesh4g ];
+    platforms = platforms.linux;
+  };
+}
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/iminuit/default.nix b/nixpkgs/pkgs/development/python-modules/iminuit/default.nix
new file mode 100644
index 000000000000..246f04618f2d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/iminuit/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, cmake
+, numpy
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "iminuit";
+  version = "2.16.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-ECSlGdvI/VLV/So3ef1IWwm8J8QFVt74tvkWlUIxmdY=";
+  };
+
+  nativeBuildInputs = [
+    cmake
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  dontUseCmakeConfigure = true;
+
+  checkInputs = [
+    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..6979f848055b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/immutabledict/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "immutabledict";
+  version = "2.2.1";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "corenting";
+    repo = "immutabledict";
+    rev = "v${version}";
+    sha256 = "sha256-z04xxoCw0eBtkt++y/1yUsAPaLlAGUtWBdRBM74ul1c=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  pythonImportsCheck = [
+    "immutabledict"
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "A fork of frozendict, an immutable wrapper around dictionaries";
+    homepage = "https://github.com/corenting/immutabledict";
+    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..34a48ed2a1f6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/immutables/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, mypy
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "immutables";
+  version = "0.18";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "MagicStack";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-lXCoPTcpTOv9K0xCVjbrP3qlzP9tfk/e3Rk3oOmbS/Y=";
+  };
+
+  propagatedBuildInputs = lib.optionals (pythonOlder "3.8") [
+    typing-extensions
+  ];
+
+  checkInputs = [
+    mypy
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Version mismatch
+    "testMypyImmu"
+  ];
+
+  pythonImportsCheck = [
+    "immutables"
+  ];
+
+  meta = with lib; {
+    description = "An immutable mapping type";
+    homepage = "https://github.com/MagicStack/immutables";
+    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..cc957ac156aa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/impacket/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, chardet
+, fetchPypi
+, flask
+, ldapdomaindump
+, pyasn1
+, pycryptodomex
+, pyopenssl
+, pythonOlder
+, setuptools
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "impacket";
+  version = "0.10.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-uOsCCiy7RxRmac/jHGS7Ln1kmdBJxJPWQYuXFvXHRYM=";
+  };
+
+  propagatedBuildInputs = [
+    chardet
+    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";
+    # Modified Apache Software License, Version 1.1
+    license = licenses.free;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..03b402c8dc79
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/importlab/default.nix
@@ -0,0 +1,35 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchFromGitHub
+, networkx
+, pytestCheckHook
+}:
+
+buildPythonPackage {
+  pname = "importlab";
+  version = "0.7";
+
+  src = fetchFromGitHub {
+    owner = "google";
+    repo = "importlab";
+    rev = "676d17cd41ac68de6ebb48fb71780ad6110c4ae3";
+    sha256 = "sha256-O8y1c65NQ+19BnGnUnWrA0jYUqF+726CFAcWzHFOiHE=";
+  };
+
+  propagatedBuildInputs = [ networkx ];
+
+  checkInputs = [ pytestCheckHook ];
+
+  disabledTestPaths = [ "tests/test_parsepy.py" ];
+
+  pythonImportsCheck = [ "importlab" ];
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    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..9e4176a5b1ba
--- /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 = "4.12.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "importlib_metadata";
+    inherit version;
+    hash = "sha256-Y3JFuLqytlAvy8dSzEt6b2JDuwKzHFwmFWrRA9PUVnA=";
+  };
+
+  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 ];
+  };
+}
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..2eb41c4c504d
--- /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
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "importlib-resources";
+  version = "5.8.0";
+  format = "pyproject";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    pname = "importlib_resources";
+    inherit version;
+    sha256 = "sha256-VoyfFssgT53syNbSSlcu7qJ9rLtM7p5rA6gCVzZ2l1E=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    importlib-metadata
+  ] ++ lib.optional (pythonOlder "3.5") [
+    typing
+  ];
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest discover
+  '';
+
+  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..8302478684be
--- /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 ];
+
+  checkInputs = [ 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..53294680df9e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/imutils/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, opencv3
+}:
+
+buildPythonPackage rec {
+  version = "0.5.4";
+  pname = "imutils";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "03827a9fca8b5c540305c0844a62591cf35a0caec199cb0f2f0a4a0fb15d8f24";
+  };
+
+  propagatedBuildInputs = [ opencv3 ];
+
+  # 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 = [ maintainers.costrouc ];
+  };
+}
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..6490aea35983
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/in-place/default.nix
@@ -0,0 +1,33 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, lib
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "in-place";
+  version = "0.5.0";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "jwodder";
+    repo = "inplace";
+    rev = "v${version}";
+    sha256 = "1w6q3d0gqz4mxvspd08l1nhsrw6rpzv1gnyj4ckx61b24f84p5gk";
+  };
+
+  postPatch = ''
+    substituteInPlace tox.ini --replace "--cov=in_place --no-cov-on-fail" ""
+  '';
+
+  checkInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "in_place" ];
+
+  meta = with lib; {
+    description = "In-place file processing";
+    homepage = "https://github.com/jwodder/inplace";
+    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..d281ece24635
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/incomfort-client/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "incomfort-client";
+  version = "0.4.5";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "zxdavb";
+    repo = pname;
+    rev = version;
+    sha256 = "0r9f15fcjwhrq6ldji1dzbb76wsvinpkmyyaj7n55rl6ibnsyrwp";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  # Project has no tests
+  doCheck = false;
+  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..55123163dbf5
--- /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 = "21.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "02f5de5aff48f6b9f665d99d48bfc7ec03b6e3943210de7cfc88856d755d6f57";
+  };
+
+  propagatedBuildInputs = [
+    click
+  ];
+
+  # escape infinite recursion with twisted
+  doCheck = false;
+
+  checkInputs = [
+    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; [ SuperSandro2000 ];
+  };
+}; in incremental
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..1fe406e62ed8
--- /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";
+  };
+
+  checkInputs = [
+    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..bb98c5bd679f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/inflect/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, setuptools-scm
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "inflect";
+  version = "5.6.2";
+  disabled = isPy27;
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-qtx+1zko9eAUEpeUu6wDBYzKNdCpc6X8TrRcf6JgBfk=";
+  };
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  checkInputs = [ 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..f6d327d229d8
--- /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";
+  };
+
+  checkInputs = [ 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..8442136e772e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/influxdb-client/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, rx
+, certifi
+, six
+, python-dateutil
+, setuptools
+, urllib3
+, ciso8601
+, pytz
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "influxdb-client";
+  version = "1.30.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "influxdata";
+    repo = "influxdb-client-python";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-YGKFvRy76/klXhJ8Cdgqv9YqCq4E6XIiwWXl8W9fRX4=";
+  };
+
+  propagatedBuildInputs = [
+    rx
+    certifi
+    six
+    python-dateutil
+    setuptools
+    urllib3
+    ciso8601
+    pytz
+  ];
+
+  # requires influxdb server
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "influxdb_client"
+  ];
+
+  meta = with lib; {
+    description = "InfluxDB 2.0 Python client library";
+    homepage = "https://github.com/influxdata/influxdb-client-python";
+    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..ec81f631ac30
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/influxdb/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, buildPythonPackage
+, python-dateutil
+, fetchPypi
+, fetchpatch
+, 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";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    python-dateutil
+    pytz
+    six
+    msgpack
+  ];
+
+  checkInputs = [
+    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"
+    # Reponse is not empty but `s = '孝'` and the JSON decoder chokes on that
+    "test_query_with_empty_result"
+  ];
+
+  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..aff0d77e7022
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/inform/default.nix
@@ -0,0 +1,44 @@
+{ lib, buildPythonPackage, fetchFromGitHub
+, arrow
+, six
+, hypothesis
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "inform";
+  version = "1.26";
+
+  src = fetchFromGitHub {
+    owner = "KenKundert";
+    repo = "inform";
+    rev = "v${version}";
+    sha256 = "0snrmvmc3rnz90cql5ayzs878rrkadk46rhvf2sn78nb0x57wa20";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "pytest-runner>=2.0" ""
+  '';
+
+  propagatedBuildInputs = [ arrow six ];
+
+  checkInputs = [ pytestCheckHook hypothesis ];
+  preCheck = ''
+    patchShebangs test.doctests.py test.inform.py
+    ./test.doctests.py
+    ./test.inform.py
+  '';
+
+  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";
+    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..a8a4a611fee6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/iniconfig/default.nix
@@ -0,0 +1,23 @@
+{ lib, buildPythonPackage, fetchPypi, setuptools-scm }:
+
+buildPythonPackage rec {
+  pname = "iniconfig";
+  version = "1.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32";
+  };
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  doCheck = false; # avoid circular import with pytest
+  pythonImportsCheck = [ "iniconfig" ];
+
+  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/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..f616cf3c2755
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/injector/default.nix
@@ -0,0 +1,23 @@
+{ lib, buildPythonPackage, fetchPypi, typing-extensions }:
+
+buildPythonPackage rec {
+  pname = "injector";
+  version = "0.20.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-hmG0mi+DCc5h46aoK3rLXiJcS96OF9FhDIk6Zw3/Ijo=";
+  };
+
+  propagatedBuildInputs = [ typing-extensions ];
+
+  doCheck = false; # No tests are available
+  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..6fb3ddb8c11a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/inkbird-ble/default.nix
@@ -0,0 +1,57 @@
+{ 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.5";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "Bluetooth-Devices";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-KUBOjeFM4h2Qt9eT0mQKPFYJJ8OWdbYy9+AiHsJWNyU=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    bluetooth-data-tools
+    bluetooth-sensor-state-data
+    home-assistant-bluetooth
+    sensor-state-data
+  ];
+
+  checkInputs = [
+    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";
+    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..3f8bc99eeb6b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/inkex/default.nix
@@ -0,0 +1,47 @@
+{ buildPythonPackage
+, inkscape
+, cssselect
+, lxml
+, numpy
+, pygobject3
+, python
+}:
+
+buildPythonPackage {
+  pname = "inkex";
+  inherit (inkscape) version;
+
+  format = "other";
+
+  propagatedBuildInputs = [
+    cssselect
+    lxml
+    numpy
+    pygobject3
+  ];
+
+  # We just copy the files.
+  dontUnpack = true;
+  dontBuild = true;
+
+  # No tests installed.
+  doCheck = false;
+
+  installPhase = ''
+    runHook preInstall
+
+    mkdir -p "$out/${python.sitePackages}"
+    cp -r "${inkscape}/share/inkscape/extensions/inkex" "$out/${python.sitePackages}"
+
+    runHook postInstall
+  '';
+
+  meta = inkscape.meta // {
+    description = "Inkscape Extensions Library";
+    longDescription = ''
+      This module provides support for inkscape extensions, it includes support for opening svg files and processing them.
+
+      Standalone, it is especially useful for running tests for Inkscape extensions.
+    '';
+  };
+}
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..3590f53e1ecd
--- /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;
+  };
+
+  checkInputs = [
+    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..0fb7a2451210
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/inquirer/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+
+# native
+, poetry-core
+
+# propagated
+, blessed
+, python-editor
+, readchar
+
+# tests
+, pytest-mock
+, pytestCheckHook
+, pexpect
+}:
+
+buildPythonPackage rec {
+  pname = "inquirer";
+  version = "2.9.2";
+  format = "pyproject";
+
+  src = fetchFromGitHub rec {
+    owner = "magmax";
+    repo = "python-inquirer";
+    rev = "v${version}";
+    sha256 = "sha256-TQEZeZDl4N78dE7CXy5OwquUoHuxxjmDAC3wdxqydaQ=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    blessed
+    python-editor
+    readchar
+  ];
+
+  checkInputs = [
+    pexpect
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/magmax/python-inquirer";
+    description = "A collection of common interactive command line user interfaces, based on Inquirer.js";
+    license = licenses.mit;
+    maintainers = [ maintainers.mmahut ];
+  };
+}
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/installer/default.nix b/nixpkgs/pkgs/development/python-modules/installer/default.nix
new file mode 100644
index 000000000000..8749ea16132d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/installer/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, pytestCheckHook
+, flit-core
+, mock
+}:
+
+buildPythonPackage rec {
+  pname = "installer";
+  version = "0.5.1";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "pradyunsg";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-vhZYUhUcD5fnjkyEqFMvggVGH9Ri8iNgqRgSBQTOCtM=";
+  };
+
+  nativeBuildInputs = [ flit-core ];
+
+  checkInputs = [
+    pytestCheckHook
+    mock
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/pradyunsg/installer";
+    description = "A low-level library for installing a Python package from a wheel distribution.";
+    license = licenses.mit;
+    maintainers = with maintainers; [ cpcloud fridh ];
+  };
+}
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..584aa0050ed5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/insteon-frontend-home-assistant/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "insteon-frontend-home-assistant";
+  version = "0.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-AP8yf2eEBT8LWs03hKihCgbBkS9sEUg5NkYdagFiqwA=";
+  };
+
+  # upstream has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "insteon_frontend" ];
+
+  meta = {
+    description = "The Insteon frontend for Home Assistant";
+    homepage = "https://github.com/teharris1/insteon-panel";
+    license = lib.licenses.mit;
+    maintainers = with lib.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..5c5f598a4526
--- /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.2.3";
+
+  src = fetchFromGitHub {
+    owner = "intake";
+    repo = pname;
+    rev = version;
+    sha256 = "037jd3qkk6dybssp570kzvaln2c6pk2avd2b5mll42gaxdxxnp02";
+  };
+
+  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..6f895b45ed03
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/intake/default.nix
@@ -0,0 +1,124 @@
+{ lib
+, appdirs
+, bokeh
+, buildPythonPackage
+, dask
+, entrypoints
+, fetchFromGitHub
+, fsspec
+, hvplot
+, intake-parquet
+, jinja2
+, msgpack
+, msgpack-numpy
+, numpy
+, pandas
+, panel
+, pyarrow
+, pytestCheckHook
+, python-snappy
+, pythonOlder
+, pyyaml
+, requests
+, stdenv
+, tornado
+}:
+
+buildPythonPackage rec {
+  pname = "intake";
+  version = "0.6.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = version;
+    hash = "sha256-ABMXWUVptpOSPB1jQ57iXk/UG92puNCICzXo3ZMG2Pk=";
+  };
+
+  propagatedBuildInputs = [
+    appdirs
+    dask
+    entrypoints
+    fsspec
+    msgpack
+    jinja2
+    pandas
+    pyyaml
+  ];
+
+  checkInputs = [
+    intake-parquet
+    pytestCheckHook
+  ] ++ passthru.optional-dependencies.server;
+
+  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'" ""
+  '';
+
+  preCheck = ''
+    export HOME=$(mktemp -d);
+    export PATH="$PATH:$out/bin";
+  '';
+
+  disabledTests = [
+    # Disable tests which touch network
+    "http"
+    "test_dir"
+    "test_discover"
+    "test_filtered_compressed_cache"
+    "test_flatten_flag"
+    "test_get_dir"
+    "test_pagination"
+    "test_read_part_compressed"
+    "test_read_partition"
+    "test_read_pattern"
+    "test_remote_arr"
+    "test_remote_cat"
+    # ValueError
+    "test_mlist_parameter"
+    # ImportError
+    "test_dataframe"
+    "test_ndarray"
+    "test_python"
+    # Timing-based, flaky on darwin and possibly others
+    "TestServerV1Source.test_idle_timer"
+  ] ++ 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";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ costrouc ];
+  };
+}
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..f6459c13e706
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/intbitset/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "intbitset";
+  version = "3.0.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-8ebQPGcpkioiPFGEnfZbnpFuYlrvuRF4Tn+azUwgfVM=";
+  };
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "intbitset"
+  ];
+
+  meta = with lib; {
+    description = "C-based extension implementing fast integer bit sets";
+    homepage = "https://github.com/inveniosoftware/intbitset";
+    license = licenses.lgpl3Plus;
+    maintainers = teams.determinatesystems.members;
+  };
+}
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..e5b0cc6fbc74
--- /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;
+    sha256 = "sha256-iStzYacZ9JRSN9qMz3VOlRPbMvViiFJ4WuoQjc0lAJM=";
+  };
+
+  checkInputs = [ 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..0ef45a56a6de
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/intellifire4py/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, aenum
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, pydantic
+, pytestCheckHook
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "intellifire4py";
+  version = "2.0.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "jeeftor";
+    repo = pname;
+    rev = version;
+    hash = "sha256-CO6ImL2e6B2yvHAQs3Cc7oaOllB5V9sap4bQS/XRnWI=";
+  };
+
+  propagatedBuildInputs = [
+    aenum
+    aiohttp
+    pydantic
+    requests
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Test file is missing
+    "test_json_files"
+  ];
+
+  pythonImportsCheck = [
+    "intellifire4py"
+  ];
+
+  meta = with lib; {
+    description = "Module to read Intellifire fireplace status data";
+    homepage = "https://github.com/jeeftor/intellifire4py";
+    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..94d6252e3c06
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/intensity-normalization/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, pytestCheckHook
+, matplotlib
+, nibabel
+, numpy
+, scikit-fuzzy
+, scikitimage
+, scikit-learn
+, scipy
+, statsmodels
+}:
+
+buildPythonPackage rec {
+  pname = "intensity-normalization";
+  version = "2.2.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    pname = "intensity_normalization";
+    inherit version;
+    sha256 = "sha256-Yjd4hXmbT87xNKSqc6zkKNisOVhQzQAUZI5wBiI/UBk=";
+  };
+
+  propagatedBuildInputs = [
+    matplotlib
+    nibabel
+    numpy
+    scikit-fuzzy
+    scikitimage
+    scikit-learn
+    scipy
+    statsmodels
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "pytest-runner" ""
+  '';
+
+  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;
+    # depends on simpleitk python wrapper which is not packaged yet
+    broken = true;
+  };
+}
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..2ab3a3a51001
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/internetarchive/default.nix
@@ -0,0 +1,57 @@
+{ buildPythonPackage
+, fetchPypi
+, pytest
+, tqdm
+, docopt
+, requests
+, jsonpatch
+, schema
+, responses
+, lib
+, glibcLocales
+, setuptools
+, urllib3
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "internetarchive";
+  version = "3.0.2";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-3oVkZcLvaFIYTQi/1ZwMoBkEhls3OiezgwNKxrQSjrY=";
+  };
+
+  propagatedBuildInputs = [
+    tqdm
+    docopt
+    requests
+    jsonpatch
+    schema
+    setuptools # needs pkg_resources at runtime
+    urllib3
+  ];
+
+  checkInputs = [ pytest responses glibcLocales ];
+
+  # tests depend on network
+  doCheck = false;
+
+  checkPhase = ''
+    LC_ALL=en_US.utf-8 pytest tests
+  '';
+
+  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/intreehooks/default.nix b/nixpkgs/pkgs/development/python-modules/intreehooks/default.nix
new file mode 100644
index 000000000000..e76a6997cb67
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/intreehooks/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytoml
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "intreehooks";
+  version = "1.0";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "87e600d3b16b97ed219c078681260639e77ef5a17c0e0dbdd5a302f99b4e34e1";
+  };
+
+  propagatedBuildInputs = [ pytoml ];
+
+  checkInputs = [ pytest ];
+
+  meta = {
+    description = "Load a PEP 517 backend from inside the source tree";
+    license = lib.licenses.mit;
+    maintainers = [ lib.maintainers.fridh ];
+    homepage = "https://github.com/takluyver/intreehooks";
+  };
+}
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..fef497739cbf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/invocations/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, blessings
+, fetchFromGitHub
+, invoke
+, releases
+, semantic-version
+, tabulate
+, tqdm
+, twine
+}:
+
+buildPythonPackage rec {
+  pname = "invocations";
+  version = "2.6.0";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "pyinvoke";
+    repo = pname;
+    rev = version;
+    hash = "sha256-eyOJKVRfn7elyEkERl7hvRTNFmq7O9Pr03lBS6xp0wE=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "semantic_version>=2.4,<2.7" "semantic_version" \
+      --replace "tabulate==0.7.5" "tabulate"
+  '';
+
+  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/";
+    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..a2180f5b964a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/invoke/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, bash
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "invoke";
+  version = "1.7.1";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-e23q9YXu4KhIIF0LjAAUub9vKHqOt5iBimQt/x3xSxk=";
+  };
+
+  postPatch = ''
+    sed -e 's|/bin/bash|${bash}/bin/bash|g' -i invoke/config.py
+  '';
+
+  # errors with vendored libs
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "invoke"
+  ];
+
+  meta = with lib; {
+    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..cc56f8d0bdea
--- /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";
+  };
+
+  checkInputs = [
+    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/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..4d90d572876c
--- /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}";
+    sha256 = "sha256-mXOLKXauWwwIA/LnF4qyZsBiF/QM+rF9MmE2ewmozYo=";
+    fetchSubmodules = true;
+  };
+
+  patches = [
+    (fetchpatch {
+      url = "https://github.com/amzn/ion-hash-python/commit/5cab56d694ecc176e394bb455c2d726ba1514ce0.patch";
+      sha256 = "sha256-P5QByNafgxI//e3m+b0oG00+rVymCsT/J4dOZSk3354=";
+    })
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py --replace "'pytest-runner'," ""
+  '';
+
+  propagatedBuildInputs = [ amazon-ion six ];
+
+  checkInputs = [ 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/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/ipdb/default.nix b/nixpkgs/pkgs/development/python-modules/ipdb/default.nix
new file mode 100644
index 000000000000..363c8a4f5768
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ipdb/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, ipython
+, isPyPy
+, mock
+, toml
+}:
+
+buildPythonPackage rec {
+  pname = "ipdb";
+  version = "0.13.9";
+  disabled = isPyPy;  # setupterm: could not find terminfo database
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "951bd9a64731c444fd907a5ce268543020086a697f6be08f7cc2c9a752a278c5";
+  };
+
+  propagatedBuildInputs = [ ipython toml ];
+  checkInputs = [ mock ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/gotcha/ipdb";
+    description = "IPython-enabled pdb";
+    license = licenses.bsd0;
+    maintainers = [ maintainers.costrouc ];
+  };
+
+}
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..9788fd8a5440
--- /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 = [ maintainers.costrouc ];
+  };
+
+}
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..e76f8c8de9e8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ipfshttpclient/default.nix
@@ -0,0 +1,92 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, python
+, py-multiaddr
+, requests
+, pytestCheckHook
+, pytest-cov
+, pytest-dependency
+, pytest-localserver
+, pytest-mock
+, pytest-order
+, pytest-cid
+, mock
+, ipfs
+, httpx
+, httpcore
+}:
+
+buildPythonPackage rec {
+  pname = "ipfshttpclient";
+  version = "0.8.0a2";
+  format = "flit";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "ipfs-shipyard";
+    repo = "py-ipfs-http-client";
+    rev = version;
+    sha256 = "sha256-OmC67pN2BbuGwM43xNDKlsLhwVeUbpvfOazyIDvoMEA=";
+  };
+
+  propagatedBuildInputs = [
+    py-multiaddr
+    requests
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    pytest-cov
+    pytest-dependency
+    pytest-localserver
+    pytest-mock
+    pytest-order
+    pytest-cid
+    mock
+    ipfs
+    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
+  '';
+
+  pythonImportsCheck = [ "ipfshttpclient" ];
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    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..8bbf257ebdcf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ipwhl/default.nix
@@ -0,0 +1,28 @@
+{ lib, buildPythonPackage, pythonOlder, fetchFromSourcehut
+, ipfs, packaging, tomli }:
+
+buildPythonPackage rec {
+  pname = "ipwhl";
+  version = "1.1.0";
+  format = "flit";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromSourcehut {
+    owner = "~cnx";
+    repo = "ipwhl-utils";
+    rev = version;
+    sha256 = "sha256-YaIYcoUnbiv9wUOFIzGj2sWGbh7NsqRQcqOR2X6+QZA=";
+  };
+
+  buildInputs = [ ipfs ];
+  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/ipydatawidgets/default.nix b/nixpkgs/pkgs/development/python-modules/ipydatawidgets/default.nix
new file mode 100644
index 000000000000..6203d9a03ca8
--- /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.1.post1";
+
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-aYGrzNmmupSuf2FuGBqabaPrFUM+VrtfFAQeXBEaJR8=";
+  };
+
+  nativeBuildInputs = [
+    jupyter-packaging
+  ];
+
+  setupPyBuildFlags = [ "--skip-npm" ];
+
+  propagatedBuildInputs = [
+    ipywidgets
+    numpy
+    six
+    traittypes
+  ];
+
+  checkInputs = [ 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..e3f981964b65
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ipykernel/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, callPackage
+, fetchPypi
+, hatchling
+, pythonOlder
+, ipython
+, jupyter-client
+, packaging
+, psutil
+, tornado
+, traitlets
+}:
+
+buildPythonPackage rec {
+  pname = "ipykernel";
+  version = "6.15.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-N6zDJUyqig2vzd3cjchjpgrRtGSHtoruNh2aFb2pgRI=";
+  };
+
+  # debugpy is optional, see https://github.com/ipython/ipykernel/pull/767
+  postPatch = ''
+    sed -i "/debugpy/d" pyproject.toml
+  '';
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    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 = "http://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..9375dbc2bfdc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ipykernel/tests.nix
@@ -0,0 +1,57 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, pythonOlder
+, flaky
+, ipykernel
+, ipyparallel
+, nose
+, pytestCheckHook
+
+}:
+
+buildPythonPackage rec {
+  pname = "ipykernel-tests";
+  inherit (ipykernel) version;
+
+  src = ipykernel.src;
+
+  dontBuild = true;
+  dontInstall = true;
+
+  checkInputs = [
+    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/ipympl/default.nix b/nixpkgs/pkgs/development/python-modules/ipympl/default.nix
new file mode 100644
index 000000000000..d17a4a85c3bc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ipympl/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, ipykernel
+, ipywidgets
+, matplotlib
+}:
+
+buildPythonPackage rec {
+  pname = "ipympl";
+  version = "0.9.1";
+  format = "wheel";
+
+  src = fetchPypi {
+    inherit pname version format;
+    sha256 = "sha256-NQW0ctQSF4/RFeJVdk0efnYy1sgunebWKyVDijU3RoA=";
+  };
+
+
+  propagatedBuildInputs = [ ipykernel ipywidgets matplotlib ];
+
+  # 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/ipyparallel/default.nix b/nixpkgs/pkgs/development/python-modules/ipyparallel/default.nix
new file mode 100644
index 000000000000..b4d5ab074533
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ipyparallel/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nose
+, python-dateutil
+, ipython_genutils
+, decorator
+, pyzmq
+, ipython
+, jupyter-client
+, ipykernel
+, packaging
+, psutil
+, tornado
+, tqdm
+, isPy3k
+, futures ? null
+}:
+
+buildPythonPackage rec {
+  pname = "ipyparallel";
+  version = "8.4.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-Zwu+BXVTgXQuHqARd9xCj/jz6Urx8NVkLJ0Z83yoKJs=";
+  };
+
+  buildInputs = [ nose ];
+
+  propagatedBuildInputs = [ python-dateutil ipython_genutils decorator pyzmq ipython jupyter-client ipykernel packaging psutil tornado tqdm
+  ] ++ lib.optionals (!isPy3k) [ futures ];
+
+  # Requires access to cluster
+  doCheck = false;
+
+  disabled = !isPy3k;
+
+  meta = {
+    description = "Interactive Parallel Computing with IPython";
+    homepage = "http://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..1a86ae238be3
--- /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
+  ];
+
+  checkInputs = [ 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..b6c193d05f05
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ipython/default.nix
@@ -0,0 +1,102 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, pythonOlder
+
+# Build dependencies
+, setuptools
+
+# Runtime dependencies
+, appnope
+, backcall
+, decorator
+, jedi
+, matplotlib-inline
+, pexpect
+, pickleshare
+, prompt-toolkit
+, pygments
+, stack-data
+, traitlets
+
+# Test dependencies
+, pytestCheckHook
+, testpath
+}:
+
+buildPythonPackage rec {
+  pname = "ipython";
+  version = "8.4.0";
+  format = "pyproject";
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f2db3a10254241d9b447232cec8b424847f338d9d36f9a577a6192c332a46abd";
+  };
+
+  patches = [
+    (fetchpatch {
+      # The original URL might not be very stable, so let's prefer a copy.
+      urls = [
+        "https://raw.githubusercontent.com/bmwiedemann/openSUSE/9b35e4405a44aa737dda623a7dabe5384172744c/packages/p/python-ipython/ipython-pr13714-xxlimited.patch"
+        "https://github.com/ipython/ipython/pull/13714.diff"
+      ];
+      sha256 = "XPOcBo3p8mzMnP0iydns9hX8qCQXTmRgRD0TM+FESCI=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    backcall
+    decorator
+    jedi
+    matplotlib-inline
+    pexpect
+    pickleshare
+    prompt-toolkit
+    pygments
+    stack-data
+    traitlets
+  ] ++ lib.optionals stdenv.isDarwin [
+    appnope
+  ];
+
+  pythonImportsCheck = [
+    "IPython"
+  ];
+
+  preCheck = ''
+    export HOME=$TMPDIR
+
+    # doctests try to fetch an image from the internet
+    substituteInPlace pytest.ini \
+      --replace "--ipdoctest-modules" "--ipdoctest-modules --ignore=IPython/core/display.py"
+  '';
+
+  checkInputs = [
+    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";
+    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/ipython_genutils/default.nix b/nixpkgs/pkgs/development/python-modules/ipython_genutils/default.nix
new file mode 100644
index 000000000000..51cf6986349c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ipython_genutils/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nose
+, glibcLocales
+}:
+
+buildPythonPackage rec {
+  pname = "ipython_genutils";
+  version = "0.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "eb2e116e75ecef9d4d228fdc66af54269afa26ab4463042e33785b887c628ba8";
+  };
+
+  checkInputs = [ nose glibcLocales ];
+
+  checkPhase = ''
+    LC_ALL="en_US.UTF-8" nosetests -v ipython_genutils/tests
+  '';
+
+  meta = {
+    description = "Vestigial utilities from IPython";
+    homepage = "http://ipython.org/";
+    license = lib.licenses.bsd3;
+    maintainers = with lib.maintainers; [ 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..6c0b15c41b37
--- /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.7.0";
+
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "fa8ff9b9a73b5a925c4af4c05f1839df2bd0fae0063871f403ee821792d5ab72";
+  };
+
+  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/ipyvuetify";
+    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..567c033e243f
--- /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.2";
+
+  # GitHub version tries to run npm (Node JS)
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-uFjS7lv8kDRultRqqu2++1eieLs67dLolVurTXWls8A=";
+  };
+
+  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..62737e74785a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ipywidgets/default.nix
@@ -0,0 +1,40 @@
+{ buildPythonPackage
+, fetchPypi
+, ipykernel
+, ipython
+, jupyterlab-widgets
+, lib
+, nbformat
+, pytestCheckHook
+, traitlets
+, widgetsnbextension
+}:
+
+buildPythonPackage rec {
+  pname = "ipywidgets";
+  version = "7.7.1";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Xy+ht6+uGvMsiAiMmCitl43pPd2jk9ftQU5VP+6T3Ks=";
+  };
+
+  propagatedBuildInputs = [
+    ipython
+    ipykernel
+    jupyterlab-widgets
+    traitlets
+    nbformat
+    widgetsnbextension
+  ];
+
+  checkInputs = [ pytestCheckHook ];
+
+  meta = {
+    description = "IPython HTML widgets for Jupyter";
+    homepage = "http://ipython.org/";
+    license = lib.licenses.bsd3;
+    maintainers = with lib.maintainers; [ fridh ];
+  };
+}
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..88e7efbc230e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/irc/default.nix
@@ -0,0 +1,41 @@
+{ lib, buildPythonPackage, fetchPypi, isPy3k
+, six, jaraco_logging, jaraco_text, jaraco_stream, pytz, jaraco_itertools
+, setuptools-scm, jaraco_collections, importlib-metadata
+}:
+
+buildPythonPackage rec {
+  pname = "irc";
+  version = "20.1.0";
+  format = "pyproject";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-tvc3ky3UeR87GOMZ3nt9rwLSKFpr6iY9EB9NjlU4B+w=";
+  };
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  propagatedBuildInputs = [
+    six
+    importlib-metadata
+    jaraco_logging
+    jaraco_text
+    jaraco_stream
+    pytz
+    jaraco_itertools
+    jaraco_collections
+  ];
+
+  doCheck = false;
+
+  pythonImportsCheck = [ "irc" ];
+
+  meta = with lib; {
+    description = "IRC (Internet Relay Chat) protocol library for Python";
+    homepage = "https://github.com/jaraco/irc";
+    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..e16ac2449a7d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ircrobots/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, anyio
+, asyncio-rlock
+, asyncio-throttle
+, dataclasses
+, ircstates
+, async_stagger
+, async-timeout
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "ircrobots";
+  version = "0.4.6";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "jesopo";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-+BrS1+ZkgwT/qvqD0PwRZi2LF+31biS738SzKH1dy7w=";
+  };
+
+  postPatch = ''
+    # too specific pins https://github.com/jesopo/ircrobots/issues/3
+    sed -iE 's/anyio.*/anyio/' requirements.txt
+    sed -iE 's/ircstates.*/ircstates/' requirements.txt
+    sed -iE 's/async_timeout.*/async_timeout/' requirements.txt
+  '';
+
+  propagatedBuildInputs = [
+    anyio
+    asyncio-rlock
+    asyncio-throttle
+    ircstates
+    async_stagger
+    async-timeout
+  ] ++ lib.optionals (pythonOlder "3.7") [
+    dataclasses
+  ];
+
+  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..49ddb8c0614e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ircstates/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, irctokens
+, pendulum
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "ircstates";
+  version = "0.11.8";
+  disabled = pythonOlder "3.6";  # f-strings
+
+  src = fetchFromGitHub {
+    owner = "jesopo";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0scxqcgby4vzh2q937r0wy2mb46aghjf47q3z6fp6di1b6hlj7zh";
+  };
+
+  propagatedBuildInputs = [
+    irctokens
+    pendulum
+  ];
+
+  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..3cd86abb0b2e
--- /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.1";
+  disabled = pythonOlder "3.6";  # f-strings
+
+  src = fetchFromGitHub {
+    owner = "jesopo";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-FgcLngS11U9eBNV/8jllwdrm89tCmthA1sUaFDovk6U=";
+  };
+
+  checkInputs = [ 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..50e171feb6a2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/isbnlib/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nose
+, coverage
+}:
+
+buildPythonPackage rec {
+  pname = "isbnlib";
+  version = "3.10.10";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c9e6c1dcaa9dff195429373cf2beb3117f30b3fca43d7db5aec5a2d1f6f59784";
+  };
+
+  checkInputs = [
+    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";
+    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..aa084783fa8f
--- /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 = "2022.2.1";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "07062ljvznm2dg3r9b3lq98qygxsha8ylxi4zs7hx49l0jw2vbjy";
+  };
+
+  postConfigure = ''
+    substituteInPlace setup.py \
+      --replace "\"pytest>=2\"," ""
+  '';
+
+  buildInputs = [ isl pybind11 ];
+  propagatedBuildInputs = [ six ];
+
+  preCheck = "mv islpy islpy.hidden";
+  checkInputs = [ 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 = [ maintainers.costrouc ];
+  };
+}
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..943036ecbd46
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ismartgate/default.nix
@@ -0,0 +1,70 @@
+{ lib
+, asynctest
+, buildPythonPackage
+, click
+, defusedxml
+, dicttoxml
+, fetchFromGitHub
+, httpx
+, pycryptodome
+, pytest-asyncio
+, pytest-raises
+, pytestCheckHook
+, pythonOlder
+, respx
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "ismartgate";
+  version = "4.0.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "bdraco";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-yh7gPyy3VMdyINBCZo5K2wA0BY7yYgHrKGZRB/pm77U=";
+  };
+
+  propagatedBuildInputs = [
+    click
+    defusedxml
+    dicttoxml
+    httpx
+    pycryptodome
+    typing-extensions
+  ];
+
+  checkInputs = [
+    asynctest
+    pytest-asyncio
+    pytest-raises
+    pytestCheckHook
+    respx
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace '"pytest-runner>=5.2",' ""
+  '';
+
+  pythonImportsCheck = [
+    "ismartgate"
+  ];
+
+  disabledTestPaths = [
+    # Tests are out-dated
+    "ismartgate/tests/test_init.py"
+  ];
+
+
+  meta = with lib; {
+    description = "Python module to work with the ismartgate and gogogate2 API";
+    homepage = "https://github.com/bdraco/ismartgate";
+    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..2820ff7dd6c1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/iso3166/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "iso3166";
+  version = "2.0.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "deactivated";
+    repo = "python-iso3166";
+    rev = version;
+    sha256 = "sha256-/y7c2qSA6+WKUP9YTSaMBjBxtqAuF4nB3MKvL5P6vL0=";
+  };
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "iso3166"
+  ];
+
+  meta = with lib; {
+    description = "Self-contained ISO 3166-1 country definitions";
+    homepage = "https://github.com/deactivated/python-iso3166";
+    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..5832b6e4a773
--- /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
+  ];
+
+  checkInputs = [
+    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..14cef7c62a8c
--- /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 = "1.0.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-J/UDIg5oRdnblU+yErlbA2LYt+bBsjJqhwYcPek1lLE=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  checkInputs = [
+    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..21bcc3ed90a3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/isodate/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "isodate";
+  version = "0.6.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "SMWIHefosKDWSMsCTIBi3ITnuEDtgehkx2FP08Envek=";
+  };
+
+  propagatedBuildInputs = [ six ];
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest discover -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..16bb9b13bf83
--- /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;
+    sha256 = "sha256-6LqsH+3V/K0s2YD1gvmelo+cCH+yCAmmyTYGhUegVdk=";
+  };
+
+  propagatedBuildInputs = [
+    arrow
+  ];
+
+  checkInputs = [
+    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..d21f79b6ba9b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/isort/default.nix
@@ -0,0 +1,79 @@
+{ lib, buildPythonPackage, fetchFromGitHub
+, colorama
+, hypothesis
+, poetry-core
+, pylama
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "isort";
+  version = "5.10.1";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "PyCQA";
+    repo = "isort";
+    rev = version;
+    sha256 = "09spgl2k9xrprr5gbpfc91a8p7mx7a0c64ydgc91b3jhrmnd9jg1";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  checkInputs = [
+    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 ];
+  };
+}
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..388b7be391e0
--- /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;
+    sha256 = "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; [ SuperSandro2000 ];
+  };
+}
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..ade063a625ae
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/itanium_demangler/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "itanium-demangler";
+  version = "1.0"; # pulled from pypi version
+
+  src = fetchFromGitHub {
+    owner = "whitequark";
+    repo = "python-itanium_demangler";
+    rev = "29c77860be48e6dafe3496e4d9d0963ce414e366";
+    hash = "sha256-3fXwHO8JZgE0QSWScMKgRKDX5380cYPSMNMKUgwtqWI=";
+  };
+
+  checkInputs = [
+    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; [ 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..ba8396d16272
--- /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.7.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-MsBh7Jq0fVND6AEbJocw9I/2MqAZK5UpLRGLGNvXaHo=";
+  };
+
+  # 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..f9afc4c5cb36
--- /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.1";
+
+  # PyPI tarball doesn't include tests directory
+  src = fetchFromGitHub {
+    owner = "almarklein";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0ksad5j91nlbsn0a11clf994qz7r9ijand5hxnjhgd66i9hl3y78";
+  };
+
+  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..e6098208033a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/itemloaders/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, w3lib
+, parsel
+, jmespath
+, itemadapter
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "itemloaders";
+  version = "1.0.4";
+  disabled = pythonOlder "3.6";
+
+  # Tests not included in PyPI tarball
+  src = fetchFromGitHub {
+    owner = "scrapy";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0j68xgx2z63sc1nc9clw6744036vfbijdsghvjv6pk674d5lgyam";
+  };
+
+  propagatedBuildInputs = [ w3lib parsel jmespath itemadapter ];
+
+  checkInputs = [ 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";
+    license = licenses.bsd3;
+    maintainers = [ maintainers.marsam ];
+  };
+}
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..96c8fcfb3c14
--- /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.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-rKvnr0C48mTkjbGyHhvNzgJ97p5mJ7F4wU8ZMPYV/rM=";
+  };
+
+  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..99bdb965235c
--- /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;
+    sha256 = "sha256-XbvGizF+XkLzJ/kCF2NUXcP8O/4i5t65aq8fw4h0FWo=";
+  };
+
+  checkInputs = [
+    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..36581bf2db50
--- /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";
+  };
+
+  checkInputs = [ 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/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..17f044dbd914
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jaconv/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, nose
+, pythonOlder
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "jaconv";
+  version = "0.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "ikegami-yukino";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "rityHi1JWWlV7+sAxNrlbcmfHmORZWrMZqXTRlsclhQ=";
+  };
+
+  checkInputs = [
+    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";
+    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/janus/default.nix b/nixpkgs/pkgs/development/python-modules/janus/default.nix
new file mode 100644
index 000000000000..f4c52db722cd
--- /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
+  ];
+
+  checkInputs = [ 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-context/default.nix b/nixpkgs/pkgs/development/python-modules/jaraco-context/default.nix
new file mode 100644
index 000000000000..4b097fd5b096
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jaraco-context/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "jaraco-context";
+  version = "4.1.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "jaraco";
+    repo = "jaraco.context";
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-gfrDZW4d3X/QjUBN8DFSvKRLZge3pnZ6KkI7S7Nz3W0=";
+  };
+
+  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";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..3f3f9d54f87f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jaraco-test/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, setuptools
+, setuptools-scm
+, toml
+, jaraco_functools
+, jaraco-context
+, more-itertools
+, jaraco_collections
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "jaraco-test";
+  version = "5.1.0";
+
+  disabled = pythonOlder "3.7";
+
+  format = "pyproject";
+
+  src = fetchPypi {
+    pname = "jaraco.test";
+    inherit version;
+    sha256 = "04a7503c0c78cd057bd6b5f16ad1e3379b911b619df6694480a564ebc214c0a8";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    toml
+    jaraco_functools
+    jaraco-context
+    more-itertools
+    jaraco_collections
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "jaraco.test" ];
+
+  meta = {
+    description = "Testing support by jaraco";
+    homepage = "https://github.com/jaraco/jaraco.test";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ 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..aadb9f9028f1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jaraco_classes/default.nix
@@ -0,0 +1,34 @@
+{ lib, buildPythonPackage, fetchFromGitHub, isPy27
+, setuptools-scm
+, more-itertools
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "jaraco.classes";
+  version = "3.1.1";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "jaraco";
+    repo = "jaraco.classes";
+    rev = "v${version}";
+    sha256 = "0wzrcsxi9gb65inayg0drm08iaw37jm1lqxhz3860i6pwjh503pr";
+  };
+
+  pythonNamespaces = [ "jaraco" ];
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  propagatedBuildInputs = [ more-itertools ];
+
+  checkInputs = [ 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..686095d3b1c0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jaraco_collections/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools-scm
+, jaraco_classes
+, jaraco_text
+}:
+
+buildPythonPackage rec {
+  pname = "jaraco.collections";
+  version = "3.5.2";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-ByuT6zX55IUISFdVU05mo07xzISvKR/Sfzm0TUwN0sM=";
+  };
+
+  postPatch = ''
+    # break dependency cycle
+    sed -i "/'jaraco.text',/d" setup.cfg
+  '';
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  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";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
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..de4b8c5ce489
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jaraco_functools/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, more-itertools
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "jaraco.functools";
+  version = "3.5.1";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-0K3PkXEKCFPv6fI6ePrVhr9n31cvDW2OD6NtKJrhwdk=";
+  };
+
+  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..95d20fd7e6be
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jaraco_itertools/default.nix
@@ -0,0 +1,35 @@
+{ lib, buildPythonPackage, fetchPypi, setuptools-scm
+, inflect, more-itertools, six, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "jaraco.itertools";
+  version = "6.2.1";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-YJjts3xrgCPzeU1CWIoTv3WyygK0D/l5XIRry+DBtGw=";
+  };
+
+  pythonNamespaces = [ "jaraco" ];
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  propagatedBuildInputs = [ inflect more-itertools six ];
+  checkInputs = [ 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..d8ff10d95b62
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jaraco_logging/default.nix
@@ -0,0 +1,29 @@
+{ lib, buildPythonPackage, fetchPypi, setuptools-scm
+, tempora, six
+}:
+
+buildPythonPackage rec {
+  pname = "jaraco.logging";
+  version = "3.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "150dc8701207b28bc65a16f0e91c07250a8d1b9da324ce674c0e375774944f13";
+  };
+
+  pythonNamespaces = [ "jaraco" ];
+
+  nativeBuildInputs = [ setuptools-scm ];
+  propagatedBuildInputs = [ tempora six ];
+
+  # 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";
+    license = licenses.mit;
+  };
+}
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..48a5085f7928
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jaraco_stream/default.nix
@@ -0,0 +1,17 @@
+{ buildPythonPackage, fetchPypi, setuptools-scm, six }:
+
+buildPythonPackage rec {
+  pname = "jaraco.stream";
+  version = "3.0.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3af4b0441090ee65bd6dde930d29f93f50c4a2fe6048e2a9d288285f5e4dc441";
+  };
+
+  pythonNamespaces = [ "jaraco" ];
+
+  doCheck = false;
+  buildInputs = [ setuptools-scm ];
+  propagatedBuildInputs = [ six ];
+}
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..2bdf376ffe23
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jaraco_text/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, importlib-resources
+, jaraco_functools
+, jaraco-context
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "jaraco.text";
+  version = "3.8.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-RQlXw/j7mlU9nT5gc4czqxxcwns2pGM0KtuTfppwqz4=";
+  };
+
+  pythonNamespaces = [
+    "jaraco"
+  ];
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    jaraco-context
+    jaraco_functools
+  ] ++ lib.optional (pythonOlder "3.9") [
+    importlib-resources
+  ];
+
+  # no tests in pypi package
+  doCheck = false;
+
+  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..a8e194f1ddd7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jarowinkler/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, cmake
+, ninja
+, cython
+, rapidfuzz-capi
+, scikit-build
+, setuptools
+, jarowinkler-cpp
+, hypothesis
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "jarowinkler";
+  version = "1.2.1";
+
+  disabled = pythonOlder "3.6";
+
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "maxbachmann";
+    repo = "JaroWinkler";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-h9sR8j5avUhY+qpzKZ54O67uTjkk2JuOvMBVaohvbUk=";
+  };
+
+  nativeBuildInputs = [
+    cmake
+    cython
+    ninja
+    rapidfuzz-capi
+    scikit-build
+    setuptools
+  ];
+
+  buildInputs = [
+    jarowinkler-cpp
+  ];
+
+  preBuild = ''
+    export JAROWINKLER_BUILD_EXTENSION=1
+  '';
+
+  dontUseCmakeConfigure = true;
+
+  checkInputs = [
+    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..e3eee7d72e9b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/javaproperties/default.nix
@@ -0,0 +1,33 @@
+{ lib, buildPythonPackage, fetchFromGitHub
+, six
+, pytest
+, python-dateutil
+}:
+
+buildPythonPackage rec {
+  version = "0.8.1";
+  pname = "javaproperties";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "jwodder";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "16rcdw5gd4a21v2xb1j166lc9z2dqcv68gqvk5mvpnm0x6nwadgp";
+  };
+
+  propagatedBuildInputs = [ six ];
+
+  checkInputs = [ python-dateutil pytest ];
+  checkPhase = ''
+    rm tox.ini
+    pytest -k 'not dumps and not time' --ignore=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/cache-fix.patch b/nixpkgs/pkgs/development/python-modules/jax/cache-fix.patch
new file mode 100644
index 000000000000..5db5319485f8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jax/cache-fix.patch
@@ -0,0 +1,12 @@
+diff --git a/jax/experimental/compilation_cache/file_system_cache.py b/jax/experimental/compilation_cache/file_system_cache.py
+index b85969de..92acd523 100644
+--- a/jax/experimental/compilation_cache/file_system_cache.py
++++ b/jax/experimental/compilation_cache/file_system_cache.py
+@@ -33,6 +33,7 @@ class FileSystemCache(CacheInterface):
+     path_to_key = os.path.join(self._path, key)
+     if os.path.exists(path_to_key):
+       with open(path_to_key, "rb") as file:
++        os.utime(file.fileno())
+         return file.read()
+     else:
+       return None
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..a302341c3141
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jax/default.nix
@@ -0,0 +1,113 @@
+{ lib
+, absl-py
+, blas
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, jaxlib
+, lapack
+, numpy
+, opt-einsum
+, pytestCheckHook
+, pytest-xdist
+, pythonOlder
+, scipy
+, typing-extensions
+}:
+
+let
+  usingMKL = blas.implementation == "mkl" || lapack.implementation == "mkl";
+in
+buildPythonPackage rec {
+  pname = "jax";
+  version = "0.3.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "google";
+    repo = pname;
+    rev = "jax-v${version}";
+    hash = "sha256-eGdAEZFHadNTHgciP4KMYHdwksz9g6un0Ar+A/KV5TE=";
+  };
+
+  patches = [
+    # See https://github.com/google/jax/issues/7944
+    ./cache-fix.patch
+
+    # See https://github.com/google/jax/issues/10292
+    (fetchpatch {
+      url = "https://github.com/google/jax/commit/cadc8046d56e0c1433cf48a2f106947d5f4ecbfd.patch";
+      hash = "sha256-jrpIqt4LzWAswt/Cpwtfa5d1Yn31HcXkVH3ETmaigA0=";
+    })
+  ];
+
+  # 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. Currently only the
+  # CPU wheel is packaged.
+  propagatedBuildInputs = [
+    absl-py
+    numpy
+    opt-einsum
+    scipy
+    typing-extensions
+  ];
+
+  checkInputs = [
+    jaxlib
+    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"
+  ] ++ 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"
+  ];
+
+  # See https://github.com/google/jax/issues/11722. This is a temporary fix in
+  # order to unblock etils, and upgrading jax/jaxlib to the latest version. See
+  # https://github.com/NixOS/nixpkgs/issues/183173#issuecomment-1204074993.
+  disabledTestPaths = [
+    "tests/api_test.py"
+    "tests/core_test.py"
+    "tests/lax_numpy_indexing_test.py"
+    "tests/lax_numpy_test.py"
+    "tests/nn_test.py"
+    "tests/random_test.py"
+    "tests/sparse_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..a041edbd2cc6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jaxlib/bin.nix
@@ -0,0 +1,147 @@
+# 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.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
+, cudnn ? cudaPackages.cudnn
+, fetchurl
+, flatbuffers
+, isPy39
+, lib
+, python
+, scipy
+, stdenv
+  # Options:
+, cudaSupport ? config.cudaSupport or false
+, cudaPackages ? {}
+}:
+
+let
+  inherit (cudaPackages) cudatoolkit cudnn;
+in
+
+# There are no jaxlib wheels targeting cudnn <8.0.5, and although there are
+# wheels for cudatoolkit <11.1, we don't support them.
+assert cudaSupport -> lib.versionAtLeast cudatoolkit.version "11.1";
+assert cudaSupport -> lib.versionAtLeast cudnn.version "8.0.5";
+
+let
+  version = "0.3.0";
+
+  pythonVersion = python.pythonVersion;
+
+  # Find new releases at https://storage.googleapis.com/jax-releases. When
+  # upgrading, you can get these hashes from prefetch.sh.
+  cpuSrcs = {
+    "3.9" = fetchurl {
+      url = "https://storage.googleapis.com/jax-releases/nocuda/jaxlib-${version}-cp39-none-manylinux2010_x86_64.whl";
+      hash = "sha256-AfBVqoqChEXlEC5PgbtQ5rQzcbwo558fjqCjSPEmN5Q=";
+    };
+    "3.10" = fetchurl {
+      url = "https://storage.googleapis.com/jax-releases/nocuda/jaxlib-${version}-cp310-none-manylinux2010_x86_64.whl";
+      hash = "sha256-9uBkFOO8LlRpO6AP+S8XK9/d2yRdyHxQGlbAjShqHRQ=";
+    };
+  };
+
+  gpuSrcs = {
+    "3.9-805" = fetchurl {
+      url = "https://storage.googleapis.com/jax-releases/cuda11/jaxlib-${version}+cuda11.cudnn805-cp39-none-manylinux2010_x86_64.whl";
+      hash = "sha256-CArIhzM5FrQi3TkdqpUqCeDQYyDMVXlzKFgjNXjLJXw=";
+    };
+    "3.9-82" = fetchurl {
+      url = "https://storage.googleapis.com/jax-releases/cuda11/jaxlib-${version}+cuda11.cudnn82-cp39-none-manylinux2010_x86_64.whl";
+      hash = "sha256-Q0plVnA9pUNQ+gCHSXiLNs4i24xCg8gBGfgfYe3bot4=";
+    };
+    "3.10-805" = fetchurl {
+      url = "https://storage.googleapis.com/jax-releases/cuda11/jaxlib-${version}+cuda11.cudnn805-cp310-none-manylinux2010_x86_64.whl";
+      hash = "sha256-JopevCEAs0hgDngIId6NqbLam5YfcS8Lr9cEffBKp1U=";
+    };
+    "3.10-82" = fetchurl {
+      url = "https://storage.googleapis.com/jax-releases/cuda11/jaxlib-${version}+cuda11.cudnn82-cp310-none-manylinux2010_x86_64.whl";
+      hash = "sha256-2f5TwbdP7EfQNRM3ZcJXCAkS2VXBwNYH6gwT9pdu3Go=";
+    };
+  };
+in
+buildPythonPackage rec {
+  pname = "jaxlib";
+  inherit version;
+  format = "wheel";
+
+  # At the time of writing (2022-03-03), there are releases for <=3.10.
+  # Supporting all of them is a pain, so we focus on 3.9, the current nixpkgs
+  # python3 version, and 3.10.
+  disabled = !(pythonVersion == "3.9" || pythonVersion == "3.10");
+
+  src =
+    if !cudaSupport then cpuSrcs."${pythonVersion}" else
+    let
+      # jaxlib wheels are currently provided for cudnn versions at least 8.0.5 and
+      # 8.2. Try to use 8.2 whenever possible.
+      cudnnVersion = if (lib.versionAtLeast cudnn.version "8.2") then "82" else "805";
+    in
+    gpuSrcs."${pythonVersion}-${cudnnVersion}";
+
+  # Prebuilt wheels are dynamically linked against things that nix can't find.
+  # Run `autoPatchelfHook` to automagically fix them.
+  nativeBuildInputs = [ autoPatchelfHook ] ++ lib.optional cudaSupport addOpenGLRunpath;
+  # Dynamic link dependencies
+  buildInputs = [ stdenv.cc.cc ];
+
+  # 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 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
+  '';
+
+  pythonImportsCheck = [ "jaxlib" ];
+
+  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 = [ "x86_64-linux" ];
+  };
+}
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..54b4c36dc5a2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jaxlib/default.nix
@@ -0,0 +1,326 @@
+{ lib
+, pkgs
+, stdenv
+
+  # Build-time dependencies:
+, addOpenGLRunpath
+, bazel_5
+, binutils
+, buildBazelPackage
+, buildPythonPackage
+, cctools
+, cython
+, fetchFromGitHub
+, git
+, IOKit
+, jsoncpp
+, pybind11
+, setuptools
+, symlinkJoin
+, wheel
+, which
+
+  # Python dependencies:
+, absl-py
+, flatbuffers
+, numpy
+, scipy
+, six
+
+  # Runtime dependencies:
+, double-conversion
+, giflib
+, grpc
+, libjpeg_turbo
+, python
+, snappy
+, zlib
+
+  # CUDA flags:
+, cudaCapabilities ? [ "sm_35" "sm_50" "sm_60" "sm_70" "sm_75" "compute_80" ]
+, cudaSupport ? false
+, cudaPackages ? {}
+
+  # MKL:
+, mklSupport ? true
+}:
+
+let
+
+  inherit (cudaPackages) cudatoolkit cudnn nccl;
+
+  pname = "jaxlib";
+  version = "0.3.0";
+
+  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.isAarch64;
+  };
+
+  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 = [
+      cudatoolkit.cc
+      binutils.bintools # for ar, dwp, nm, objcopy, objdump, strip
+    ];
+  };
+
+  bazel-build = buildBazelPackage {
+    name = "bazel-build-${pname}-${version}";
+
+    bazel = bazel_5;
+
+    src = fetchFromGitHub {
+      owner = "google";
+      repo = "jax";
+      rev = "${pname}-v${version}";
+      sha256 = "0ndpngx5k6lf6jqjck82bbp0gs943z0wh7vs9gwbyk2bw0da7w72";
+    };
+
+    nativeBuildInputs = [
+      cython
+      pkgs.flatbuffers
+      git
+      setuptools
+      wheel
+      which
+    ];
+
+    buildInputs = [
+      double-conversion
+      giflib
+      grpc
+      jsoncpp
+      libjpeg_turbo
+      numpy
+      pkgs.flatbuffers
+      pkgs.protobuf
+      pybind11
+      scipy
+      six
+      snappy
+      zlib
+    ] ++ lib.optionals cudaSupport [
+      cudatoolkit
+      cudnn
+    ] ++ lib.optionals stdenv.isDarwin [
+      IOKit
+    ];
+
+    postPatch = ''
+      rm -f .bazelversion
+    '';
+
+    bazelTarget = "//build:build_wheel";
+
+    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";
+
+    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
+    '' + 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="${lib.concatStringsSep "," cudaCapabilities}"
+    '' + ''
+      CFG
+    '';
+
+    # 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 = lib.concatStringsSep "," [
+      "absl_py"
+      "astor_archive"
+      "astunparse_archive"
+      "boringssl"
+      # 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"
+      "enum34_archive"
+      "flatbuffers"
+      "functools32_archive"
+      "gast_archive"
+      "gif"
+      "hwloc"
+      "icu"
+      "jsoncpp_git"
+      "libjpeg_turbo"
+      "lmdb"
+      "nasm"
+      # "nsync" # not packaged in nixpkgs
+      "opt_einsum_archive"
+      "org_sqlite"
+      "pasta"
+      "pcre"
+      "png"
+      "pybind11"
+      "six_archive"
+      "snappy"
+      "tblib_archive"
+      "termcolor_archive"
+      "typing_extensions_archive"
+      "wrapt"
+      "zlib"
+    ];
+
+    # Make sure Bazel knows about our configuration flags during fetching so that the
+    # relevant dependencies can be downloaded.
+    bazelFlags = [
+      "-c opt"
+    ] ++ lib.optional (stdenv.targetPlatform.isx86_64 && stdenv.targetPlatform.isUnix) [
+      "--config=avx_posix"
+    ] ++ lib.optional cudaSupport [
+      "--config=cuda"
+    ] ++ lib.optional mklSupport [
+      "--config=mkl_open_source_only"
+    ] ++ 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++"
+    ];
+
+    fetchAttrs = {
+      sha256 =
+        if cudaSupport then
+          "sha256-Ald+vplRx/DDG/7TfHAqD4Gktb1BGnf7FSCCJzSI0eo="
+        else
+          "sha256-eK5IjTAncDarkWYKnXrEo7kw7J7iOH7in2L2GabnFYo=";
+    };
+
+    buildAttrs = {
+      outputs = [ "out" ];
+
+      # Note: we cannot do most of this patching at `patch` phase as the deps are not available yet.
+      # 1) Fix pybind11 include paths.
+      # 2) 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.
+      # 3) Patch python path in the compiler driver.
+      # 4) Patch tensorflow sources to work with later versions of protobuf. See
+      #    https://github.com/google/jax/issues/9534. Note that this should be
+      #    removed on the next release after 0.3.0.
+      preBuild = ''
+        for src in ./jaxlib/*.{cc,h}; do
+          sed -i 's@include/pybind11@pybind11@g' $src
+        done
+        substituteInPlace ../output/external/org_tensorflow/tensorflow/compiler/xla/python/pprof_profile_builder.cc \
+          --replace "status.message()" "std::string{status.message()}"
+        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"
+      '' + lib.optionalString cudaSupport ''
+        patchShebangs ../output/external/org_tensorflow/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"
+      '' + (if stdenv.cc.isGNU then ''
+        sed -i 's@-lprotobuf@-l:libprotobuf.a@' ../output/external/org_tensorflow/third_party/systemlibs/protobuf.BUILD
+        sed -i 's@-lprotoc@-l:libprotoc.a@' ../output/external/org_tensorflow/third_party/systemlibs/protobuf.BUILD
+      '' else if stdenv.cc.isClang then ''
+        sed -i 's@-lprotobuf@${pkgs.protobuf}/lib/libprotobuf.a@' ../output/external/org_tensorflow/third_party/systemlibs/protobuf.BUILD
+        sed -i 's@-lprotoc@${pkgs.protobuf}/lib/libprotoc.a@' ../output/external/org_tensorflow/third_party/systemlibs/protobuf.BUILD
+      '' else throw "Unsupported stdenv.cc: ${stdenv.cc}");
+
+      installPhase = ''
+        ./bazel-bin/build/build_wheel --output_path=$out --cpu=${stdenv.targetPlatform.linuxArch}
+      '';
+    };
+
+    inherit meta;
+  };
+  platformTag =
+    if stdenv.targetPlatform.isLinux then
+      "manylinux2010_${stdenv.targetPlatform.linuxArch}"
+    else if stdenv.system == "x86_64-darwin" then
+      "macosx_10_9_${stdenv.targetPlatform.linuxArch}"
+    else if stdenv.system == "aarch64-darwin" then
+      "macosx_11_0_${stdenv.targetPlatform.linuxArch}"
+    else throw "Unsupported target platform: ${stdenv.targetPlatform}";
+
+in
+buildPythonPackage {
+  inherit meta pname version;
+  format = "wheel";
+
+  src = "${bazel-build}/jaxlib-${version}-cp${builtins.replaceStrings ["."] [""] python.pythonVersion}-none-${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
+    double-conversion
+    flatbuffers
+    giflib
+    grpc
+    jsoncpp
+    libjpeg_turbo
+    numpy
+    scipy
+    six
+    snappy
+  ];
+
+  pythonImportsCheck = [ "jaxlib" ];
+
+  # 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..31db6530639f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jaxlib/prefetch.sh
@@ -0,0 +1,7 @@
+version="$1"
+nix hash to-sri --type sha256 "$(nix-prefetch-url https://storage.googleapis.com/jax-releases/nocuda/jaxlib-${version}-cp39-none-manylinux2010_x86_64.whl)"
+nix hash to-sri --type sha256 "$(nix-prefetch-url https://storage.googleapis.com/jax-releases/nocuda/jaxlib-${version}-cp310-none-manylinux2010_x86_64.whl)"
+nix hash to-sri --type sha256 "$(nix-prefetch-url https://storage.googleapis.com/jax-releases/cuda11/jaxlib-${version}+cuda11.cudnn805-cp39-none-manylinux2010_x86_64.whl)"
+nix hash to-sri --type sha256 "$(nix-prefetch-url https://storage.googleapis.com/jax-releases/cuda11/jaxlib-${version}+cuda11.cudnn82-cp39-none-manylinux2010_x86_64.whl)"
+nix hash to-sri --type sha256 "$(nix-prefetch-url https://storage.googleapis.com/jax-releases/cuda11/jaxlib-${version}+cuda11.cudnn805-cp310-none-manylinux2010_x86_64.whl)"
+nix hash to-sri --type sha256 "$(nix-prefetch-url https://storage.googleapis.com/jax-releases/cuda11/jaxlib-${version}+cuda11.cudnn82-cp310-none-manylinux2010_x86_64.whl)"
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..91a3d0be9a44
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jc/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, ruamel-yaml
+, xmltodict
+, pygments
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "jc";
+  version = "1.20.4";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "kellyjonbrazil";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-fiRd433bb0neUeyBtS3KbnYoJJzbGvKrZ29dofGYp0s=";
+  };
+
+  propagatedBuildInputs = [ ruamel-yaml xmltodict pygments ];
+
+  checkInputs = [ 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 ];
+  };
+}
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..463d3ce5e033
--- /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.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-SmeoLuV+NbX2+ff75qDtpj9Wzh3Yr0CbTComozQEV9s=";
+  };
+
+  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..c2dd66ac6634
--- /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";
+  };
+
+  checkInputs = [ 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..138390983e05
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jedi-language-server/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchFromGitHub
+, poetry
+, docstring-to-markdown
+, jedi
+, pygls
+, pytestCheckHook
+, pyhamcrest
+, python-jsonrpc-server
+}:
+
+buildPythonPackage rec {
+  pname = "jedi-language-server";
+  version = "0.36.1";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "pappasam";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-gwaFveFzdkiMvvmdyLLQ/9JthrM6n/+y1XkDQnYp8Y8=";
+  };
+
+  nativeBuildInputs = [
+    poetry
+  ];
+
+  propagatedBuildInputs = [
+    docstring-to-markdown
+    jedi
+    pygls
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    pyhamcrest
+    python-jsonrpc-server
+  ];
+
+  preCheck = ''
+    HOME="$(mktemp -d)"
+  '';
+
+  pythonImportsCheck = [
+    "jedi_language_server"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/pappasam/jedi-language-server";
+    description = "A Language Server for the latest version(s) of Jedi";
+    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..f271920706fa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jedi/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, django
+, pytestCheckHook
+, parso
+}:
+
+buildPythonPackage rec {
+  pname = "jedi";
+  version = "0.18.1";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "davidhalter";
+    repo = "jedi";
+    rev = "v${version}";
+    sha256 = "sha256-wWNPNi16WtefvB7GcQBnWMbHVlVzxSFs4TKRqEasuR0=";
+    fetchSubmodules = true;
+  };
+
+  propagatedBuildInputs = [ parso ];
+
+  checkInputs = [
+    django
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    export HOME=$TMPDIR
+  '';
+
+  disabledTests = [
+    # Assertions mismatches with pytest>=6.0
+    "test_completion"
+
+    # 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; {
+    homepage = "https://github.com/davidhalter/jedi";
+    description = "An autocompletion tool for Python that can be used for text editors";
+    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..6ec1fb811cf0
--- /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
+  ];
+
+  checkInputs = [
+    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/jellyfin-apiclient-python/default.nix b/nixpkgs/pkgs/development/python-modules/jellyfin-apiclient-python/default.nix
new file mode 100644
index 000000000000..08eed6e941e7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jellyfin-apiclient-python/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, certifi
+, requests
+, six
+, websocket-client
+}:
+
+buildPythonPackage rec {
+  pname = "jellyfin-apiclient-python";
+  version = "1.8.1";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "t2XmZ7rsrZq943lzRDrqzsY/djFNjFbkEYeHeA2AViI=";
+  };
+
+  propagatedBuildInputs = [
+    certifi
+    requests
+    six
+    websocket-client
+  ];
+
+  doCheck = false; # no tests
+  pythonImportsCheck = [ "jellyfin_apiclient_python" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/jellyfin/jellyfin-apiclient-python";
+    description = "Python API client for Jellyfin";
+    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..a275b97310d9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jellyfish/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, pytest
+, unicodecsv
+}:
+
+buildPythonPackage rec {
+  pname = "jellyfish";
+  version = "0.9.0";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "40c9a2ffd8bd3016f7611d424120442f627f56d518a106847dc93f0ead6ad79a";
+  };
+
+  checkInputs = [ 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..49b7dd44c603
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jenkins-job-builder/default.nix
@@ -0,0 +1,38 @@
+{ lib, buildPythonPackage, fetchPypi, fasteners
+, jinja2
+, pbr
+, python-jenkins
+, pyyaml
+, six
+, stevedore
+}:
+
+buildPythonPackage rec {
+  pname = "jenkins-job-builder";
+  version = "4.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-5jCltdomD4u5LZrYJFUHB/sLORXYuWoeJOalAci0+XQ=";
+  };
+
+  postPatch = ''
+    # relax version constraint, https://storyboard.openstack.org/#!/story/2009723
+    substituteInPlace requirements.txt --replace 'PyYAML>=3.10.0,<6' 'PyYAML>=3.10.0'
+
+    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..39ad443f1891
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jenkinsapi/default.nix
@@ -0,0 +1,44 @@
+{ lib, stdenv
+, buildPythonPackage
+, pythonAtLeast
+, fetchPypi
+, mock
+, pytest
+, pytest-mock
+, pytz
+, requests
+, requests-kerberos
+, toml
+}:
+
+buildPythonPackage rec {
+  pname = "jenkinsapi";
+  version = "0.3.11";
+  format = "setuptools";
+
+  disabled = pythonAtLeast "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a212a244b0a6022a61657746c8120ac9b6db83432371b345154075eb8faceb61";
+  };
+
+  propagatedBuildInputs = [ pytz requests ];
+  checkInputs = [ mock pytest pytest-mock requests-kerberos toml ];
+  # TODO requests-kerberos is broken on darwin, weeding out the broken tests without
+  # access to macOS is not an adventure I am ready to embark on - @rski
+  doCheck = !stdenv.isDarwin;
+  # don't run tests that try to spin up jenkins, and a few more that are mysteriously broken
+  checkPhase = ''
+    py.test jenkinsapi_tests \
+      -k "not systests and not test_plugins and not test_view"
+  '';
+
+  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 ];
+    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..8b7146ebef93
--- /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";
+  };
+
+  checkInputs = [ 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-git/default.nix b/nixpkgs/pkgs/development/python-modules/jinja2-git/default.nix
new file mode 100644
index 000000000000..59b34f6a4fb3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jinja2-git/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, jinja2
+, poetry-core
+}:
+
+buildPythonPackage rec {
+  pname = "jinja2-git";
+  version = "unstable-2021-07-20";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "wemake-services";
+    repo = "jinja2-git";
+    # this is master, we can't patch because of poetry.lock :(
+    # luckily, there appear to have been zero API changes since then, only
+    # dependency upgrades
+    rev = "c6d19b207eb6ac07182dc8fea35251d286c82512";
+    sha256 = "0yw0318w57ksn8azmdyk3zmyzfhw0k281fddnxyf4115bx3aph0g";
+  };
+
+  nativeBuildInputs = [ poetry-core ];
+  propagatedBuildInputs = [ jinja2 ];
+  pythonImportsCheck = [ "jinja2_git" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/wemake-services/jinja2-git";
+    description = "Jinja2 extension to handle git-specific things";
+    license = licenses.mit;
+    maintainers = with maintainers; [ cpcloud ];
+  };
+}
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..ee478fa152d1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jinja2/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, babel
+, markupsafe
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "Jinja2";
+  version = "3.1.2";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-MTUacCpAip51laj8YVD8P0O7a/fjGXcMvA2535Q36FI=";
+  };
+
+  propagatedBuildInputs = [
+    babel
+    markupsafe
+  ];
+
+  # Multiple tests run out of stack space on 32bit systems with python2.
+  # See https://github.com/pallets/jinja/issues/1158
+  doCheck = !stdenv.is32bit;
+
+  checkInputs = [
+    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_pluralize/default.nix b/nixpkgs/pkgs/development/python-modules/jinja2_pluralize/default.nix
new file mode 100644
index 000000000000..db196403822a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jinja2_pluralize/default.nix
@@ -0,0 +1,23 @@
+{ lib, buildPythonPackage, fetchPypi, jinja2, inflect }:
+
+buildPythonPackage rec {
+  pname = "jinja2_pluralize";
+  version = "0.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "071wnzzz20wjb0iw7grxgj1lb2f0kz50qyfbcq54rddr2x82sp6z";
+  };
+
+  propagatedBuildInputs = [
+    jinja2
+    inflect
+  ];
+
+  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..4268413fd3f5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jinja2_time/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, arrow
+, jinja2
+}:
+
+buildPythonPackage rec {
+  version = "0.2.0";
+  pname = "jinja2-time";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0h0dr7cfpjnjj8bgl2vk9063a53649pn37wnlkd8hxjy656slkni";
+  };
+
+  propagatedBuildInputs = [ arrow jinja2 ];
+
+  meta = with lib; {
+    homepage = "https://github.com/hackebrot/jinja2-time";
+    description = "Jinja2 Extension for Dates and Times";
+    license = licenses.mit;
+  };
+
+}
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..b867bf81b485
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jira/default.nix
@@ -0,0 +1,68 @@
+{ 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.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "pycontribs";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-KRfyXWSnWmkt/SYmrpxG60KytEooMWNhHg8TrvFeATc=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+    setuptools-scm-git-archive
+  ];
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  propagatedBuildInputs = [
+    defusedxml
+    keyring
+    requests-oauthlib
+    requests-toolbelt
+  ];
+
+  checkInputs = [
+    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";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ globin ];
+  };
+}
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..ca365b79b32d
--- /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;
+    sha256 = "sha256-kCYbIG1t79WP3V6F9Hi/YzopAXmJBr4q04kVDFxg7b4=";
+  };
+
+  checkInputs = [
+    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..09c41a7ededd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jmp/default.nix
@@ -0,0 +1,42 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, jax
+, jaxlib
+, lib
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "jmp";
+  # As of 2022-01-01, the latest stable version (0.0.2) fails tests with recent JAX versions,
+  # IIUC it's fixed in https://github.com/deepmind/jmp/commit/4969392f618d7733b265677143d8c81e44085867
+  version = "unstable-2021-10-03";
+
+  src = fetchFromGitHub {
+    owner = "deepmind";
+    repo = pname;
+    rev = "4b94370b8de29b79d6f840b09d1990b91c1afddd";
+    sha256 = "0hh4cmp93wjyidj48gh07vhx2kjvpwd23xvy79bsjn5qaaf6q4cm";
+  };
+
+  # Wheel requires only `numpy`, but the import needs `jax`.
+  propagatedBuildInputs = [
+    jax
+  ];
+
+  pythonImportsCheck = [
+    "jmp"
+  ];
+
+  checkInputs = [
+    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..ad7db290d67e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/joblib/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, pythonAtLeast
+, pythonOlder
+, buildPythonPackage
+, fetchPypi
+, stdenv
+, numpydoc
+, pytestCheckHook
+, lz4
+, setuptools
+, sphinx
+}:
+
+
+buildPythonPackage rec {
+  pname = "joblib";
+  version = "1.1.0";
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "4158fcecd13733f8be669be0683b96ebdbbd38d23559f54dca7205aea1bf1e35";
+  };
+
+  checkInputs = [ sphinx numpydoc pytestCheckHook ];
+  propagatedBuildInputs = [ lz4 setuptools ];
+
+  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; {
+    description = "Lightweight pipelining: using Python functions as pipeline jobs";
+    homepage = "https://joblib.readthedocs.io/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ costrouc ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/johnnycanencrypt/Cargo.lock.patch b/nixpkgs/pkgs/development/python-modules/johnnycanencrypt/Cargo.lock.patch
new file mode 100644
index 000000000000..b70f9304c728
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/johnnycanencrypt/Cargo.lock.patch
@@ -0,0 +1,1194 @@
+diff --git a/Cargo.lock b/Cargo.lock
+new file mode 100644
+index 0000000..84c37bc
+--- /dev/null
++++ b/Cargo.lock
+@@ -0,0 +1,1188 @@
++# This file is automatically @generated by Cargo.
++# It is not intended for manual editing.
++[[package]]
++name = "addr2line"
++version = "0.14.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "a55f82cfe485775d02112886f4169bde0c5894d75e79ead7eafe7e40a25e45f7"
++dependencies = [
++ "gimli",
++]
++
++[[package]]
++name = "adler"
++version = "0.2.3"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "ee2a4ec343196209d6594e19543ae87a39f96d5534d7174822a3ad825dd6ed7e"
++
++[[package]]
++name = "aead"
++version = "0.3.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "7fc95d1bdb8e6666b2b217308eeeb09f2d6728d104be3e31916cc74d15420331"
++dependencies = [
++ "generic-array",
++]
++
++[[package]]
++name = "aho-corasick"
++version = "0.7.15"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "7404febffaa47dac81aa44dba71523c9d069b1bdc50a77db41195149e17f68e5"
++dependencies = [
++ "memchr",
++]
++
++[[package]]
++name = "anyhow"
++version = "1.0.37"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "ee67c11feeac938fae061b232e38e0b6d94f97a9df10e6271319325ac4c56a86"
++
++[[package]]
++name = "arrayref"
++version = "0.3.6"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544"
++
++[[package]]
++name = "arrayvec"
++version = "0.5.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b"
++
++[[package]]
++name = "ascii-canvas"
++version = "2.0.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "ff8eb72df928aafb99fe5d37b383f2fe25bd2a765e3e5f7c365916b6f2463a29"
++dependencies = [
++ "term",
++]
++
++[[package]]
++name = "atty"
++version = "0.2.14"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8"
++dependencies = [
++ "hermit-abi",
++ "libc",
++ "winapi",
++]
++
++[[package]]
++name = "autocfg"
++version = "1.0.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a"
++
++[[package]]
++name = "backtrace"
++version = "0.3.55"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "ef5140344c85b01f9bbb4d4b7288a8aa4b3287ccef913a14bcc78a1063623598"
++dependencies = [
++ "addr2line",
++ "cfg-if 1.0.0",
++ "libc",
++ "miniz_oxide",
++ "object",
++ "rustc-demangle",
++]
++
++[[package]]
++name = "base64"
++version = "0.13.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd"
++
++[[package]]
++name = "bindgen"
++version = "0.51.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "ebd71393f1ec0509b553aa012b9b58e81dadbdff7130bd3b8cba576e69b32f75"
++dependencies = [
++ "bitflags",
++ "cexpr",
++ "cfg-if 0.1.10",
++ "clang-sys",
++ "lazy_static",
++ "peeking_take_while",
++ "proc-macro2",
++ "quote",
++ "regex",
++ "rustc-hash",
++ "shlex",
++]
++
++[[package]]
++name = "bit-set"
++version = "0.5.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "6e11e16035ea35e4e5997b393eacbf6f63983188f7a2ad25bfb13465f5ad59de"
++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.2.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693"
++
++[[package]]
++name = "blake2b_simd"
++version = "0.5.11"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "afa748e348ad3be8263be728124b24a24f268266f6f5d58af9d75f6a40b5c587"
++dependencies = [
++ "arrayref",
++ "arrayvec",
++ "constant_time_eq",
++]
++
++[[package]]
++name = "buffered-reader"
++version = "1.0.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "f5711ccfa79a8167779ad2176d3334078f03b1579ddf8f42aa556196eba60a42"
++dependencies = [
++ "bzip2",
++ "flate2",
++ "libc",
++]
++
++[[package]]
++name = "byteorder"
++version = "1.3.4"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de"
++
++[[package]]
++name = "bzip2"
++version = "0.4.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "275d84fe348b838dc49477d39770682839b3e73e21a3eadc07b12924f1a9fcbe"
++dependencies = [
++ "bzip2-sys",
++ "libc",
++]
++
++[[package]]
++name = "bzip2-sys"
++version = "0.1.9+1.0.8"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "ad3b39a260062fca31f7b0b12f207e8f2590a67d32ec7d59c20484b07ea7285e"
++dependencies = [
++ "cc",
++ "libc",
++ "pkg-config",
++]
++
++[[package]]
++name = "cc"
++version = "1.0.66"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "4c0496836a84f8d0495758516b8621a622beb77c0fed418570e50764093ced48"
++
++[[package]]
++name = "cexpr"
++version = "0.3.6"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "fce5b5fb86b0c57c20c834c1b412fd09c77c8a59b9473f86272709e78874cd1d"
++dependencies = [
++ "nom",
++]
++
++[[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.19"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73"
++dependencies = [
++ "libc",
++ "num-integer",
++ "num-traits",
++ "time",
++ "winapi",
++]
++
++[[package]]
++name = "cipher"
++version = "0.2.5"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "12f8e7987cbd042a63249497f41aed09f8e65add917ea6566effbc56578d6801"
++dependencies = [
++ "generic-array",
++]
++
++[[package]]
++name = "clang-sys"
++version = "0.28.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "81de550971c976f176130da4b2978d3b524eaa0fd9ac31f3ceb5ae1231fb4853"
++dependencies = [
++ "glob",
++ "libc",
++ "libloading",
++]
++
++[[package]]
++name = "cmac"
++version = "0.5.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "73d4de4f7724e5fe70addfb2bd37c2abd2f95084a429d7773b0b9645499b4272"
++dependencies = [
++ "crypto-mac",
++ "dbl",
++]
++
++[[package]]
++name = "constant_time_eq"
++version = "0.1.5"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc"
++
++[[package]]
++name = "crc32fast"
++version = "1.2.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a"
++dependencies = [
++ "cfg-if 1.0.0",
++]
++
++[[package]]
++name = "crossbeam-utils"
++version = "0.8.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "02d96d1e189ef58269ebe5b97953da3274d83a93af647c2ddd6f9dab28cedb8d"
++dependencies = [
++ "autocfg",
++ "cfg-if 1.0.0",
++ "lazy_static",
++]
++
++[[package]]
++name = "crunchy"
++version = "0.2.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7"
++
++[[package]]
++name = "crypto-mac"
++version = "0.10.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "4857fd85a0c34b3c3297875b747c1e02e06b6a0ea32dd892d8192b9ce0813ea6"
++dependencies = [
++ "cipher",
++ "generic-array",
++ "subtle",
++]
++
++[[package]]
++name = "ctor"
++version = "0.1.17"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "373c88d9506e2e9230f6107701b7d8425f4cb3f6df108ec3042a26e936666da5"
++dependencies = [
++ "quote",
++ "syn",
++]
++
++[[package]]
++name = "ctr"
++version = "0.6.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "fb4a30d54f7443bf3d6191dcd486aca19e67cb3c49fa7a06a319966346707e7f"
++dependencies = [
++ "cipher",
++]
++
++[[package]]
++name = "dbl"
++version = "0.3.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "2735145c3b9ba15f2d7a3ae8cdafcbc8c98a7bef7f62afe9d08bd99fbf7130de"
++dependencies = [
++ "generic-array",
++]
++
++[[package]]
++name = "diff"
++version = "0.1.12"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "0e25ea47919b1560c4e3b7fe0aaab9becf5b84a10325ddf7db0f0ba5e1026499"
++
++[[package]]
++name = "digest"
++version = "0.9.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066"
++dependencies = [
++ "generic-array",
++]
++
++[[package]]
++name = "dirs"
++version = "1.0.5"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "3fd78930633bd1c6e35c4b42b1df7b0cbc6bc191146e512bb3bedf243fcc3901"
++dependencies = [
++ "libc",
++ "redox_users",
++ "winapi",
++]
++
++[[package]]
++name = "dyn-clone"
++version = "1.0.4"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "ee2626afccd7561a06cf1367e2950c4718ea04565e20fb5029b6c7d8ad09abcf"
++
++[[package]]
++name = "eax"
++version = "0.3.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "e1f76e7a5e594b299a0fa9a99de627530725e341df41376aa342aecb2c5eb76e"
++dependencies = [
++ "aead",
++ "cipher",
++ "cmac",
++ "ctr",
++ "subtle",
++]
++
++[[package]]
++name = "either"
++version = "1.6.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457"
++
++[[package]]
++name = "ena"
++version = "0.14.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "d7402b94a93c24e742487327a7cd839dc9d36fec9de9fb25b09f2dae459f36c3"
++dependencies = [
++ "log",
++]
++
++[[package]]
++name = "fixedbitset"
++version = "0.2.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "37ab347416e802de484e4d03c7316c48f1ecb56574dfd4a46a80f173ce1de04d"
++
++[[package]]
++name = "flate2"
++version = "1.0.19"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "7411863d55df97a419aa64cb4d2f167103ea9d767e2c54a1868b7ac3f6b47129"
++dependencies = [
++ "cfg-if 1.0.0",
++ "crc32fast",
++ "libc",
++ "miniz_oxide",
++]
++
++[[package]]
++name = "generic-array"
++version = "0.14.4"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "501466ecc8a30d1d3b7fc9229b122b2ce8ed6e9d9223f1138d4babb253e51817"
++dependencies = [
++ "typenum",
++ "version_check 0.9.2",
++]
++
++[[package]]
++name = "getrandom"
++version = "0.1.16"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce"
++dependencies = [
++ "cfg-if 1.0.0",
++ "libc",
++ "wasi 0.9.0+wasi-snapshot-preview1",
++]
++
++[[package]]
++name = "ghost"
++version = "0.1.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "1a5bcf1bbeab73aa4cf2fde60a846858dc036163c7c33bec309f8d17de785479"
++dependencies = [
++ "proc-macro2",
++ "quote",
++ "syn",
++]
++
++[[package]]
++name = "gimli"
++version = "0.23.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "f6503fe142514ca4799d4c26297c4248239fe8838d827db6bd6065c6ed29a6ce"
++
++[[package]]
++name = "glob"
++version = "0.3.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574"
++
++[[package]]
++name = "hashbrown"
++version = "0.9.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "d7afe4a420e3fe79967a00898cc1f4db7c8a49a9333a29f8a4bd76a253d5cd04"
++
++[[package]]
++name = "hermit-abi"
++version = "0.1.17"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "5aca5565f760fb5b220e499d72710ed156fdb74e631659e99377d9ebfbd13ae8"
++dependencies = [
++ "libc",
++]
++
++[[package]]
++name = "idna"
++version = "0.2.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "02e2673c30ee86b5b96a9cb52ad15718aa1f966f5ab9ad54a8b95d5ca33120a9"
++dependencies = [
++ "matches",
++ "unicode-bidi",
++ "unicode-normalization",
++]
++
++[[package]]
++name = "indexmap"
++version = "1.6.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "4fb1fa934250de4de8aef298d81c729a7d33d8c239daa3a7575e6b92bfc7313b"
++dependencies = [
++ "autocfg",
++ "hashbrown",
++]
++
++[[package]]
++name = "indoc"
++version = "1.0.3"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "e5a75aeaaef0ce18b58056d306c27b07436fbb34b8816c53094b76dd81803136"
++dependencies = [
++ "unindent",
++]
++
++[[package]]
++name = "instant"
++version = "0.1.9"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "61124eeebbd69b8190558df225adf7e4caafce0d743919e5d6b19652314ec5ec"
++dependencies = [
++ "cfg-if 1.0.0",
++]
++
++[[package]]
++name = "inventory"
++version = "0.1.10"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "0f0f7efb804ec95e33db9ad49e4252f049e37e8b0a4652e3cd61f7999f2eff7f"
++dependencies = [
++ "ctor",
++ "ghost",
++ "inventory-impl",
++]
++
++[[package]]
++name = "inventory-impl"
++version = "0.1.10"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "75c094e94816723ab936484666968f5b58060492e880f3c8d00489a1e244fa51"
++dependencies = [
++ "proc-macro2",
++ "quote",
++ "syn",
++]
++
++[[package]]
++name = "itertools"
++version = "0.9.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "284f18f85651fe11e8a991b2adb42cb078325c996ed026d994719efcfca1d54b"
++dependencies = [
++ "either",
++]
++
++[[package]]
++name = "johnnycanencrypt"
++version = "0.5.0"
++dependencies = [
++ "anyhow",
++ "chrono",
++ "pyo3",
++ "sequoia-openpgp",
++ "talktosc",
++]
++
++[[package]]
++name = "lalrpop"
++version = "0.19.3"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "5c64e04d8ea9c95c2135dfc4298088eafaf956bc90ba372eb1bea4f715634587"
++dependencies = [
++ "ascii-canvas",
++ "atty",
++ "bit-set",
++ "diff",
++ "ena",
++ "itertools",
++ "lalrpop-util",
++ "petgraph",
++ "pico-args",
++ "regex",
++ "regex-syntax",
++ "string_cache",
++ "term",
++ "tiny-keccak",
++ "unicode-xid",
++]
++
++[[package]]
++name = "lalrpop-util"
++version = "0.19.3"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "f9de203e2fa3e883364fcc778a1293ab4d936f6cff400433013c20105df178c5"
++dependencies = [
++ "regex",
++]
++
++[[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.81"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "1482821306169ec4d07f6aca392a4681f66c75c9918aa49641a2595db64053cb"
++
++[[package]]
++name = "libloading"
++version = "0.5.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "f2b111a074963af1d37a139918ac6d49ad1d0d5e47f72fd55388619691a7d753"
++dependencies = [
++ "cc",
++ "winapi",
++]
++
++[[package]]
++name = "lock_api"
++version = "0.4.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "dd96ffd135b2fd7b973ac026d28085defbe8983df057ced3eb4f2130b0831312"
++dependencies = [
++ "scopeguard",
++]
++
++[[package]]
++name = "log"
++version = "0.4.11"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "4fabed175da42fed1fa0746b0ea71f412aa9d35e76e95e59b192c64b9dc2bf8b"
++dependencies = [
++ "cfg-if 0.1.10",
++]
++
++[[package]]
++name = "matches"
++version = "0.1.8"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08"
++
++[[package]]
++name = "memchr"
++version = "2.3.4"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "0ee1c47aaa256ecabcaea351eae4a9b01ef39ed810004e298d2511ed284b1525"
++
++[[package]]
++name = "memsec"
++version = "0.6.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "2af4f95d8737f4ffafbd1fb3c703cdc898868a244a59786793cba0520ebdcbdd"
++
++[[package]]
++name = "miniz_oxide"
++version = "0.4.3"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "0f2d26ec3309788e423cfbf68ad1800f061638098d76a83681af979dc4eda19d"
++dependencies = [
++ "adler",
++ "autocfg",
++]
++
++[[package]]
++name = "nettle"
++version = "7.0.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "b1afae85450b829ad720f2827e3b07d78e06b5521cfe5ed72808a9f593e7cdd8"
++dependencies = [
++ "getrandom",
++ "libc",
++ "nettle-sys",
++ "thiserror",
++]
++
++[[package]]
++name = "nettle-sys"
++version = "2.0.4"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "b8629333ff5f3b74d251dae253e383cda9242410fac4244a4fe855469be101fb"
++dependencies = [
++ "bindgen",
++ "pkg-config",
++]
++
++[[package]]
++name = "new_debug_unreachable"
++version = "1.0.4"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54"
++
++[[package]]
++name = "nom"
++version = "4.2.3"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "2ad2a91a8e869eeb30b9cb3119ae87773a8f4ae617f41b1eb9c154b2905f7bd6"
++dependencies = [
++ "memchr",
++ "version_check 0.1.5",
++]
++
++[[package]]
++name = "num-integer"
++version = "0.1.44"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db"
++dependencies = [
++ "autocfg",
++ "num-traits",
++]
++
++[[package]]
++name = "num-traits"
++version = "0.2.14"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290"
++dependencies = [
++ "autocfg",
++]
++
++[[package]]
++name = "object"
++version = "0.22.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "8d3b63360ec3cb337817c2dbd47ab4a0f170d285d8e5a2064600f3def1402397"
++
++[[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.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "9ccb628cad4f84851442432c60ad8e1f607e29752d0bf072cbd0baf28aa34272"
++dependencies = [
++ "cfg-if 1.0.0",
++ "instant",
++ "libc",
++ "redox_syscall",
++ "smallvec",
++ "winapi",
++]
++
++[[package]]
++name = "paste"
++version = "1.0.4"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "c5d65c4d95931acda4498f675e332fcbdc9a06705cd07086c510e9b6009cd1c1"
++
++[[package]]
++name = "pcsc"
++version = "2.4.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "88e09a8d8705a2c9b1ffe1f9dd9580efe3f8e80c19fc9f99038fe99b7bb56c83"
++dependencies = [
++ "bitflags",
++ "pcsc-sys",
++]
++
++[[package]]
++name = "pcsc-sys"
++version = "1.2.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "e1b7bfecba2c0f1b5efb0e7caf7533ab1c295024165bcbb066231f60d33e23ea"
++dependencies = [
++ "pkg-config",
++]
++
++[[package]]
++name = "peeking_take_while"
++version = "0.1.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099"
++
++[[package]]
++name = "petgraph"
++version = "0.5.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "467d164a6de56270bd7c4d070df81d07beace25012d5103ced4e9ff08d6afdb7"
++dependencies = [
++ "fixedbitset",
++ "indexmap",
++]
++
++[[package]]
++name = "phf_shared"
++version = "0.8.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7"
++dependencies = [
++ "siphasher",
++]
++
++[[package]]
++name = "pico-args"
++version = "0.3.4"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "28b9b4df73455c861d7cbf8be42f01d3b373ed7f02e378d55fa84eafc6f638b1"
++
++[[package]]
++name = "pkg-config"
++version = "0.3.19"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "3831453b3449ceb48b6d9c7ad7c96d5ea673e9b470a1dc578c2ce6521230884c"
++
++[[package]]
++name = "precomputed-hash"
++version = "0.1.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c"
++
++[[package]]
++name = "proc-macro2"
++version = "1.0.24"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71"
++dependencies = [
++ "unicode-xid",
++]
++
++[[package]]
++name = "pyo3"
++version = "0.13.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "5cdd01a4c2719dd1f3ceab0875fa1a2c2cd3c619477349d78f43cd716b345436"
++dependencies = [
++ "cfg-if 1.0.0",
++ "ctor",
++ "indoc",
++ "inventory",
++ "libc",
++ "parking_lot",
++ "paste",
++ "pyo3-macros",
++ "unindent",
++]
++
++[[package]]
++name = "pyo3-macros"
++version = "0.13.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "7f8218769d13e354f841d559a19b0cf22cfd55959c7046ef594e5f34dbe46d16"
++dependencies = [
++ "pyo3-macros-backend",
++ "quote",
++ "syn",
++]
++
++[[package]]
++name = "pyo3-macros-backend"
++version = "0.13.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "fc4da0bfdf76f0a5971c698f2cb6b3f832a6f80f16dedeeb3f123eb0431ecce2"
++dependencies = [
++ "proc-macro2",
++ "quote",
++ "syn",
++]
++
++[[package]]
++name = "quote"
++version = "1.0.8"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "991431c3519a3f36861882da93630ce66b52918dcf1b8e2fd66b397fc96f28df"
++dependencies = [
++ "proc-macro2",
++]
++
++[[package]]
++name = "redox_syscall"
++version = "0.1.57"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce"
++
++[[package]]
++name = "redox_users"
++version = "0.3.5"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "de0737333e7a9502c789a36d7c7fa6092a49895d4faa31ca5df163857ded2e9d"
++dependencies = [
++ "getrandom",
++ "redox_syscall",
++ "rust-argon2",
++]
++
++[[package]]
++name = "regex"
++version = "1.4.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "38cf2c13ed4745de91a5eb834e11c00bcc3709e773173b2ce4c56c9fbde04b9c"
++dependencies = [
++ "aho-corasick",
++ "memchr",
++ "regex-syntax",
++ "thread_local",
++]
++
++[[package]]
++name = "regex-syntax"
++version = "0.6.21"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "3b181ba2dcf07aaccad5448e8ead58db5b742cf85dfe035e2227f137a539a189"
++
++[[package]]
++name = "rpassword"
++version = "5.0.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "d755237fc0f99d98641540e66abac8bc46a0652f19148ac9e21de2da06b326c9"
++dependencies = [
++ "libc",
++ "winapi",
++]
++
++[[package]]
++name = "rust-argon2"
++version = "0.8.3"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "4b18820d944b33caa75a71378964ac46f58517c92b6ae5f762636247c09e78fb"
++dependencies = [
++ "base64",
++ "blake2b_simd",
++ "constant_time_eq",
++ "crossbeam-utils",
++]
++
++[[package]]
++name = "rustc-demangle"
++version = "0.1.18"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "6e3bad0ee36814ca07d7968269dd4b7ec89ec2da10c4bb613928d3077083c232"
++
++[[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 = "sequoia-openpgp"
++version = "1.0.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "664de0a9388e38d0f350547056f18fcc03f78d85e5a49fa4fa8927ca6aea1424"
++dependencies = [
++ "anyhow",
++ "backtrace",
++ "base64",
++ "buffered-reader",
++ "bzip2",
++ "chrono",
++ "dyn-clone",
++ "eax",
++ "flate2",
++ "idna",
++ "lalrpop",
++ "lalrpop-util",
++ "lazy_static",
++ "libc",
++ "memsec",
++ "nettle",
++ "regex",
++ "sha1collisiondetection",
++ "thiserror",
++ "unicode-normalization",
++]
++
++[[package]]
++name = "sha1collisiondetection"
++version = "0.2.3"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "d7a6cf187c4059b3e63de2358b7e2f9a2261b6f3fd8ef4e7342308d0863ed082"
++dependencies = [
++ "digest",
++ "generic-array",
++ "libc",
++]
++
++[[package]]
++name = "shlex"
++version = "0.1.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "7fdf1b9db47230893d76faad238fd6097fd6d6a9245cd7a4d90dbd639536bbd2"
++
++[[package]]
++name = "siphasher"
++version = "0.3.3"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "fa8f3741c7372e75519bd9346068370c9cdaabcc1f9599cbcf2a2719352286b7"
++
++[[package]]
++name = "smallvec"
++version = "1.6.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "1a55ca5f3b68e41c979bf8c46a6f1da892ca4db8f94023ce0bd32407573b1ac0"
++
++[[package]]
++name = "string_cache"
++version = "0.8.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "8ddb1139b5353f96e429e1a5e19fbaf663bddedaa06d1dbd49f82e352601209a"
++dependencies = [
++ "lazy_static",
++ "new_debug_unreachable",
++ "phf_shared",
++ "precomputed-hash",
++]
++
++[[package]]
++name = "subtle"
++version = "2.4.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "1e81da0851ada1f3e9d4312c704aa4f8806f0f9d69faaf8df2f3464b4a9437c2"
++
++[[package]]
++name = "syn"
++version = "1.0.57"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "4211ce9909eb971f111059df92c45640aad50a619cf55cd76476be803c4c68e6"
++dependencies = [
++ "proc-macro2",
++ "quote",
++ "unicode-xid",
++]
++
++[[package]]
++name = "talktosc"
++version = "0.1.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "eda5fee425f91e5a4083946f4468948f59cc16412cdcd659554e474c647a5645"
++dependencies = [
++ "pcsc",
++ "rpassword",
++ "thiserror",
++]
++
++[[package]]
++name = "term"
++version = "0.5.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "edd106a334b7657c10b7c540a0106114feadeb4dc314513e97df481d5d966f42"
++dependencies = [
++ "byteorder",
++ "dirs",
++ "winapi",
++]
++
++[[package]]
++name = "thiserror"
++version = "1.0.23"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "76cc616c6abf8c8928e2fdcc0dbfab37175edd8fb49a4641066ad1364fdab146"
++dependencies = [
++ "thiserror-impl",
++]
++
++[[package]]
++name = "thiserror-impl"
++version = "1.0.23"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "9be73a2caec27583d0046ef3796c3794f868a5bc813db689eed00c7631275cd1"
++dependencies = [
++ "proc-macro2",
++ "quote",
++ "syn",
++]
++
++[[package]]
++name = "thread_local"
++version = "1.0.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "d40c6d1b69745a6ec6fb1ca717914848da4b44ae29d9b3080cbee91d72a69b14"
++dependencies = [
++ "lazy_static",
++]
++
++[[package]]
++name = "time"
++version = "0.1.44"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255"
++dependencies = [
++ "libc",
++ "wasi 0.10.0+wasi-snapshot-preview1",
++ "winapi",
++]
++
++[[package]]
++name = "tiny-keccak"
++version = "2.0.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237"
++dependencies = [
++ "crunchy",
++]
++
++[[package]]
++name = "tinyvec"
++version = "1.1.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "ccf8dbc19eb42fba10e8feaaec282fb50e2c14b2726d6301dbfeed0f73306a6f"
++dependencies = [
++ "tinyvec_macros",
++]
++
++[[package]]
++name = "tinyvec_macros"
++version = "0.1.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c"
++
++[[package]]
++name = "typenum"
++version = "1.12.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "373c8a200f9e67a0c95e62a4f52fbf80c23b4381c05a17845531982fa99e6b33"
++
++[[package]]
++name = "unicode-bidi"
++version = "0.3.4"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5"
++dependencies = [
++ "matches",
++]
++
++[[package]]
++name = "unicode-normalization"
++version = "0.1.16"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "a13e63ab62dbe32aeee58d1c5408d35c36c392bba5d9d3142287219721afe606"
++dependencies = [
++ "tinyvec",
++]
++
++[[package]]
++name = "unicode-xid"
++version = "0.2.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564"
++
++[[package]]
++name = "unindent"
++version = "0.1.7"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "f14ee04d9415b52b3aeab06258a3f07093182b88ba0f9b8d203f211a7a7d41c7"
++
++[[package]]
++name = "version_check"
++version = "0.1.5"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd"
++
++[[package]]
++name = "version_check"
++version = "0.9.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "b5a972e5669d67ba988ce3dc826706fb0a8b01471c088cb0b6110b805cc36aed"
++
++[[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.10.0+wasi-snapshot-preview1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f"
++
++[[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/johnnycanencrypt/default.nix b/nixpkgs/pkgs/development/python-modules/johnnycanencrypt/default.nix
new file mode 100644
index 000000000000..6fcdd5aeb354
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/johnnycanencrypt/default.nix
@@ -0,0 +1,100 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, buildPythonPackage
+, rustPlatform
+, llvmPackages
+, pkg-config
+, pcsclite
+, nettle
+, requests
+, vcrpy
+, numpy
+, pytestCheckHook
+, pythonOlder
+, PCSC
+, libiconv
+}:
+
+buildPythonPackage rec {
+  pname = "johnnycanencrypt";
+  version = "0.6.0";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "kushaldas";
+    repo = "johnnycanencrypt";
+    rev = "v${version}";
+    sha256 = "0b1yfddf38dicmjgnw9mk5g0iisa5yq6l9cj6kfskhyrznasvz3g";
+  };
+
+  cargoDeps = rustPlatform.fetchCargoTarball {
+    inherit patches src;
+    name = "${pname}-${version}";
+    hash = "sha256-1dRFC59GY7M99LvQWy2eXPesmLX5k46rN8l4suLYkQY=";
+  };
+
+  format = "pyproject";
+
+  patches = [ ./Cargo.lock.patch ];
+
+  LIBCLANG_PATH = "${llvmPackages.libclang.lib}/lib";
+
+  propagatedBuildInputs = [
+    requests
+    vcrpy
+  ];
+
+  nativeBuildInputs = [
+    llvmPackages.clang
+    pkg-config
+  ] ++ (with rustPlatform; [
+    cargoSetupHook
+    maturinBuildHook
+  ]);
+
+  buildInputs = [
+    pcsclite
+    nettle
+  ] ++ lib.optionals stdenv.isDarwin [
+    PCSC
+    libiconv
+  ];
+
+  # Needed b/c need to check AFTER python wheel is installed (using Rust Build, not buildPythonPackage)
+  doCheck = false;
+  doInstallCheck = true;
+
+  installCheckInputs = [
+    pytestCheckHook
+    numpy
+  ];
+
+  # Remove with the next release after 0.5.0. This change is required
+  # for compatibility with maturin 0.9.0.
+  postPatch = ''
+    sed '/project-url = /d' -i Cargo.toml
+    substituteInPlace pyproject.toml \
+      --replace 'manylinux = "off"' 'skip-auditwheel = true'
+  '';
+
+  preCheck = ''
+    export TESTDIR=$(mktemp -d)
+    cp -r tests/ $TESTDIR
+    pushd $TESTDIR
+  '';
+
+  postCheck = ''
+    popd
+  '';
+
+  pythonImportsCheck = [ "johnnycanencrypt" ];
+
+  meta = with lib; {
+    broken = (stdenv.isLinux && stdenv.isAarch64) || stdenv.isDarwin;
+    homepage = "https://github.com/kushaldas/johnnycanencrypt";
+    description = "Python module for OpenPGP written in Rust";
+    license = licenses.gpl3Plus;
+    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..100228bf4f14
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/josepy/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, cryptography
+, fetchPypi
+, pyopenssl
+, pytestCheckHook
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "josepy";
+  version = "1.13.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-iTHa84+KTIUnSg6LfLJa3f2NHyj5+4++0FPdUa7HXck=";
+  };
+
+  propagatedBuildInputs = [
+    pyopenssl
+    cryptography
+    setuptools
+  ];
+
+  checkInputs = [
+    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/jproperties/default.nix b/nixpkgs/pkgs/development/python-modules/jproperties/default.nix
new file mode 100644
index 000000000000..0089e153f4f3
--- /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}";
+    sha256 = "sha256-O+ALeGHMNjW1dc9IRyLzO81k8DW2vbGjuZqXxgrhYjo=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  checkInputs = [
+    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..92c78895eb62
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jpylyzer/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, six
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "jpylyzer";
+  version = "2.0.1";
+
+  src = fetchFromGitHub {
+    owner = "openpreserve";
+    repo = pname;
+    rev = version;
+    sha256 = "1cd9klq83g9p4nkg7x78axqid5vcsqzggp431hcfdiixa50yjxjg";
+  };
+
+  propagatedBuildInputs = [ six ];
+
+  checkInputs = [ pytestCheckHook ];
+  pythonImportsCheck = [ "jpylyzer" ];
+
+  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/jq/default.nix b/nixpkgs/pkgs/development/python-modules/jq/default.nix
new file mode 100644
index 000000000000..ed80bc9f81f7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jq/default.nix
@@ -0,0 +1,29 @@
+{ buildPythonPackage, fetchPypi, lib, jq }:
+
+buildPythonPackage rec {
+  pname = "jq";
+  version = "1.2.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-hqzixD8XtaZKOIh+3nLHuM4qsLz6ge4o/2Q06TUBCr4=";
+  };
+
+  patches = [
+    # Removes vendoring
+    ./jq-py-setup.patch
+  ];
+
+  buildInputs = [ jq ];
+
+  # no tests executed
+  doCheck = false;
+  pythonImportsCheck = [ "jq" ];
+
+  meta = {
+    description = "Python bindings for jq, the flexible JSON processor";
+    homepage = "https://github.com/mwilliamson/jq.py";
+    license = lib.licenses.bsd2;
+    maintainers = with lib.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..cf8713796751
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jq/jq-py-setup.patch
@@ -0,0 +1,144 @@
+From bef841b73ba7c9a79211146798ac888fce9bb55a Mon Sep 17 00:00:00 2001
+From: "Robert T. McGibbon" <rmcgibbo@gmail.com>
+Date: Fri, 7 May 2021 19:14:20 -0400
+Subject: [PATCH 1/1] Vastly simplify setup.py for distro compatibility
+
+---
+ setup.py | 98 +-------------------------------------------------------
+ 1 file changed, 1 insertion(+), 97 deletions(-)
+
+diff --git a/setup.py b/setup.py
+index 663792c..3ebcabe 100644
+--- a/setup.py
++++ b/setup.py
+@@ -1,113 +1,19 @@
+ #!/usr/bin/env python
+ 
+ import os
+-import subprocess
+-import tarfile
+-import shutil
+-import sysconfig
+ 
+-import requests
+ from setuptools import setup
+-from setuptools.command.build_ext import build_ext
+ from setuptools.extension import Extension
+ 
+ 
+-def urlretrieve(source_url, destination_path):
+-    response = requests.get(source_url, stream=True)
+-    if response.status_code != 200:
+-        raise Exception("status code was: {}".format(response.status_code))
+-
+-    with open(destination_path, "wb") as fileobj:
+-        for chunk in response.iter_content(chunk_size=128):
+-            fileobj.write(chunk)
+-
+-def path_in_dir(relative_path):
+-    return os.path.abspath(os.path.join(os.path.dirname(__file__), relative_path))
+-
+-def dependency_path(relative_path):
+-    return os.path.join(path_in_dir("_deps"), relative_path)
+-
+ def read(fname):
+     return open(os.path.join(os.path.dirname(__file__), fname)).read()
+ 
+ 
+-jq_lib_tarball_path = dependency_path("jq-lib-1.6.tar.gz")
+-jq_lib_dir = dependency_path("jq-1.6")
+-
+-oniguruma_version = "6.9.4"
+-oniguruma_lib_tarball_path = dependency_path("onig-{}.tar.gz".format(oniguruma_version))
+-oniguruma_lib_build_dir = dependency_path("onig-{}".format(oniguruma_version))
+-oniguruma_lib_install_dir = dependency_path("onig-install-{}".format(oniguruma_version))
+-
+-class jq_build_ext(build_ext):
+-    def run(self):
+-        if not os.path.exists(dependency_path(".")):
+-            os.makedirs(dependency_path("."))
+-        self._build_oniguruma()
+-        self._build_libjq()
+-        build_ext.run(self)
+-
+-    def _build_oniguruma(self):
+-        self._build_lib(
+-            source_url="https://github.com/kkos/oniguruma/releases/download/v{0}/onig-{0}.tar.gz".format(oniguruma_version),
+-            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(
+-            source_url="https://github.com/stedolan/jq/releases/download/jq-1.6/jq-1.6.tar.gz",
+-            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, source_url, tarball_path, lib_dir, commands):
+-        self._download_tarball(
+-            source_url=source_url,
+-            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 _download_tarball(self, source_url, tarball_path, lib_dir):
+-        if os.path.exists(tarball_path):
+-            os.unlink(tarball_path)
+-        print("Downloading {}".format(source_url))
+-        urlretrieve(source_url, tarball_path)
+-        print("Downloaded {}".format(source_url))
+-
+-        if os.path.exists(lib_dir):
+-            shutil.rmtree(lib_dir)
+-        tarfile.open(tarball_path, "r:gz").extractall(dependency_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(
+@@ -120,7 +26,6 @@ setup(
+     python_requires='>=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*',
+     license='BSD 2-Clause',
+     ext_modules = [jq_extension],
+-    cmdclass={"build_ext": jq_build_ext},
+     classifiers=[
+         'Development Status :: 5 - Production/Stable',
+         'Intended Audience :: Developers',
+@@ -137,4 +42,3 @@ setup(
+         'Programming Language :: Python :: 3.9',
+     ],
+ )
+-
+-- 
+2.29.3
+
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..c47e6aee0bbd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/js2py/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, tzlocal
+, six
+, pyjsparser
+}:
+
+buildPythonPackage rec {
+  pname = "js2py";
+  version = "0.71";
+
+  src = fetchFromGitHub {
+    owner = "PiotrDabkowski";
+    repo = "Js2Py";
+    rev = "5f665f60083a9796ec33861240ce31d6d2b844b6";
+    sha256 = "sha256-1omTV7zkYSQfxhkNgI4gtXTenWt9J1r3VARRHoRsSfc=";
+  };
+
+  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..e03268fb9893
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jsbeautifier/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, fetchPypi
+, buildPythonApplication
+, editorconfig
+, pytestCheckHook
+, pythonOlder
+, six
+}:
+
+buildPythonApplication rec {
+  pname = "jsbeautifier";
+  version = "1.14.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-ziqW7PYmkvpPor1WIH9+qKs3p0qx1QJSVLgPtTFpqYs=";
+  };
+
+  propagatedBuildInputs = [
+    editorconfig
+    six
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "jsbeautifier"
+  ];
+
+  pytestFlagsArray = [
+    "jsbeautifier/tests/testindentation.py"
+  ];
+
+  meta = with lib; {
+    description = "JavaScript unobfuscator and beautifier";
+    homepage = "http://jsbeautifier.org";
+    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..5b25b5c18a4b
--- /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
+  ];
+
+  checkInputs =[
+    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..58759393bbed
--- /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";
+  };
+
+  checkInputs = [
+    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..3658ec111eec
--- /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}";
+    sha256 = "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..1f4425a3e112
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/json-logging/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, pytestCheckHook
+, wheel
+, flask
+, sanic
+, fastapi
+, uvicorn
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "json-logging";
+  version = "1.3.0";
+
+  src = fetchFromGitHub {
+    owner = "bobbui";
+    repo = "json-logging-python";
+    rev = version;
+    hash = "sha256-0eIhOi30r3ApyVkiBdTQps5tNj7rI+q8TjNWxTnhtMQ=";
+  };
+  patches = [
+    # Fix tests picking up test modules instead of real packages.
+    (fetchpatch {
+      url = "https://github.com/bobbui/json-logging-python/commit/6fdb64deb42fe48b0b12bda0442fd5ac5f03107f.patch";
+      sha256 = "sha256-BLfARsw2FdvY22NCaFfdFgL9wTmEZyVIi3CQpB5qU0Y=";
+    })
+  ];
+
+  # - Quart is not packaged for Nixpkgs.
+  checkInputs = [ wheel flask /*quart*/ sanic fastapi uvicorn requests pytestCheckHook ];
+  disabledTests = [ "quart" ];
+  # Tests spawn servers and try to connect to them.
+  __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";
+    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..1846bfc596da
--- /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 = [ maintainers.costrouc ];
+  };
+}
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..e475c3117df3
--- /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.13.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "12bmblnznk174hqg2irggx4hd3cq1nczbwkpsqqzr13hbg7xpw6y";
+  };
+
+  checkInputs = 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..da52d12ef08e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/json-schema-for-humans/default.nix
@@ -0,0 +1,76 @@
+{ 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.41.8";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "coveooss";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-lz08+T8ITsCI0qjcd/JcgXG4o87UjoP1NQa01FJ7fO0=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'pytz = "^2021.1"' 'pytz = "*"'
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    click
+    dataclasses-json
+    htmlmin
+    jinja2
+    markdown2
+    pygments
+    pytz
+    pyyaml
+    requests
+  ];
+
+  checkInputs = [
+    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";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ astro ];
+  };
+}
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..e6a8a68ddb9e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/json-stream/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "json-stream";
+  version = "1.4.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-ebB8l8H6yPLoCXmVOy60IijdBI61SEzJInC30aMe9Bk=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "json_stream"
+  ];
+
+  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..9995e537c541
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/json-tricks/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, pythonOlder
+, pytestCheckHook
+, numpy
+, pandas
+, pytz
+}:
+
+buildPythonPackage rec {
+  pname = "json-tricks";
+  version = "3.15.5";
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "mverleg";
+    repo = "pyjson_tricks";
+    rev = "v${version}";
+    sha256 = "wdpqCqMO0EzKyqE4ishL3CTsSw3sZPGvJ0HEktKFgZU=";
+  };
+
+  checkInputs = [ 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..7f42902583d6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/json5/default.nix
@@ -0,0 +1,32 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, hypothesis
+, lib
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "json5";
+  version = "0.9.6";
+
+  src = fetchFromGitHub {
+    owner = "dpranke";
+    repo = "pyjson5";
+    rev = "v${version}";
+    sha256 = "sha256-RJj5KvLKq43tRuTwxq/mB+sU35xTQwZqg/jpdYcMP6A=";
+  };
+
+  checkInputs = [
+    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/jsonconversion/default.nix b/nixpkgs/pkgs/development/python-modules/jsonconversion/default.nix
new file mode 100644
index 000000000000..22f7fe4625d1
--- /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;
+    sha256 = "sha256-4hMY0N/Px+g5zn3YzNfDWPyi8Pglvd/c2N9SeC4JoZ0=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py --replace "'pytest-runner'" ""
+  '';
+
+  checkInputs = [ 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..b6d6401b455f
--- /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;
+    sha256 = "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..6b7faf9a312d
--- /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";
+  };
+
+  checkInputs = [ 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..73e7d308ec4a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jsonlines/default.nix
@@ -0,0 +1,28 @@
+{ lib, fetchFromGitHub, buildPythonPackage, six
+, flake8, pep8-naming, pytest, pytest-cov }:
+
+buildPythonPackage rec {
+  pname = "jsonlines";
+  version = "3.0.0";
+
+  src = fetchFromGitHub {
+    owner = "wbolster";
+    repo = pname;
+    rev = version;
+    sha256 = "1242bvk208vjaw8zl1d7ydb0i05v8fwdgi92d3bi1vaji9s2hv65";
+  };
+
+  propagatedBuildInputs = [ six ];
+
+  checkInputs = [ flake8 pep8-naming pytest pytest-cov ];
+  checkPhase = ''
+    pytest
+  '';
+
+  meta = with lib; {
+    description = "Python library to simplify working with jsonlines and ndjson data";
+    homepage = "https://github.com/wbolster/jsonlines";
+    maintainers = with maintainers; [ ];
+    license = licenses.bsd3;
+  };
+}
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..3ca8dc01a4b2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jsonmerge/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, jsonschema
+}:
+
+buildPythonPackage rec {
+  pname = "jsonmerge";
+  version = "1.8.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a86bfc44f32f6a28b749743df8960a4ce1930666b3b73882513825f845cb9558";
+  };
+
+  propagatedBuildInputs = [ jsonschema ];
+
+  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..03060f4e866f
--- /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.32";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "stefankoegl";
+    repo = "python-json-patch";
+    rev = "v${version}";
+    hash = "sha256-JMGBgYjnjHQ5JpzDwJcR2nVZfzmQ8ZZtcB0GsJ9Q4Jc=";
+  };
+
+  propagatedBuildInputs = [
+    jsonpointer
+  ];
+
+  checkInputs = [
+    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.bsd2; # "Modified BSD license, says pypi"
+    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..da3a03c2a3e0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jsonpath-ng/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, decorator
+, fetchFromGitHub
+, ply
+, pytestCheckHook
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "jsonpath-ng";
+  version = "1.5.2";
+
+  src = fetchFromGitHub {
+    owner = "h2non";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1cxjwhx0nj85a3awnl7j6afnk07awzv45qfwxl5jqbbc9cxh5bd6";
+  };
+
+  propagatedBuildInputs = [
+    decorator
+    ply
+    six
+  ];
+
+  checkInputs = [ pytestCheckHook ];
+
+  disabledTestPaths = [
+    # Exclude tests that require oslotest
+    "tests/test_jsonpath_rw_ext.py"
+  ];
+
+  pythonImportsCheck = [ "jsonpath_ng" ];
+
+  meta = with lib; {
+    description = "JSONPath implementation for Python";
+    homepage = "https://github.com/h2non/jsonpath-ng";
+    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..383df6e2652e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jsonpath/default.nix
@@ -0,0 +1,21 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "jsonpath";
+  version = "0.82";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "46d3fd2016cd5b842283d547877a02c418a0fe9aa7a6b0ae344115a2c990fef4";
+  };
+
+  meta = with lib; {
+    description = "An XPath for JSON";
+    homepage = "https://github.com/json-path/JsonPath";
+    license = licenses.mit;
+    maintainers = [ 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..969869f86b52
--- /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 = "2.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-eycpGLBVQYLlPcNA3dYtm3+QL+x+ewViDATzzO9Hmg4=";
+  };
+
+  checkInputs = [ 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..504b7f7035a6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jsonpointer/default.nix
@@ -0,0 +1,21 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "jsonpointer";
+  version = "2.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-l8ulFSbIKSgiGP65nasbHmvfjv0cQ9ydV74JPA1pyZo=";
+  };
+
+  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..2ab8ec45a701
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jsonref/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchPypi
+, pytest, mock }:
+
+buildPythonPackage rec {
+  pname = "jsonref";
+  version = "0.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "15v69rg2lkcykb2spnq6vbbirv9sfq480fnwmfppw9gn3h95pi7k";
+  };
+
+  checkInputs = [ pytest mock ];
+
+  checkPhase = ''
+    py.test tests.py
+  '';
+
+  meta = with lib; {
+    description = "An implementation of JSON Reference for Python";
+    homepage    = "https://github.com/gazpachoking/jsonref";
+    license     = licenses.mit;
+    maintainers = with maintainers; [ ];
+    platforms   = platforms.all;
+  };
+}
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..2c66779e0196
--- /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.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "emlove";
+    repo = pname;
+    rev = version;
+    hash = "sha256-HhesXzxVjhWJkubiBi6sMoXi/zicqn99dqT5bilycS8=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    jsonrpc-base
+  ];
+
+  checkInputs = [
+    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..f10fc3f1237b
--- /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=";
+  };
+
+  checkInputs = [
+    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..9bd8ef8a108b
--- /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;
+    sha256 = "sha256-xSOITOVtsNMEDrq610l8LNipLdyMWzKOQDedQEGaNOQ=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    jsonrpc-base
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    pytest-asyncio
+  ];
+
+  pytestFlagsArray = [
+    "--asyncio-mode=legacy"
+    "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..f049e2a09d3d
--- /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;
+    sha256 = "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/jsonschema/default.nix b/nixpkgs/pkgs/development/python-modules/jsonschema/default.nix
new file mode 100644
index 000000000000..cde909e79b83
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jsonschema/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, attrs
+, buildPythonPackage
+, fetchPypi
+, hatch-vcs
+, hatchling
+, importlib-metadata
+, importlib-resources
+, pyrsistent
+, pythonOlder
+, twisted
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "jsonschema";
+  version = "4.9.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-QIxMjtDe3jsmj3pEF4T3QgY4CwT5PrLVN8e++z3zCZ8=";
+  };
+
+  postPatch = ''
+    patchShebangs json/bin/jsonschema_suite
+  '';
+
+  nativeBuildInputs = [
+    hatch-vcs
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    attrs
+    pyrsistent
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+    typing-extensions
+  ] ++ lib.optionals (pythonOlder "3.9") [
+    importlib-resources
+  ];
+
+  checkInputs = [
+    twisted
+  ];
+
+  checkPhase = ''
+    export JSON_SCHEMA_TEST_SUITE=json
+    trial jsonschema
+  '';
+
+  pythonImportsCheck = [
+    "jsonschema"
+  ];
+
+  meta = with lib; {
+    description = "An implementation of JSON Schema validation for Python";
+    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..9b7816e8b186
--- /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 ];
+
+  checkInputs = [ 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/jug/default.nix b/nixpkgs/pkgs/development/python-modules/jug/default.nix
new file mode 100644
index 000000000000..3de77e17095e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jug/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, bottle
+, buildPythonPackage
+, fetchPypi
+, numpy
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, redis
+}:
+
+buildPythonPackage rec {
+  pname = "jug";
+  version = "2.2.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "Jug";
+    inherit version;
+    hash = "sha256-3uK6mWaLEGPFoPuznU+OcnkjFZ+beDoIw0vOC4l5gRg=";
+  };
+
+  propagatedBuildInputs = [
+    bottle
+  ];
+
+  checkInputs = [
+    numpy
+    pytestCheckHook
+    pyyaml
+    redis
+  ];
+
+  pythonImportsCheck = [
+    "jug"
+  ];
+
+  meta = with lib; {
+    description = "A Task-Based Parallelization Framework";
+    homepage = "https://jug.readthedocs.io/";
+    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..c7133c206d84
--- /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 ];
+
+  checkInputs = [ 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/junitparser/default.nix b/nixpkgs/pkgs/development/python-modules/junitparser/default.nix
new file mode 100644
index 000000000000..3a712251fc5d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/junitparser/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, future
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "junitparser";
+  version = "1.4.1";
+
+  src = fetchFromGitHub {
+    owner = "gastlygem";
+    repo = pname;
+    rev = version;
+    sha256 = "16xwayr0rbp7xdg7bzmyf8s7al0dhkbmkcnil66ax7r8bznp5lmp";
+  };
+
+  propagatedBuildInputs = [ future ];
+
+  checkPhase = ''
+    ${python.interpreter} test.py
+  '';
+
+  meta = with lib; {
+    description = "A JUnit/xUnit Result XML Parser";
+    license = licenses.asl20;
+    homepage = "https://github.com/gastlygem/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..9830d29789b5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/junos-eznc/default.nix
@@ -0,0 +1,85 @@
+{ lib
+, buildPythonPackage
+, fetchpatch
+, fetchFromGitHub
+
+# propagates
+, jinja2
+, lxml
+, ncclient
+, netaddr
+, ntc-templates
+, paramiko
+, pyparsing
+, pyserial
+, pyyaml
+, scp
+, six
+, transitions
+, yamlordereddictloader
+
+# tests
+, mock
+, nose
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "junos-eznc";
+  version = "2.6.3";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "Juniper";
+    repo = "py-junos-eznc";
+    rev = version;
+    hash = "sha256-XhQJwtS518AzSwyaWE392nfNdYe9+iYHvXxQsjJfzI8=";
+  };
+
+  patches = [
+    (fetchpatch {
+      # Fixes tests with lxml>=4.8.0; remove > 2.6.3
+      url = "https://github.com/Juniper/py-junos-eznc/commit/048f750bb7357b6f6b9db8ad64bea479298c74fb.patch";
+      hash = "sha256-DYVj0BNPwDSbxDrzHhaq4F4kz1bliXB6Au3I63mRauc=";
+    })
+  ];
+
+  postPatch = ''
+    substituteInPlace requirements.txt \
+      --replace "ncclient==0.6.9" "ncclient"
+  '';
+
+  propagatedBuildInputs = [
+    jinja2
+    lxml
+    ncclient
+    netaddr
+    ntc-templates
+    paramiko
+    pyparsing
+    pyserial
+    pyyaml
+    scp
+    six
+    transitions
+    yamlordereddictloader
+  ];
+
+  checkInputs = [
+    mock
+    nose
+  ];
+
+  checkPhase = ''
+    nosetests -v -a unit --exclude=test_sw_put_ftp
+  '';
+
+  pythonImportsCheck = [ "jnpr.junos" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/Juniper/py-junos-eznc";
+    description = "Junos 'EZ' automation for non-programmers";
+    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..a03910f6ce0b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jupyter-book/default.nix
@@ -0,0 +1,80 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, flit-core
+, 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.13.0";
+
+  format = "flit";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0a956677e7bbee630dd66641c09a84091277887d6dcdd381a676f00fa9de2074";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "jsonschema<4" "jsonschema" \
+      --replace "sphinx-external-toc~=0.2.3" "sphinx-external-toc" \
+      --replace "myst-nb~=0.13.1" "myst-nb" \
+      --replace "docutils>=0.15,<0.18" "docutils" \
+      --replace "sphinx-design~=0.1.0" "sphinx-design" \
+      --replace "linkify-it-py~=1.0.1" "linkify-it-py"
+  '';
+
+  nativeBuildInputs = [ flit-core ];
+
+  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
+  ];
+
+  pythonImportsCheck = [ "jupyter_book" ];
+
+  meta = with lib; {
+    description = "Build a book with Jupyter Notebooks and Sphinx";
+    homepage = "https://executablebooks.org/";
+    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..0cc232bd7064
--- /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 = [ maintainers.costrouc ];
+  };
+}
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..7cf7fab7889d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jupyter-cache/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, attrs
+, click
+, importlib-metadata
+, nbclient
+, nbformat
+, pyyaml
+, sqlalchemy
+, tabulate
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "jupyter-cache";
+  version = "0.5.0";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "87408030a4c8c14fe3f8fe62e6ceeb24c84e544c7ced20bfee45968053d07801";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "nbclient>=0.2,<0.6" "nbclient"
+  '';
+
+  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";
+    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..6df956de5208
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jupyter-client/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, entrypoints
+, jupyter_core
+, hatchling
+, nest-asyncio
+, python-dateutil
+, pyzmq
+, tornado
+, traitlets
+, isPyPy
+, py
+}:
+
+buildPythonPackage rec {
+  pname = "jupyter_client";
+  version = "7.3.4";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-qppsMgVLKQN0+V9zuwyukUVcWN+4T2XIWRkSuPZebVY=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    entrypoints
+    jupyter_core
+    nest-asyncio
+    python-dateutil
+    pyzmq
+    tornado
+    traitlets
+  ] ++ 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-lsp/default.nix b/nixpkgs/pkgs/development/python-modules/jupyter-lsp/default.nix
new file mode 100644
index 000000000000..ffcde4a5b216
--- /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 = "1.5.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-dRq9NUE76ZpDMfNZewk0Gtx1VYntMgkawvaG2z1hJn4=";
+  };
+
+  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://pypi.org/project/jupyter-lsp";
+    license = licenses.bsd3;
+    platforms = platforms.all;
+    maintainers = with maintainers; [ doronbehar ];
+  };
+}
+
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..ae700d9a8068
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jupyter-packaging/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, deprecation
+, hatchling
+, pythonOlder
+, packaging
+, pytestCheckHook
+, pytest-timeout
+, tomlkit
+}:
+
+buildPythonPackage rec {
+  pname = "jupyter-packaging";
+  version = "0.12.2";
+  disabled = pythonOlder "3.7";
+  format = "pyproject";
+
+  src = fetchPypi {
+    pname = "jupyter_packaging";
+    inherit version;
+    sha256 = "sha256-C5nq7PVrnR2Z57y2Yy2RSo6laY2kCyOLqJIno0FX3jI=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [ deprecation packaging tomlkit ];
+
+  checkInputs = [
+    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..6e07fcc28cc0
--- /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 {
+  version = "2022.02.0";
+  pname = "jupyter-repo2docker";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "jupyterhub";
+    repo = "repo2docker";
+    rev = version;
+    sha256 = "sha256-L7jUaGRea5HJnb/SX2K2qfvtFwkq9jfhrpvsu+LHH3M=";
+  };
+
+  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; [ costrouc ];
+  };
+}
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..73797f8fd0d8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jupyter-server-mathjax/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, jupyter-packaging
+, jupyter_server
+, pytest-tornasync
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "jupyter-server-mathjax";
+  version = "0.2.6";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "jupyter_server_mathjax";
+    sha256 = "sha256-ux5rbcBobB/jhqIrWIYWPbVIiTqZwoEMNjmenEyiOUM=";
+  };
+
+  nativeBuildInputs = [
+    jupyter-packaging
+  ];
+
+  propagatedBuildInputs = [
+    jupyter_server
+  ];
+
+  checkInputs = [
+    pytest-tornasync
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "jupyter_server_mathjax" ];
+
+  __darwinAllowLocalNetworking = true;
+
+  meta = with lib; {
+    description = "MathJax resources as a Jupyter Server Extension";
+    homepage = "https://jupyter.org";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
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..7355cb927641
--- /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";
+    sha256 = "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/default.nix b/nixpkgs/pkgs/development/python-modules/jupyter/default.nix
new file mode 100644
index 000000000000..818623c2513b
--- /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/jupyter_console/default.nix b/nixpkgs/pkgs/development/python-modules/jupyter_console/default.nix
new file mode 100644
index 000000000000..8943ba8adc0b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jupyter_console/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nose
+, jupyter-client
+, ipython
+, ipykernel
+, prompt-toolkit
+, pygments
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "jupyter_console";
+  version = "6.4.4";
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-Fy9TNeMdYA32FhOpe38DUvLIJQu9EJLvLWWPdySfifs=";
+  };
+
+  propagatedBuildInputs = [
+    jupyter-client
+    ipython
+    ipykernel
+    prompt-toolkit
+    pygments
+  ];
+  checkInputs = [ nose ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "prompt_toolkit>=2.0.0,<2.1.0" "prompt_toolkit"
+  '';
+
+  # ValueError: underlying buffer has been detached
+  doCheck = false;
+
+  meta = {
+    description = "Jupyter terminal console";
+    homepage = "https://jupyter.org/";
+    license = lib.licenses.bsd3;
+  };
+}
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..b7838ff5915f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jupyter_core/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, fetchpatch
+, python
+, ipython
+, traitlets
+, glibcLocales
+, mock
+, pytestCheckHook
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "jupyter_core";
+  version = "4.9.2";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-1puuuf+xKLjNJlf88nA/icdp0Wc8hRgSEZ46Kg6TrZo=";
+  };
+
+  checkInputs = [ pytestCheckHook mock glibcLocales nose ];
+  propagatedBuildInputs = [ ipython traitlets ];
+
+  patches = [
+    # install jupyter_core/*.py files
+    (fetchpatch {
+      url = "https://github.com/jupyter/jupyter_core/pull/253/commits/3bbeaebec0a53520523162d5e8d5c6ca02b1b782.patch";
+      sha256 = "sha256-QeAfj7wLz4egVUPMAgrZ9Wn/Tv60LrIXLgHGVoH41wQ=";
+    })
+    ./tests_respect_pythonpath.patch
+  ];
+
+  preCheck = ''
+    export HOME=$TMPDIR
+    export LC_ALL=en_US.utf8
+  '';
+
+  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 = "Jupyter core package. A base package on which Jupyter projects rely";
+    homepage = "https://jupyter.org/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ fridh ];
+  };
+}
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..7e7e9ae93a09
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jupyter_core/tests_respect_pythonpath.patch
@@ -0,0 +1,20 @@
+--- a/jupyter_core/tests/test_command.py
++++ b/jupyter_core/tests/test_command.py
+@@ -131,7 +131,7 @@ def test_not_on_path(tmpdir):
+     witness_src = '#!%s\n%s\n' % (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[str('SYSTEMROOT')] = os.environ['SYSTEMROOT']
+     if sys.platform == 'win32':
+@@ -157,7 +157,7 @@ def test_path_priority(tmpdir):
+     witness_b_src = '#!%s\n%s\n' % (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[str('SYSTEMROOT')] = os.environ['SYSTEMROOT']
+     if sys.platform == 'win32':
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..657e7a9ce300
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jupyter_server/default.nix
@@ -0,0 +1,97 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, pandoc
+, pytestCheckHook
+, pytest-console-scripts
+, pytest-timeout
+, pytest-tornasync
+, argon2-cffi
+, jinja2
+, tornado
+, pyzmq
+, ipykernel
+, ipython_genutils
+, traitlets
+, jupyter_core
+, jupyter-client
+, nbformat
+, nbconvert
+, send2trash
+, terminado
+, prometheus-client
+, anyio
+, websocket-client
+, requests
+, requests-unixsocket
+}:
+
+buildPythonPackage rec {
+  pname = "jupyter_server";
+  version = "1.18.1";
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-K3L8WVvMrikiYKrYFXoOrY2ixwPsauG7ezbbrQ4mfqc=";
+  };
+
+  propagatedBuildInputs = [
+    argon2-cffi
+    jinja2
+    tornado
+    pyzmq
+    ipython_genutils
+    traitlets
+    jupyter_core
+    jupyter-client
+    nbformat
+    nbconvert
+    send2trash
+    terminado
+    prometheus-client
+    anyio
+    websocket-client
+    requests-unixsocket
+  ];
+
+  checkInputs = [
+    ipykernel
+    pandoc
+    pytestCheckHook
+    pytest-console-scripts
+    pytest-timeout
+    pytest-tornasync
+    requests
+  ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d)
+    export PATH=$out/bin:$PATH
+  '';
+
+  disabledTests = [
+    "test_cull_idle"
+  ] ++ 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"
+  ];
+
+  disabledTestPaths = [
+    "tests/services/kernels/test_api.py"
+    "tests/services/sessions/test_api.py"
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  meta = with lib; {
+    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 = [ maintainers.elohmeier ];
+  };
+}
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..4d0831ff9795
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jupyterhub-ldapauthenticator/default.nix
@@ -0,0 +1,28 @@
+{ 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;
+    maintainers = with maintainers; [ ixxie ];
+  };
+}
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..2137a0f3f055
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jupyterhub-systemdspawner/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, jupyterhub
+, tornado
+, bash
+}:
+
+buildPythonPackage rec {
+  pname = "jupyterhub-systemdspawner";
+  version = "0.15";
+
+  src = fetchFromGitHub {
+    owner = "jupyterhub";
+    repo = "systemdspawner";
+    rev = "v${version}";
+    sha256 = "sha256-EUCA+CKCeYr+cLVrqTqe3Q32JkbqeALL6tfOnlVHk8Q=";
+  };
+
+  propagatedBuildInputs = [
+    jupyterhub
+    tornado
+  ];
+
+  buildInputs = [ bash ];
+
+  postPatch = ''
+    substituteInPlace systemdspawner/systemd.py \
+      --replace "/bin/bash" "${bash}/bin/bash"
+
+    substituteInPlace systemdspawner/systemdspawner.py \
+      --replace "/bin/bash" "${bash}/bin/bash"
+  '';
+
+  # no tests
+  doCheck = false;
+
+  postInstall = ''
+    mkdir -p $out/bin
+    cp check-kernel.bash $out/bin/
+    patchShebangs $out/bin
+  '';
+
+  meta = with lib; {
+    description = "JupyterHub Spawner using systemd for resource isolation";
+    homepage = "https://github.com/jupyterhub/systemdspawner";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ costrouc erictapen ];
+  };
+}
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..2aef23fe4a4a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jupyterhub-tmpauthenticator/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, jupyterhub
+}:
+
+buildPythonPackage rec {
+  pname = "jupyterhub-tmpauthenticator";
+  version = "0.6";
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "064x1ypxwx1l270ic97p8czbzb7swl9758v40k3w2gaqf9762f0l";
+  };
+
+  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.";
+    license = with licenses; [ bsd3 ];
+    homepage = "https://github.com/jupyterhub/tmpauthenticator";
+    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..04db4d4d0c22
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jupyterhub/default.nix
@@ -0,0 +1,165 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, fetchzip
+, alembic
+, async_generator
+, certipy
+, python-dateutil
+, entrypoints
+, jinja2
+, jupyter-telemetry
+, oauthlib
+, pamela
+, prometheus-client
+, requests
+, sqlalchemy
+, tornado
+, traitlets
+, nodePackages
+, beautifulsoup4
+, cryptography
+, notebook
+, pytest-asyncio
+, pytestCheckHook
+, requests-mock
+, 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 = "1.5.0";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-3GGPZXwjukYoDjYlflCTGAZnS6Dp5kmK+wke/GIm1p0=";
+  };
+
+  # 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'" \
+      "'${nodePackages.configurable-http-proxy}/bin/configurable-http-proxy'"
+
+    substituteInPlace jupyterhub/tests/test_proxy.py --replace \
+      "'configurable-http-proxy'" \
+      "'${nodePackages.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 = [
+    # https://github.com/jupyterhub/jupyterhub/blob/master/requirements.txt
+    alembic
+    async_generator
+    certipy
+    python-dateutil
+    entrypoints
+    jinja2
+    jupyter-telemetry
+    oauthlib
+    pamela
+    prometheus-client
+    requests
+    sqlalchemy
+    tornado
+    traitlets
+  ];
+
+  preCheck = ''
+    substituteInPlace jupyterhub/tests/test_spawner.py --replace \
+      "'jupyterhub-singleuser'" "'$out/bin/jupyterhub-singleuser'"
+  '';
+
+  checkInputs = [
+    # https://github.com/jupyterhub/jupyterhub/blob/master/dev-requirements.txt
+    beautifulsoup4
+    cryptography
+    notebook
+    pytest-asyncio
+    pytestCheckHook
+    requests-mock
+    virtualenv
+  ];
+
+  disabledTests = [
+    # Tries to install older versions through pip
+    "test_upgrade"
+    # Testcase fails to find requests import
+    "test_external_service"
+    # attempts to do ssl connection
+    "test_connection_notebook_wrong_certs"
+  ];
+
+  meta = with lib; {
+    # darwin: E   OSError: dlopen(/nix/store/43zml0mlr17r5jsagxr00xxx91hz9lky-openpam-20170430/lib/libpam.so, 6): image not found
+    broken = (stdenv.isLinux && stdenv.isAarch64) || stdenv.isDarwin;
+    description = "Serves multiple Jupyter notebook instances";
+    homepage = "https://jupyter.org/";
+    changelog = "https://github.com/jupyterhub/jupyterhub/blob/${version}/docs/source/changelog.md";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ixxie cstrahan ];
+  };
+}
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..606e2226d22e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jupyterlab-git/default.nix
@@ -0,0 +1,76 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, git
+, jupyter_server
+, jupyter-packaging
+, jupyterlab
+, nbdime
+, nbformat
+, pexpect
+, pytest-asyncio
+, pytest-tornasync
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "jupyterlab-git";
+  version = "0.37.1";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    pname = "jupyterlab_git";
+    inherit version;
+    sha256 = "sha256-vOM2y8XrjmKtVtI6h4/DUrHzSLJuZXIm0C7//gMh+5o=";
+  };
+
+  nativeBuildInputs = [
+    jupyter-packaging
+  ];
+
+  propagatedBuildInputs = [
+    jupyter_server
+    nbdime
+    git
+    nbformat
+    pexpect
+  ];
+
+  checkInputs = [
+    jupyterlab
+    pytest-asyncio
+    pytest-tornasync
+    pytestCheckHook
+  ];
+
+  # All Tests on darwin fail or are skipped due to sandbox
+  doCheck = !stdenv.isDarwin;
+
+  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"
+  ];
+
+  meta = with lib; {
+    description = "Jupyter lab extension for version control with Git";
+    homepage = "https://github.com/jupyterlab/jupyterlab-git";
+    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..069e7c16f0a5
--- /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 = "3.10.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-mtbvIsSXK4VIB5cDT8eRRyjrePGFa02rM2Fobk8gyd0=";
+  };
+
+  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; [ doronbehar ];
+  };
+}
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..3d6b9fa93350
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jupyterlab-pygments/default.nix
@@ -0,0 +1,27 @@
+{ lib, buildPythonPackage, fetchFromGitHub, pygments }:
+
+buildPythonPackage rec {
+  pname = "jupyterlab_pygments";
+  version = "0.1.2";
+
+  src = fetchFromGitHub {
+    owner = "jupyterlab";
+    repo = pname;
+    rev = version;
+    sha256 = "02lv63qalw4x6xs70n2w2p3c2cnhk91sr961wlbi77xs0g8fcman";
+  };
+
+  # 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-widgets/default.nix b/nixpkgs/pkgs/development/python-modules/jupyterlab-widgets/default.nix
new file mode 100644
index 000000000000..26794fbc77b5
--- /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 = "2.0.0b1";
+
+  src = fetchPypi {
+    pname = "jupyterlab_widgets";
+    inherit version;
+    sha256 = "1xinfk3bhqmfp9ygfpi8b87h4ky8dv3sdr96035psx1jjgyyw8bi";
+  };
+
+  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 SuperSandro2000 ];
+  };
+}
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..7093f4109519
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jupyterlab/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, jupyterlab_server
+, notebook
+, pythonOlder
+, jupyter-packaging
+, nbclassic
+}:
+
+buildPythonPackage rec {
+  pname = "jupyterlab";
+  version = "3.4.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-WioP3SK9hiitRbYY41IDh8MqSBjjrxEtutH2STBN/CA=";
+  };
+
+  nativeBuildInputs = [
+    jupyter-packaging
+  ];
+
+  propagatedBuildInputs = [
+    jupyterlab_server
+    notebook
+    nbclassic
+  ];
+
+  makeWrapperArgs = [
+    "--set"
+    "JUPYTERLAB_DIR"
+    "$out/share/jupyter/lab"
+  ];
+
+  # Depends on npm
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "jupyterlab"
+  ];
+
+  meta = with lib; {
+    description = "Jupyter lab environment notebook server extension";
+    license = with licenses; [ bsd3 ];
+    homepage = "https://jupyter.org/";
+    maintainers = with maintainers; [ zimbatm costrouc ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jupyterlab_launcher/default.nix b/nixpkgs/pkgs/development/python-modules/jupyterlab_launcher/default.nix
new file mode 100644
index 000000000000..15b53f523b57
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jupyterlab_launcher/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchPypi, jsonschema, notebook, pythonOlder }:
+buildPythonPackage rec {
+  pname = "jupyterlab_launcher";
+  version = "0.13.1";
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f880eada0b8b1f524d5951dc6fcae0d13b169897fc8a247d75fb5beadd69c5f0";
+  };
+
+  propagatedBuildInputs = [
+    jsonschema
+    notebook
+  ];
+
+  # depends on requests and a bunch of other libraries
+  doCheck = false;
+
+  meta = with lib; {
+    description = "This package is used to launch an application built using JupyterLab";
+    license = with licenses; [ bsd3 ];
+    homepage = "https://jupyter.org/";
+    maintainers = with maintainers; [ zimbatm ];
+  };
+}
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..62730df149ea
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jupyterlab_server/default.nix
@@ -0,0 +1,70 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchPypi
+, hatchling
+, jsonschema
+, pythonOlder
+, requests
+, pytestCheckHook
+, pyjson5
+, babel
+, jupyter_server
+, openapi-core
+, pytest-timeout
+, pytest-tornasync
+, ruamel-yaml
+, strict-rfc3339
+}:
+
+buildPythonPackage rec {
+  pname = "jupyterlab_server";
+  version = "2.15.0";
+  format = "pyproject";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-qRxRXg55caj3w8mDS3SIV/faxQL5NgS/KDmHmR/Zh+8=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "--cov jupyterlab_server --cov-report term-missing --cov-report term:skip-covered" ""
+
+    # translation tests try to install additional packages into read only paths
+    rm -r tests/translations/
+  '';
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [ requests jsonschema pyjson5 babel jupyter_server ];
+
+  checkInputs = [
+    openapi-core
+    pytestCheckHook
+    pytest-timeout
+    pytest-tornasync
+    ruamel-yaml
+  ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  pytestFlagsArray = [
+    # DeprecationWarning: The distutils package is deprecated and slated for removal in Python 3.12. Use setuptools or check PEP 632 for potential alternatives
+    "-W ignore::DeprecationWarning"
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  meta = with lib; {
+    description = "JupyterLab Server";
+    homepage = "https://jupyter.org";
+    license = licenses.bsdOriginal;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..aa4bcaf9b94d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jupytext/default.nix
@@ -0,0 +1,83 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, GitPython
+, isort
+, jupyter-client
+, jupyter-packaging
+, jupyterlab
+, markdown-it-py
+, mdit-py-plugins
+, nbformat
+, notebook
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, toml
+}:
+
+buildPythonPackage rec {
+  pname = "jupytext";
+  version = "1.14.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "mwouts";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-a/dvY7MLCjYGOvsCC5tiIIJpApNriRtBN63VK+McEVw=";
+  };
+
+  buildInputs = [
+    jupyter-packaging
+    jupyterlab
+  ];
+
+  propagatedBuildInputs = [
+    markdown-it-py
+    mdit-py-plugins
+    nbformat
+    pyyaml
+    toml
+  ];
+
+  checkInputs = [
+    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";
+    license = licenses.mit;
+    maintainers = with maintainers; [ timokau ];
+  };
+}
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..814d1d3e53f3
--- /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";
+  };
+
+  checkInputs = [
+    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..90f59b6cfcc4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/justbases/default.nix
@@ -0,0 +1,24 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, hypothesis
+}:
+
+buildPythonPackage rec {
+  pname = "justbases";
+  version = "0.15";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-vQEfC8Z7xMM/fhBG6jSuhLEP/Iece5Rje1yqbpjVuPg=";
+  };
+
+  checkInputs = [ hypothesis ];
+
+  meta = with lib; {
+    description = "conversion of ints and rationals to any base";
+    homepage = "https://pythonhosted.org/justbases";
+    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..31afb7540be2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/justbytes/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, justbases
+, hypothesis
+}:
+
+buildPythonPackage rec {
+  pname = "justbytes";
+  version = "0.15";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-qrMO9X0v5yYjeWa72mogegR+ii8tCi+o7qZ+Aff2wZQ=";
+  };
+
+  propagatedBuildInputs = [ justbases ];
+  checkInputs = [ hypothesis ];
+
+  meta = with lib; {
+    description = "computing with and displaying bytes";
+    homepage = "https://pythonhosted.org/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..cc302cc5865b
--- /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.6.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "kvanzuijlen";
+    repo = pname;
+    rev = version;
+    hash = "sha256-uQ5Nc5sxqHeAuavyfX4Q6Umsd54aileJjFwOOU6X7Yg=";
+  };
+
+  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..ce035c1c64e0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jwcrypto/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, cryptography
+, deprecated
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "jwcrypto";
+  version = "1.3.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-VLVRsRX/tNErHx7pO4uipxu4VWuj2F1i9wdUlhPah3w=";
+  };
+
+  propagatedBuildInputs = [
+    cryptography
+    deprecated
+  ];
+
+  pythonImportsCheck = [
+    "jwcrypto"
+  ];
+
+  meta = with lib; {
+    description = "Implementation of JOSE Web standards";
+    homepage = "https://github.com/latchset/jwcrypto";
+    license = licenses.lgpl3Plus;
+    maintainers = with maintainers; [ costrouc ];
+  };
+}
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..5036ede5e5e9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jxmlease/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, lxml
+, python
+}:
+
+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;
+
+  checkPhase = ''
+    runHook preCheck
+    ${python.interpreter} -m unittest discover -v
+    runHook postCheck
+  '';
+
+  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/k5test/default.nix b/nixpkgs/pkgs/development/python-modules/k5test/default.nix
new file mode 100644
index 000000000000..6123f4d410f6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/k5test/default.nix
@@ -0,0 +1,45 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchPypi
+, substituteAll
+, krb5Full
+, findutils
+, which
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "k5test";
+  version = "0.10.1";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "2c9181133f3d52c8e29a5ba970b668273c08f855e5da834aaee2ea9efeb6b069";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./fix-paths.patch;
+      inherit findutils krb5Full;
+      # krb5-config is in dev output
+      krb5FullDev = krb5Full.dev;
+      which = "${which}/bin/which";
+    })
+  ];
+
+  # No tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "k5test" ];
+
+  meta = with lib; {
+    broken = (stdenv.isLinux && stdenv.isAarch64) || 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..dc6caf815809
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/k5test/fix-paths.patch
@@ -0,0 +1,122 @@
+diff --git a/k5test/_utils.py b/k5test/_utils.py
+index e289fac..e2f486a 100644
+--- a/k5test/_utils.py
++++ b/k5test/_utils.py
+@@ -65,12 +65,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('@krb5FullDev@/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('@krb5FullDev@/bin/krb5-config --prefix'), 'lib')
+         _PLUGIN_DIR = _decide_plugin_dir(_find_plugin_dirs_installed(lib_dir))
+ 
+     if _PLUGIN_DIR is not None:
+@@ -89,7 +89,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
+@@ -97,7 +97,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 \) '
++        options_raw = get_output('@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')
+diff --git a/k5test/realm.py b/k5test/realm.py
+index 161e5ad..9f50049 100644
+--- a/k5test/realm.py
++++ b/k5test/realm.py
+@@ -90,7 +90,7 @@ class K5Realm(metaclass=abc.ABCMeta):
+ 
+         if provider_cls == K5Realm:
+             krb5_config = _discover_path('krb5-config',
+-                                         '/usr/bin/krb5-config', kwargs)
++                                         '@krb5Full@/bin/krb5-config', kwargs)
+ 
+             try:
+                 krb5_version = subprocess.check_output(
+@@ -101,7 +101,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'):
++                        krb5_config == '@krb5Full@/bin/krb5-config'):
+                     provider_cls = HeimdalRealm
+                 else:
+                     provider_cls = MITRealm
+@@ -434,14 +434,14 @@ class MITRealm(K5Realm):
+     @property
+     def _default_paths(self):
+         return [
+-            ('kdb5_util', 'kdb5_util', '/usr/sbin/kdb5_util'),
+-            ('krb5kdc', 'krb5kdc', '/usr/sbin/kdb5kdc'),
+-            ('kadmin', 'kadmin', '/usr/bin/admin'),
+-            ('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', '@krb5Full@/bin/kdb5_util'),
++            ('krb5kdc', 'krb5kdc', '@krb5Full@/bin/kdb5kdc'),
++            ('kadmin', 'kadmin', '@krb5Full@/bin/admin'),
++            ('kadmin_local', 'kadmin.local', '@krb5Full@/bin/kadmin.local'),
++            ('kadmind', 'kadmind', '@krb5Full@/bin/kadmind'),
++            ('kprop', 'kprop', '@krb5Full@/bin/kprop'),
++            ('_kinit', 'kinit', '@krb5Full@/bin/kinit'),
++            ('_klist', 'klist', '@krb5Full@/bin/klist'),
+         ]
+ 
+     @property
+@@ -585,12 +585,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', '@krb5Full@/bin/kadmin'),
++            ('kadmin_local', 'kadmin', '@krb5Full@/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', '@krb5Full@/bin/kinit'),
++            ('_klist', 'klist', '@krb5Full@/bin/klist'),
++            ('_ktutil', 'ktutil', '@krb5Full@/bin/ktutil'),
+         ]
+ 
+     @property
+diff --git a/k5test/unit.py b/k5test/unit.py
+index 3c64b9e..59da1ab 100644
+--- a/k5test/unit.py
++++ b/k5test/unit.py
+@@ -38,7 +38,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("@krb5FullDev@/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..d8f37f563d4a
--- /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";
+  };
+
+  checkInputs = [ 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..6b67818decfc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/kaggle/default.nix
@@ -0,0 +1,55 @@
+{ buildPythonPackage
+, certifi
+, fetchPypi
+, lib
+, python-dateutil
+, python-slugify
+, six
+, requests
+, tqdm
+, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "kaggle";
+  version = "1.5.12";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b4d87d107bff743aaa805c2b382c3661c4c175cdb159656d4972be2a9cef42cb";
+  };
+
+  # The version bounds in the setup.py file are unnecessarily restrictive.
+  # They have both python-slugify and slugify, don't know why
+  patchPhase = ''
+    substituteInPlace setup.py \
+      --replace 'urllib3 >= 1.21.1, < 1.25' 'urllib3' \
+      --replace " 'slugify'," " "
+    '';
+
+  propagatedBuildInputs = [
+    certifi
+    python-dateutil
+    python-slugify
+    requests
+    six
+    tqdm
+    urllib3
+  ];
+
+  # 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; [ cdepillabout ];
+  };
+}
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..c82f2b4c04b9
--- /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";
+    sha256 = "sha256-l3rGbblUgxO6Y7grlsMEiT3nRIgUZV1VqTyjIgIDtyA=";
+  };
+in
+buildPythonPackage rec {
+  pname = "kaitaistruct";
+  version = "0.10";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "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 = teams.determinatesystems.members;
+  };
+}
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..95a47baaeb04
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/kajiki/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, babel
+, pytz
+, nine
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "kajiki";
+  version = "0.9.1";
+
+  src = fetchFromGitHub {
+    owner = "jackrosenthal";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-bdQBVFHRB408/7X9y+3+fpllhymFRsdv/MEPTVjJh2E=";
+  };
+
+  propagatedBuildInputs = [ babel pytz nine ];
+
+  checkInputs = [ pytestCheckHook ];
+
+  meta = with lib; {
+    description = "Kajiki provides fast well-formed XML templates";
+    homepage = "https://github.com/nandoflorestan/kajiki";
+    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..8f5a11f14c61
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/kaldi-active-grammar/fork.nix
@@ -0,0 +1,93 @@
+{ lib
+, stdenv
+, blas
+, lapack
+, openfst
+, icu
+, pkg-config
+, fetchFromGitHub
+, python3
+, openblas
+, zlib
+, gfortran
+}:
+
+let
+  old-openfst = openfst.overrideAttrs (self: {
+    src = fetchFromGitHub {
+      owner = "kkm000";
+      repo = "openfst";
+      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
+  '';
+
+  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/kaptan/default.nix b/nixpkgs/pkgs/development/python-modules/kaptan/default.nix
new file mode 100644
index 000000000000..309ecda49ccc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/kaptan/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pyyaml
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "kaptan";
+  version = "0.5.12";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1abd1f56731422fce5af1acc28801677a51e56f5d3c3e8636db761ed143c3dd2";
+  };
+
+  postPatch = ''
+    sed -i "s/==.*//g" requirements/test.txt
+
+    substituteInPlace requirements/base.txt --replace 'PyYAML>=3.13,<6' 'PyYAML>=3.13'
+  '';
+
+  propagatedBuildInputs = [ pyyaml ];
+
+  checkInputs = [ pytest ];
+
+  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..3ebba4202b3b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/karton-asciimagic/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, karton-core
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "karton-asciimagic";
+  version = "1.2.0";
+
+  src = fetchFromGitHub {
+    owner = "CERT-Polska";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-sY5ik9efzLBa6Fbh17Vh4q7PlwOGYjuodU9yvp/8E3k=";
+  };
+
+  propagatedBuildInputs = [
+    karton-core
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+    ${python.interpreter} -m unittest discover
+    runHook postCheck
+  '';
+
+  pythonImportsCheck = [ "karton.asciimagic" ];
+
+  meta = with lib; {
+    description = "Decoders for ascii-encoded executables for the Karton framework";
+    homepage = "https://github.com/CERT-Polska/karton-asciimagic";
+    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..a5d4f2c86a29
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/karton-autoit-ripper/default.nix
@@ -0,0 +1,52 @@
+{ 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 = "v${version}";
+    sha256 = "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";
+    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..bcf4b075dfaf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/karton-classifier/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, chardet
+, fetchFromGitHub
+, karton-core
+, pytestCheckHook
+, python-magic
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "karton-classifier";
+  version = "1.4.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "CERT-Polska";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-TRmAin0TAOIwR5EBMwTOJ9QaHO+mOx/eAjgqvyQZDj4=";
+  };
+
+  propagatedBuildInputs = [
+    chardet
+    karton-core
+    python-magic
+  ];
+
+  checkInputs = [
+    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"
+  ];
+
+  meta = with lib; {
+    description = "File type classifier for the Karton framework";
+    homepage = "https://github.com/CERT-Polska/karton-classifier";
+    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..673d7569463a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/karton-config-extractor/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, karton-core
+, malduck
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "karton-config-extractor";
+  version = "2.1.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "CERT-Polska";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-ep69Rrm8Ek0lkgctz6vDAZ1MZ8kWKZSyIvMMAmzTngA=";
+  };
+
+  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";
+    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..d4e95481327b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/karton-core/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, boto3
+, buildPythonPackage
+, fetchFromGitHub
+, python
+, redis
+}:
+
+buildPythonPackage rec {
+  pname = "karton-core";
+  version = "5.0.0";
+
+  src = fetchFromGitHub {
+    owner = "CERT-Polska";
+    repo = "karton";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-0B2u2xnrGc3iQ8B9iAQ3fcovQQCPqdFsn5evgdDwg5M=";
+  };
+
+  propagatedBuildInputs = [
+    boto3
+    redis
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+    ${python.interpreter} -m unittest discover
+    runHook postCheck
+  '';
+
+  pythonImportsCheck = [
+    "karton.core"
+  ];
+
+  meta = with lib; {
+    description = "Distributed malware processing framework";
+    homepage = "https://karton-core.readthedocs.io/";
+    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..8ac4f1022d81
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/karton-dashboard/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, flask
+, karton-core
+, mistune
+, networkx
+, prometheus-client
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "karton-dashboard";
+  version = "1.4.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "CERT-Polska";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-XMyQ0mRF4y61hqlqdxC+He+697P1URfOXQUMnV0pT7o=";
+  };
+
+  propagatedBuildInputs = [
+    flask
+    karton-core
+    mistune
+    networkx
+    prometheus-client
+  ];
+
+  postPatch = ''
+    substituteInPlace requirements.txt \
+      --replace "Flask==2.0.3" "Flask" \
+      --replace "networkx==2.6.3" "networkx" \
+      --replace "prometheus_client==0.11.0" "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";
+    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..75523b67617f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/karton-mwdb-reporter/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, karton-core
+, mwdblib
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "karton-mwdb-reporter";
+  version = "1.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "CERT-Polska";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-QVxczXT74Xt0AtCSDm4nhIK4qtHQ6bqmVNb/CALZSE4=";
+  };
+
+  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";
+    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..16b4036c90cb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/karton-yaramatcher/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, karton-core
+, python
+, yara-python
+}:
+
+buildPythonPackage rec {
+  pname = "karton-yaramatcher";
+  version = "1.2.0";
+
+  src = fetchFromGitHub {
+    owner = "CERT-Polska";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-ulWwPXbjqQXwSRi8MFdcx7vC7P19yu66Ll8jkuTesao=";
+  };
+
+  propagatedBuildInputs = [
+    karton-core
+    yara-python
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+    ${python.interpreter} -m unittest discover
+    runHook postCheck
+  '';
+
+  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";
+    license = with licenses; [ bsd3 ];
+    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..31b65023371e
--- /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.8.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1zpj5cc8624w6i0pxgcxqkjwbkm4pkrv19d7wh5df3jais32g3jq";
+  };
+
+  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..913b7981edd0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/kbcstorage/default.nix
@@ -0,0 +1,69 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+
+# build
+, setuptools-scm
+
+# propagates
+, azure-storage-blob
+, boto3
+, requests
+
+# tests
+, responses
+, python
+}:
+
+buildPythonPackage rec {
+    pname = "sapi-python-client";
+    version = "0.4.1";
+    format = "setuptools";
+
+    src = fetchFromGitHub {
+      owner = "keboola";
+      repo = pname;
+      rev  = version;
+      sha256 = "189dzj06vzp7366h2qsfvbjmw9qgl7jbp8syhynn9yvrjqp4k8h3";
+    };
+
+    SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+    nativeBuildInputs = [
+      setuptools-scm
+    ];
+
+    propagatedBuildInputs = [
+      azure-storage-blob
+      boto3
+      requests
+    ];
+
+    # requires API token and an active keboola bucket
+    # ValueError: Root URL is required.
+    doCheck = false;
+
+    checkInputs = [
+      responses
+    ];
+
+    checkPhase = ''
+      runHook preCheck
+      ${python.interpreter} -m unittest discover
+      runHook postCheck
+    '';
+
+    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";
+      maintainers = with maintainers; [ mrmebelman ];
+      license = licenses.mit;
+    };
+}
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/keep/default.nix b/nixpkgs/pkgs/development/python-modules/keep/default.nix
new file mode 100644
index 000000000000..8b9823b6f031
--- /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..6a4fcdb265f4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/keepalive/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "keepalive";
+  version = "0.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3c6b96f9062a5a76022f0c9d41e9ef5552d80b1cadd4fccc1bf8f183ba1d1ec1";
+  };
+
+  # No tests included
+  doCheck = false;
+
+  meta = with lib; {
+    description = "An HTTP handler for `urllib2` that supports HTTP 1.1 and keepalive";
+    homepage = "https://github.com/wikier/keepalive";
+    license = licenses.asl20;
+    broken = true; # uses use_2to3, which is no longer supported for setuptools>=58
+  };
+
+}
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..a29ce9368071
--- /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 ];
+
+  checkInputs = [ 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..27ef7d8dbf48
--- /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;
+  pythonImportsChecks = [ "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/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..a0d9d4bb153d
--- /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
+  ];
+
+  checkInputs = [
+    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..edb928e682b7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/keras/default.nix
@@ -0,0 +1,37 @@
+{ lib, buildPythonPackage, fetchPypi
+, pytest, pytest-cov, pytest-xdist
+, six, numpy, scipy, pyyaml, h5py
+, keras-applications, keras-preprocessing
+}:
+
+buildPythonPackage rec {
+  pname = "keras";
+  version = "2.9.0";
+  format = "wheel";
+
+  src = fetchPypi {
+    inherit format pname version;
+    sha256 = "sha256-VZESVvic/JNDyfvkth7EWi0z2Jcpy+GrncrPiwe4tqs=";
+  };
+
+  checkInputs = [
+    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..8c85da5ef4c2
--- /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}";
+    sha256 = "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..743220e89ee7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/keyring/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, setuptools-scm
+, importlib-metadata
+, dbus-python
+, jeepney
+, secretstorage
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "keyring";
+  version = "23.7.0";
+  disabled = pythonOlder "3.7";
+
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-eC4c0RMukb9Fn80kO88lsyYBXBrAsZjkQI+R+meRBis=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = lib.optionals (pythonOlder "3.10") [
+    importlib-metadata
+  ] ++ lib.optionals stdenv.isLinux [
+    jeepney
+    secretstorage
+    dbus-python
+  ];
+
+  pythonImportsCheck = [
+    "keyring"
+    "keyring.backend"
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # E       ValueError: too many values to unpack (expected 1)
+    "test_entry_point"
+  ];
+
+  disabledTestPaths = [
+    "tests/backends/test_macOS.py"
+  ];
+
+  meta = with lib; {
+    description = "Store and access your passwords safely";
+    homepage    = "https://github.com/jaraco/keyring";
+    license     = licenses.mit;
+    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..45a85f0fd8fd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/keyrings-alt/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, isPy27
+, six
+
+, pytestCheckHook
+, keyring
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "keyrings.alt";
+  version = "4.1.1";
+  format = "pyproject";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-6HFSuVYvqCK1Ew7jECVRK02m5tsNrzjIcFZtCLhK3tY=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    keyring
+  ];
+
+  pythonImportsCheck = [
+    "keyrings.alt"
+  ];
+
+  meta = with lib; {
+    license = licenses.mit;
+    description = "Alternate keyring implementations";
+    homepage = "https://github.com/jaraco/keyrings.alt";
+    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..23b8b66ea9fa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/keyrings-cryptfile/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, argon2-cffi
+, keyring
+, pycryptodome
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "keyrings.cryptfile";
+  # NOTE: newer releases are bugged/incompatible
+  # https://github.com/frispete/keyrings.cryptfile/issues/15
+  version = "1.3.4";
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-jW+cKMm+xef8C+fl0CGe+6SEkYBHDjFX2/kLCZ62j6c=";
+  };
+
+  patches = [
+    # upstream setup.cfg has an option that is not supported
+    ./fix-testsuite.patch
+    # change of API in keyrings.testing
+    (fetchpatch {
+      url = "https://github.com/frispete/keyrings.cryptfile/commit/6fb9e45f559b8b69f7a0a519c0bece6324471d79.patch";
+      sha256 = "sha256-1878pMO9Ed1zs1pl+7gMjwx77HbDHdE1CryN8TPfPdU=";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    argon2-cffi
+    keyring
+    pycryptodome
+  ];
+
+  pythonImportsCheck = [
+    "keyrings.cryptfile"
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    "test_set_properties"
+    "UncryptedFileKeyringTestCase"
+  ];
+
+  meta = with lib; {
+    description = "Encrypted file keyring backend";
+    homepage = "https://github.com/frispete/keyrings.cryptfile";
+    license = licenses.mit;
+    maintainers = teams.chia.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/keyrings-cryptfile/fix-testsuite.patch b/nixpkgs/pkgs/development/python-modules/keyrings-cryptfile/fix-testsuite.patch
new file mode 100644
index 000000000000..8e32a64e5292
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/keyrings-cryptfile/fix-testsuite.patch
@@ -0,0 +1,14 @@
+diff --git a/setup.cfg b/setup.cfg
+index ec7eb30..7ffd831 100644
+--- a/setup.cfg
++++ b/setup.cfg
+@@ -5,9 +5,6 @@ dists = clean --all sdist bdist_wheel
+ [wheel]
+ universal = 1
+ 
+-[tool:pytest]
+-addopts = -s --cov=keyrings/cryptfile
+-
+ [egg_info]
+ tag_build = 
+ tag_date = 0
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..d77dc444f80d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/keyrings-google-artifactregistry-auth/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, google-auth
+, keyring
+, pluggy
+, requests
+, setuptools-scm
+, toml
+}:
+
+buildPythonPackage rec {
+  pname = "keyrings.google-artifactregistry-auth";
+  version = "1.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-gvoX5SP0A39Ke0VRlplETJF8gIP+QzK6xNReRxM8UnA=";
+  };
+
+  buildInputs = [
+    setuptools-scm
+    toml
+  ];
+
+  propagatedBuildInputs = [
+    google-auth
+    keyring
+    pluggy
+    requests
+  ];
+
+  pythonImportsCheck = [
+    "keyrings.gauth"
+  ];
+
+
+  meta = with lib; {
+    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/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..cc10ec96686c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/keystoneauth1/default.nix
@@ -0,0 +1,77 @@
+{ 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.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-brtfBEyd/SYwh6Mo1R1HmUfR3ckMCdr0GR333HEzQyM=";
+  };
+
+  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
+  ];
+
+  checkInputs = [
+    hacking
+    oslo-config
+    oslo-utils
+    pycodestyle
+    pyyaml
+    requests-mock
+    stestr
+    testresources
+    testtools
+  ];
+
+  checkPhase = ''
+    stestr run
+  '';
+
+  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..21eeb11d136c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/keyutils/default.nix
@@ -0,0 +1,28 @@
+{ lib, buildPythonPackage, fetchFromGitHub, keyutils, pytest-runner, pytest }:
+
+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"' ""
+  '';
+
+  buildInputs = [ keyutils ];
+  checkInputs = [ pytest pytest-runner ];
+
+  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..7d6437f41a86
--- /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" ];
+
+  checkInputs = [
+    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..43d1f784fab9
--- /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}";
+    sha256 = "sha256-xPjw/uJTmvmQZDrI3i1KTUeAZuDF1mc13hvFBl8Erh0=";
+  };
+
+  propagatedBuildInputs = [ requests ];
+
+  checkInputs = [ 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..0b6f41d2c199
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/kitchen/default.nix
@@ -0,0 +1,16 @@
+{ lib, buildPythonPackage, fetchPypi }:
+buildPythonPackage rec {
+  pname = "kitchen";
+  version = "1.2.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0g5hq2icnng9vy4www5hnr3r5srisfwp0wxw1sv5c5dxy61gak5q";
+  };
+
+  meta = with lib; {
+    description = "Kitchen contains a cornucopia of useful code";
+    license = licenses.lgpl2;
+    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..0e8b81ed19cd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/kivy/default.nix
@@ -0,0 +1,90 @@
+{ lib, stdenv
+, buildPythonPackage, fetchFromGitHub, fetchpatch
+, pkg-config, cython, docutils
+, kivy-garden
+, mesa, mtdev, SDL2, SDL2_image, SDL2_ttf, SDL2_mixer
+, ApplicationServices, AVFoundation, libcxx
+, withGstreamer ? true
+, gst_all_1
+, pillow, requests, pygments
+}:
+
+buildPythonPackage rec {
+  pname = "Kivy";
+  version = "2.0.0";
+
+  # use github since pypi line endings are CRLF and patches do not apply
+  src = fetchFromGitHub {
+    owner = "kivy";
+    repo = "kivy";
+    rev = version;
+    sha256 = "sha256-/7GSVQUkYSBEnLVBizMnZAZZxvXVN4r4lskyOgLEcew=";
+  };
+
+  patches = [
+    (fetchpatch {
+      url = "https://github.com/kivy/kivy/commit/1c0656c4472817677cf3b08be504de9ca6b1713f.patch";
+      sha256 = "sha256-phAjMaC3LQuvufwiD0qXzie5B+kezCf8FpKeQMhy/ms=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    pkg-config
+    cython
+    docutils
+  ];
+
+  buildInputs = [
+    SDL2
+    SDL2_image
+    SDL2_ttf
+    SDL2_mixer
+  ] ++ lib.optionals stdenv.isLinux [
+    mesa
+    mtdev
+  ] ++ lib.optionals stdenv.isDarwin [
+    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)
+  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/kiwisolver/default.nix b/nixpkgs/pkgs/development/python-modules/kiwisolver/default.nix
new file mode 100644
index 000000000000..e51324989e66
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/kiwisolver/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, stdenv
+, libcxx
+, cppy
+, setuptools-scm
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "kiwisolver";
+  version = "1.4.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-1BmXUZ/LpKHkbrSi/jG8EvD/lXsrgbrCjbJHRPMz6VU=";
+  };
+
+  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..dd57c8357386
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/klaus/default.nix
@@ -0,0 +1,40 @@
+{ lib, buildPythonPackage, fetchFromGitHub, isPy3k, six, flask, pygments, dulwich, httpauth, humanize, pytest, requests, python-ctags3, mock }:
+
+buildPythonPackage rec {
+  pname = "klaus";
+  version = "1.5.2";
+
+  src = fetchFromGitHub {
+    owner = "jonashaag";
+    repo = pname;
+    rev = version;
+    sha256 = "12b96jgiv9y7zmkqqj3dh0fbbm3ps8gbqk925qrhh56zqjl66kx2";
+  };
+
+  prePatch = ''
+    substituteInPlace runtests.sh \
+      --replace "mkdir -p \$builddir" "mkdir -p \$builddir && pwd"
+  '';
+
+  propagatedBuildInputs = [
+    six flask pygments dulwich httpauth humanize
+  ];
+
+  checkInputs = [
+    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..d40005ef56af
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/klein/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, stdenv
+, attrs
+, buildPythonPackage
+, fetchFromGitHub
+, hyperlink
+, hypothesis
+, incremental
+, python
+, pythonOlder
+, treq
+, tubes
+, twisted
+, typing-extensions
+, werkzeug
+, zope_interface
+}:
+
+buildPythonPackage rec {
+  pname = "klein";
+  version = "unstable-2022-06-26";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "twisted";
+    repo = pname;
+    rev = "d8c2b92a3c77aa64c596696fb6f07172ecf94a74";
+    hash = "sha256-RDZqavkteUbARV78OctZtLIrE4RoYDVAanjwE5i/ZeM=";
+  };
+
+  propagatedBuildInputs = [
+    attrs
+    hyperlink
+    incremental
+    twisted
+    tubes
+    werkzeug
+    zope_interface
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    typing-extensions
+  ];
+
+  checkInputs = [
+    hypothesis
+    treq
+  ];
+
+  checkPhase = ''
+    ${python.interpreter} -m twisted.trial -j $NIX_BUILD_CORES klein
+  '';
+
+  pythonImportsCheck = [
+    "klein"
+  ];
+
+  meta = with lib; {
+    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..c3418b2c5c94
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/kmapper/default.nix
@@ -0,0 +1,49 @@
+{ 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
+  ];
+
+  checkInputs = [
+    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 = [ maintainers.costrouc ];
+  };
+}
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..6ceb71a9e5be
--- /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
+  ];
+
+  checkInputs = [
+    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..be5cfc14e131
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/knack/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, argcomplete
+, colorama
+, jmespath
+, pygments
+, pyyaml
+, six
+, tabulate
+, mock
+, vcrpy
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "knack";
+  version = "0.9.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "7fcab17585c0236885eaef311c01a1e626d84c982aabcac81703afda3f89c81f";
+  };
+
+  propagatedBuildInputs = [
+    argcomplete
+    colorama
+    jmespath
+    pygments
+    pyyaml
+    six
+    tabulate
+  ];
+
+  checkInputs = [
+    mock
+    vcrpy
+    pytest
+  ];
+
+  checkPhase = ''
+    HOME=$TMPDIR pytest .
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/microsoft/knack";
+    description = "A Command-Line Interface framework";
+    platforms = platforms.all;
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
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..be4f4aad5665
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/kombu/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, amqp
+, azure-servicebus
+, buildPythonPackage
+, cached-property
+, case
+, fetchPypi
+, importlib-metadata
+, Pyro4
+, pytestCheckHook
+, pythonOlder
+, pytz
+, vine
+}:
+
+buildPythonPackage rec {
+  pname = "kombu";
+  version = "5.2.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-N87j7nJflOqLsXPqq3wXYCA+pTu+uuImMoYA+dJ5lhA=";
+  };
+
+  propagatedBuildInputs = [
+    amqp
+    vine
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    cached-property
+    importlib-metadata
+  ];
+
+  checkInputs = [
+    azure-servicebus
+    case
+    Pyro4
+    pytestCheckHook
+    pytz
+  ];
+
+  pythonImportsCheck = [
+    "kombu"
+  ];
+
+  meta = with lib; {
+    description = "Messaging library for Python";
+    homepage = "https://github.com/celery/kombu";
+    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..a1b22a727ad8
--- /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.2.1";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "korean_lunar_calendar";
+    sha256 = "0p97r21298ipgvsqh978aq2n6cvybzp8bskcvj15mm1f76qm9khj";
+  };
+
+  # 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/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/kubernetes/default.nix b/nixpkgs/pkgs/development/python-modules/kubernetes/default.nix
new file mode 100644
index 000000000000..9ed7f3d23d39
--- /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 = "24.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "kubernetes-client";
+    repo = "python";
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-rRr73UGhLzpznpNKHCj8LReMk2wOpIoxrSzitl9J+Pg=";
+  };
+
+  propagatedBuildInputs = [
+    adal
+    certifi
+    google-auth
+    python-dateutil
+    pyyaml
+    requests
+    requests-oauthlib
+    setuptools
+    six
+    urllib3
+    websocket-client
+  ];
+
+  pythonImportsCheck = [
+    "kubernetes"
+  ];
+
+  checkInputs = [
+    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 SuperSandro2000 ];
+  };
+}
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..9b0b241c5ed1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/labelbox/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, backoff
+, backports-datetime-fromisoformat
+, buildPythonPackage
+, dataclasses
+, fetchFromGitHub
+, google-api-core
+, jinja2
+, ndjson
+, pillow
+, pydantic
+, pytest-cases
+, pytestCheckHook
+, pythonOlder
+, rasterio
+, requests
+, shapely
+}:
+
+buildPythonPackage rec {
+  pname = "labelbox";
+  version = "3.24.1";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "Labelbox";
+    repo = "labelbox-python";
+    rev = "refs/tags/v.${version}";
+    sha256 = "sha256-pcIbCtVOr6pwodgNv8aGZ+k2Z9cQPCQm1UBJWJAlj/o=";
+  };
+
+  propagatedBuildInputs = [
+    backoff
+    backports-datetime-fromisoformat
+    dataclasses
+    google-api-core
+    jinja2
+    ndjson
+    pillow
+    pydantic
+    rasterio
+    requests
+    shapely
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py --replace "pydantic==1.8" "pydantic>=1.8"
+  '';
+
+  checkInputs = [
+    pytest-cases
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # Requires network access
+    "tests/integration"
+  ];
+
+  pythonImportsCheck = [ "labelbox" ];
+
+  meta = with lib; {
+    description = "Platform API for LabelBox";
+    homepage = "https://github.com/Labelbox/labelbox-python";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ rakesh4g ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/labgrid/0001-serialdriver-remove-pyserial-version-check.patch b/nixpkgs/pkgs/development/python-modules/labgrid/0001-serialdriver-remove-pyserial-version-check.patch
new file mode 100644
index 000000000000..d3e3082b352d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/labgrid/0001-serialdriver-remove-pyserial-version-check.patch
@@ -0,0 +1,33 @@
+From 75baa1751973378cb96fb204b0a18a74e5caa2d1 Mon Sep 17 00:00:00 2001
+From: Rouven Czerwinski <r.czerwinski@pengutronix.de>
+Date: Wed, 17 Feb 2021 14:03:20 +0100
+Subject: [PATCH] serialdriver: remove pyserial version check
+
+This check isn't required on NixOS, since pyserial within NixOS already
+contains the patches.
+
+Signed-off-by: Rouven Czerwinski <r.czerwinski@pengutronix.de>
+---
+ labgrid/driver/serialdriver.py | 6 ------
+ 1 file changed, 6 deletions(-)
+
+diff --git a/labgrid/driver/serialdriver.py b/labgrid/driver/serialdriver.py
+index 126f674e..59a92269 100644
+--- a/labgrid/driver/serialdriver.py
++++ b/labgrid/driver/serialdriver.py
+@@ -27,12 +27,6 @@ class SerialDriver(ConsoleExpectMixin, Driver, ConsoleProtocol):
+         bindings = {"port": "SerialPort", }
+     else:
+         bindings = {"port": {"SerialPort", "NetworkSerialPort"}, }
+-    if version.parse(serial.__version__) != version.Version('3.4.0.1'):
+-        message = ("The installed pyserial version does not contain important RFC2217 fixes.\n"
+-                   "You can install the labgrid fork via:\n"
+-                   "pip uninstall pyserial\n"
+-                   "pip install https://github.com/labgrid-project/pyserial/archive/v3.4.0.1.zip#egg=pyserial\n")  # pylint: disable=line-too-long
+-        warnings.warn(message)
+ 
+     txdelay = attr.ib(default=0.0, validator=attr.validators.instance_of(float))
+     timeout = attr.ib(default=3.0, validator=attr.validators.instance_of(float))
+-- 
+2.30.0
+
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..2032eb33d60c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/labgrid/default.nix
@@ -0,0 +1,77 @@
+{ ansicolors
+, attrs
+, autobahn
+, buildPythonPackage
+, fetchFromGitHub
+, jinja2
+, lib
+, mock
+, packaging
+, pexpect
+, psutil
+, pyserial
+, pytestCheckHook
+, pytest-dependency
+, pytest-mock
+, pyudev
+, pyusb
+, pyyaml
+, requests
+, setuptools-scm
+, xmodem
+}:
+
+buildPythonPackage rec {
+  pname = "labgrid";
+  version = "0.4.1";
+
+  src = fetchFromGitHub {
+    owner = "labgrid-project";
+    repo = "labgrid";
+    rev = "v${version}";
+    sha256 = "0ih04lh1q3dysps4vfmk2rhqqrsimssadsxvbxdsnim2yihrrw47";
+  };
+
+  patches = [
+    # Pyserial within Nixpkgs already includes the necessary fix, remove the
+    # pyserial version check from labgrid.
+    ./0001-serialdriver-remove-pyserial-version-check.patch
+  ];
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  propagatedBuildInputs = [
+    ansicolors
+    attrs
+    autobahn
+    jinja2
+    packaging
+    pexpect
+    pyserial
+    pyudev
+    pyusb
+    pyyaml
+    requests
+    xmodem
+  ];
+
+  preBuild = ''
+    export SETUPTOOLS_SCM_PRETEND_VERSION="${version}"
+  '';
+
+  checkInputs = [
+    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..5eaeeba9a06d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/labmath/default.nix
@@ -0,0 +1,21 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "labmath";
+  version = "2.2.0";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-dzJ4szPxnck0Cgc5IEp5FBmHvIyAC0rqKRVrkt20ntQ=";
+  };
+
+  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/langcodes/default.nix b/nixpkgs/pkgs/development/python-modules/langcodes/default.nix
new file mode 100644
index 000000000000..e3454acd5cd9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/langcodes/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, marisa-trie
+, pythonOlder
+, fetchPypi
+, poetry-core
+, pytestCheckHook
+, language-data
+}:
+
+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
+  ];
+
+  checkInputs = [
+    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;
+    maintainers = with maintainers; [ ixxie ];
+  };
+}
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..4eab3bd06e58
--- /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
+  ];
+
+  checkInputs = [
+    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/language-data/default.nix b/nixpkgs/pkgs/development/python-modules/language-data/default.nix
new file mode 100644
index 000000000000..98d4885b1e94
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/language-data/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonApplication
+, fetchFromGitHub
+, marisa-trie
+, poetry-core
+, pythonOlder
+}:
+
+buildPythonApplication 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
+  ];
+
+  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/lark/default.nix b/nixpkgs/pkgs/development/python-modules/lark/default.nix
new file mode 100644
index 000000000000..62123032a5d4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lark/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, python
+, regex
+, pytestCheckHook
+, js2py
+}:
+
+buildPythonPackage rec {
+  pname = "lark";
+  version = "1.1.2";
+
+  src = fetchFromGitHub {
+    owner = "lark-parser";
+    repo = "lark";
+    rev = version;
+    sha256 = "sha256-Y1bDSiFnqAKTlIcd8aAgtc+I3TLnWF8hhQK2ez96TQs=";
+  };
+
+  # Optional import, but fixes some re known bugs & allows advanced regex features
+  propagatedBuildInputs = [ regex ];
+
+  pythonImportsCheck = [
+    "lark"
+    "lark.parsers"
+    "lark.tools"
+    "lark.grammars"
+  ];
+
+  checkInputs = [
+    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/latexcodec/default.nix b/nixpkgs/pkgs/development/python-modules/latexcodec/default.nix
new file mode 100644
index 000000000000..37ffe23b8061
--- /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 ];
+
+  checkInputs = [ 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/launchpadlib/default.nix b/nixpkgs/pkgs/development/python-modules/launchpadlib/default.nix
new file mode 100644
index 000000000000..a5fabd195db2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/launchpadlib/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, httplib2
+, keyring
+, lazr-restfulclient
+, lazr-uri
+, setuptools
+, six
+, testresources
+, wadllib
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "launchpadlib";
+  version = "1.10.16";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0df4b13936f988afd0ee485f40fa6922eab783b48c38ca0108cb73c8788fca80";
+  };
+
+  propagatedBuildInputs = [
+    httplib2
+    keyring
+    lazr-restfulclient
+    lazr-uri
+    setuptools
+    six
+    testresources
+    wadllib
+  ];
+
+  checkInputs = [ pytestCheckHook ];
+
+  preCheck = ''
+    export HOME=$TMPDIR
+  '';
+
+  doCheck = isPy3k;
+
+  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/lazr-restfulclient/default.nix b/nixpkgs/pkgs/development/python-modules/lazr-restfulclient/default.nix
new file mode 100644
index 000000000000..74197621ee17
--- /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.4";
+
+  disabled = isPy27; # namespace is broken for python2
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "bf0fd6b2749b3a2d02711f854c9d23704756f7afed21fb5d5b9809d72aa6d087";
+  };
+
+  propagatedBuildInputs = [ distro httplib2 oauthlib setuptools six wadllib ];
+
+  # E   ModuleNotFoundError: No module named 'lazr.uri'
+  doCheck = false;
+  checkInputs = [ 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..b10ad25972b5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lazr/config.nix
@@ -0,0 +1,13 @@
+{ buildPythonPackage, fetchPypi, lazr_delegates }:
+
+buildPythonPackage rec {
+  pname = "lazr.config";
+  version = "2.2.3";
+
+  propagatedBuildInputs = [ lazr_delegates ];
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b74a73f8b63e6dc6732fc1f3d88e2f236596ddf089ef6e1794ece060e8cfabe1";
+  };
+}
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..40e2e47d517d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lazr/delegates.nix
@@ -0,0 +1,15 @@
+{ buildPythonPackage, fetchPypi, nose, zope_interface }:
+
+buildPythonPackage rec {
+  pname = "lazr.delegates";
+  version = "2.0.4";
+
+  propagatedBuildInputs = [ nose zope_interface ];
+
+  doCheck = false;  # cannot import name 'ClassType' from 'types'
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1rdnl85j9ayp8n85l0ciip621j9dcziz5qnmv2m7krgwgcn31vfx";
+  };
+}
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..0619a62fa32d
--- /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.7.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d609c75b986def706743cdebe5e47553f4a5a1da9c5ff66d76013ef396b5a8a4";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml --replace ",<6.0" ""
+    substituteInPlace setup.cfg --replace ",<6.0" ""
+  '';
+
+  checkInputs = [
+    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..8cfd377a4efa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lazy_import/default.nix
@@ -0,0 +1,35 @@
+{ lib, buildPythonPackage, fetchPypi
+, pytest
+, pytest-xdist
+, six }:
+
+buildPythonPackage rec {
+  pname = "lazy_import";
+  version = "0.2.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0gca9xj60qr3aprj9qdc66crr4r7hl8wzv6gc9y40nclazwawj91";
+  };
+
+  checkInputs = [
+    pytest
+    pytest-xdist
+  ];
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  checkPhase = ''
+    cd lazy_import
+    pytest --boxed
+  '';
+
+  meta = with lib; {
+    description = "lazy_import provides a set of functions that load modules, and related attributes, in a lazy fashion.";
+    homepage = "https://github.com/mnmelo/lazy_import";
+    license = licenses.gpl3;
+    maintainers = [ maintainers.marenz ];
+  };
+}
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..0683794eda50
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lc7001/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, cryptography
+, fetchPypi
+, pythonOlder
+, poetry-core
+}:
+
+buildPythonPackage rec {
+  pname = "lc7001";
+  version = "1.0.5";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-I4I3vwW1kJsgLFPMGpe9hkD3iEeC3AqI4pCi6SCWPx4=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  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/ldap/default.nix b/nixpkgs/pkgs/development/python-modules/ldap/default.nix
new file mode 100644
index 000000000000..ceaf4f6bf83a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ldap/default.nix
@@ -0,0 +1,40 @@
+{ buildPythonPackage, fetchPypi
+, pyasn1, pyasn1-modules
+, pythonAtLeast, pytestCheckHook
+, openldap, cyrus_sasl, lib, stdenv }:
+
+buildPythonPackage rec {
+  pname = "python-ldap";
+  version = "3.4.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-sWRwoJg6rwmgD/uPQLaaJEbz0L5jmiKSVrzjgfyyaPc=";
+  };
+
+  propagatedBuildInputs = [ pyasn1 pyasn1-modules ];
+
+  checkInputs = [ pytestCheckHook ];
+  buildInputs = [ openldap cyrus_sasl ];
+
+  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 = lib.optionals (pythonAtLeast "3.9") [
+    # See https://github.com/python-ldap/python-ldap/issues/407
+    "test_simple_bind_noarg"
+  ];
+
+  doCheck = !stdenv.isDarwin;
+
+  meta = with lib; {
+    description = "Python modules for implementing LDAP clients";
+    homepage = "https://www.python-ldap.org/";
+    license = licenses.psfl;
+  };
+}
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..cf82b166ec6d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ldap3/default.nix
@@ -0,0 +1,21 @@
+{ lib, fetchPypi, buildPythonPackage, pyasn1 }:
+
+buildPythonPackage rec {
+  pname = "ldap3";
+  version = "2.9.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f3e7fc4718e3f09dda568b57100095e0ce58633bcabbed8667ce3f8fbaa4229f";
+  };
+
+  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;
+  };
+}
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..3e1358cd8f22
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ldapdomaindump/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildPythonPackage, fetchPypi, dnspython, future, ldap3 }:
+
+buildPythonPackage rec {
+  pname = "ldapdomaindump";
+  version = "0.9.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "10cis8cllpa9qi5qil9k7521ag3921mxwg2wj9nyn0lk41rkjagc";
+  };
+
+  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/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..a3cb21c10972
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ldappool/default.nix
@@ -0,0 +1,32 @@
+{ lib, buildPythonPackage, fetchPypi
+, pbr, ldap, prettytable, 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 = [ ldap prettytable ];
+
+  checkInputs = [ 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..f7b5e7cf96b8
--- /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;
+    sha256 = "sha256-jEnrGTddSqs+W4NYYGFODLF+VrtaIOGHSAj6W+xno1g=";
+  };
+
+  propagatedBuildInputs = [
+    passlib
+    pyparsing
+    six
+    twisted
+    zope_interface
+  ] ++ twisted.optional-dependencies.tls;
+
+  checkInputs = [
+    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; [ SuperSandro2000 ];
+  };
+}
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..af2cb219cdbd
--- /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 ];
+
+  checkInputs = [
+    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..fa71abd735e7
--- /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.4";
+
+  # fetchPypi doesn't include files required for tests
+  src = fetchFromGitHub {
+    owner = "mohanson";
+    repo = "leb128";
+    rev = "v${version}";
+    sha256 = "040l6fxyzqal841kirf783kk1840gcy1gjd374jfr46v96qc8scm";
+  };
+
+  checkInputs = [ 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/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..b52a8e5b4c8e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ledgerblue/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, ecpy
+, fetchPypi
+, future
+, hidapi
+, pillow
+, protobuf
+, pycrypto
+, pycryptodomex
+, pythonOlder
+, python-u2flib-host
+, websocket-client
+}:
+
+buildPythonPackage rec {
+  pname = "ledgerblue";
+  version = "0.1.42";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-UNquetZ1sCLO9T5p5b3jTSu+52xuc5XdyHNKsvvPdck=";
+  };
+
+  propagatedBuildInputs = [
+    ecpy
+    future
+    hidapi
+    pillow
+    protobuf
+    pycrypto
+    pycryptodomex
+    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/ledgerwallet/default.nix b/nixpkgs/pkgs/development/python-modules/ledgerwallet/default.nix
new file mode 100644
index 000000000000..cf2be98f922a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ledgerwallet/default.nix
@@ -0,0 +1,51 @@
+{ lib, stdenv
+, fetchFromGitHub
+, fetchpatch
+, buildPythonPackage
+, cryptography
+, click
+, construct
+, ecdsa
+, hidapi
+, intelhex
+, pillow
+, protobuf
+, requests
+, tabulate
+, AppKit
+}:
+
+buildPythonPackage rec {
+  pname = "ledgerwallet";
+  version = "0.1.2";
+
+  src = fetchFromGitHub {
+    owner = "LedgerHQ";
+    repo = "ledgerctl";
+    rev = "v${version}";
+    sha256 = "0fb93h2wxm9as9rsywlgz2ng4wrlbjphn6mgbhj6nls2i86rrdxk";
+  };
+
+  patches = [
+    (fetchpatch {
+      # Fix removed function in construct library
+      url = "https://github.com/LedgerHQ/ledgerctl/commit/fd23d0e14721b93789071e80632e6bd9e47c1256.patch";
+      sha256 = "sha256-YNlENguPQW5FNFT7mqED+ghF3TJiKao4H+56Eu+j+Eo=";
+      excludes = [ "setup.py" ];
+    })
+  ];
+
+  buildInputs = lib.optionals stdenv.isDarwin [ AppKit ];
+  propagatedBuildInputs = [
+    cryptography click construct ecdsa hidapi intelhex pillow protobuf requests tabulate
+  ];
+
+  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 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/lektor/default.nix b/nixpkgs/pkgs/development/python-modules/lektor/default.nix
new file mode 100644
index 000000000000..0749a5470646
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lektor/default.nix
@@ -0,0 +1,83 @@
+{ lib
+, babel
+, buildPythonPackage
+, click
+, exifread
+, fetchFromGitHub
+, filetype
+, flask
+, inifile
+, jinja2
+, marshmallow
+, marshmallow-dataclass
+, mistune
+, pip
+, pyopenssl
+, pytest-click
+, pytest-mock
+, pytest-pylint
+, pytestCheckHook
+, pythonOlder
+, python-slugify
+, requests
+, setuptools
+, watchdog
+, werkzeug
+}:
+
+buildPythonPackage rec {
+  pname = "lektor";
+  version = "3.3.5";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "lektor";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-i3SuvRREuq0EENDtXjQegdmz30RmH1HVqBwdjq/mkTM=";
+  };
+
+  propagatedBuildInputs = [
+    babel
+    click
+    exifread
+    filetype
+    flask
+    inifile
+    jinja2
+    marshmallow
+    marshmallow-dataclass
+    mistune
+    pip
+    pyopenssl
+    python-slugify
+    requests
+    setuptools
+    watchdog
+    werkzeug
+  ];
+
+  checkInputs = [
+    pytest-click
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "lektor"
+  ];
+
+  disabledTests = [
+    # Test requires network access
+    "test_path_installed_plugin_is_none"
+  ];
+
+  meta = with lib; {
+    description = "A static content management system";
+    homepage = "https://www.getlektor.com/";
+    license = licenses.bsd0;
+    maintainers = with maintainers; [ costrouc ];
+  };
+}
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..24c4f11b6759
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/levenshtein/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, cmake
+, cython
+, pytestCheckHook
+, rapidfuzz
+, rapidfuzz-cpp
+, scikit-build
+}:
+
+buildPythonPackage rec {
+  pname = "levenshtein";
+  version = "0.20.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "maxbachmann";
+    repo = "Levenshtein";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-zVYfErh9tts3yPgXqqeX6xp8o+gLd7nN64+Ml6YZfjE=";
+  };
+
+  nativeBuildInputs = [
+    cmake
+    cython
+    scikit-build
+  ];
+
+  dontUseCmakeConfigure = true;
+
+  buildInputs = [
+    rapidfuzz-cpp
+  ];
+
+  propagatedBuildInputs = [
+    rapidfuzz
+  ];
+
+  checkInputs = [
+    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..0e9cf69ea8c0
--- /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 ];
+
+  checkInputs = [ 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..1aa0346795ee
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/libagent/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, fetchFromGitHub
+, bech32
+, buildPythonPackage
+, cryptography
+, ed25519
+, ecdsa
+, 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}";
+    sha256 = "sha256-RISAy0efdatr9u4CWNRGnlffkC8ksw1NyRpJWKwqz+s=";
+  };
+
+  propagatedBuildInputs = [
+    unidecode
+    backports-shutil-which
+    configargparse
+    python-daemon
+    pymsgbox
+    ecdsa
+    ed25519
+    mnemonic
+    semver
+    pynacl
+    bech32
+    cryptography
+  ];
+
+  checkInputs = [ 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..8985e8fbcf51
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/libais/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchPypi,
+  six, pytest, pytest-runner, pytest-cov, coverage
+}:
+buildPythonPackage rec {
+  pname = "libais";
+  version = "0.17";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0pyka09h8nb0vlzh14npq4nxmzg1046lr3klgn97dsf5k0iflapb";
+  };
+
+  # data files missing
+  doCheck = false;
+
+  checkInputs = [ pytest pytest-runner pytest-cov coverage ];
+  propagatedBuildInputs = [ six ];
+
+  meta = with lib; {
+    homepage = "https://github.com/schwehr/libais";
+    description = "Library for decoding maritime Automatic Identification System messages";
+    license = licenses.asl20;
+    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..aafe92e73089
--- /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 = "4.0";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "Changaco";
+    repo = "python-${pname}";
+    rev = version;
+    sha256 = "1ar7lj1lpisklq2q07d95yhlbfq25g9g61hcj8whj17mq8vrvml1";
+  };
+
+  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"
+  ];
+
+  checkInputs = [
+    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..494e786e9784
--- /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;
+    sha256 = "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/libcloud/default.nix b/nixpkgs/pkgs/development/python-modules/libcloud/default.nix
new file mode 100644
index 000000000000..62cd5e3b3e52
--- /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.6.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-SjuRQQM3mOT7B4hv8mJU5jXgIqy91wg3XqxvVuMjUGw=";
+  };
+
+  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..d763c52d8191
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/libcst/default.nix
@@ -0,0 +1,90 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, hypothesis
+, libiconv
+, pytestCheckHook
+, python
+, pythonOlder
+, pyyaml
+, rustPlatform
+, setuptools-rust
+, setuptools-scm
+, typing-extensions
+, typing-inspect
+}:
+
+buildPythonPackage rec {
+  pname = "libcst";
+  version = "0.4.7";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "instagram";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-YrGajxs8t8PU4XRkFlhwtxoa9pzpKPXq8ZvN/uqftlE=";
+  };
+
+  cargoDeps = rustPlatform.fetchCargoTarball {
+    inherit src;
+    sourceRoot = "source/${cargoRoot}";
+    name = "${pname}-${version}";
+    hash = "sha256-V/WHZVvh8HtD8IUNk3V4e8/E2A8DebqY5i/lS1X6x3o=";
+  };
+
+  cargoRoot = "native";
+
+  postPatch = ''
+    # test try to format files, which isn't necessary when consuming releases
+    sed -i libcst/codegen/generate.py \
+      -e '/ufmt/c\        pass'
+  '';
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-rust
+    setuptools-scm
+    rustPlatform.cargoSetupHook
+  ] ++ (with rustPlatform; [ rust.cargo rust.rustc ]);
+
+  buildInputs = lib.optionals stdenv.isDarwin [ libiconv ];
+
+  propagatedBuildInputs = [
+    typing-extensions
+    typing-inspect
+    pyyaml
+  ];
+
+  checkInputs = [
+    hypothesis
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    ${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";
+    license = with licenses; [ mit asl20 psfl ];
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..2807804b77d9
--- /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;
+    sha256 = "sha256-6coAak3ySIpgvZp0ABHulI2BkEviNk8BflYBaVCPVg8=";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./fix-paths.patch;
+      libevdev = lib.getLib pkgs.libevdev;
+    })
+  ];
+
+  checkInputs = [ 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/libgpuarray/default.nix b/nixpkgs/pkgs/development/python-modules/libgpuarray/default.nix
new file mode 100644
index 000000000000..89a83df42684
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/libgpuarray/default.nix
@@ -0,0 +1,85 @@
+{ stdenv
+, lib
+, addOpenGLRunpath
+, buildPythonPackage
+, fetchFromGitHub
+, cmake
+, cython
+, numpy
+, six
+, nose
+, Mako
+, cudaSupport ? false, 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/liblarch/default.nix b/nixpkgs/pkgs/development/python-modules/liblarch/default.nix
new file mode 100644
index 000000000000..3700ebb85dde
--- /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}";
+    sha256 = "sha256-A2qChe2z6rAhjRVX5VoHQitebf/nMATdVZQgtlquuYg=";
+  };
+
+  checkInputs = [
+    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..90533cc30206
--- /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 = teams.determinatesystems.members;
+  };
+}
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..7ced26888b80
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/libnacl/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, libsodium
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "libnacl";
+  version = "1.7.2";
+
+  src = fetchFromGitHub {
+    owner = "saltstack";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-nttR9PQimhqd2pByJ5IJzJ4RmSI4y7lcX7a7jcK+vqc=";
+  };
+
+  patches = [
+    # Fixes build on 32-bit platforms
+    (fetchpatch {
+      name = "fix-crypto_kdf_derive_from_key-32bit.patch";
+      url = "https://github.com/saltstack/libnacl/commit/e8a1f95ee1d4d0806fb6aee793dcf308b05d485d.patch";
+      sha256 = "sha256-z6TAVNfPcuWZ/hRgk6Aa8I1IGzne7/NYnUOOQ3TjGVU=";
+    })
+  ];
+
+  buildInputs = [ libsodium ];
+
+  postPatch =
+    let soext = stdenv.hostPlatform.extensions.sharedLibrary; in
+    ''
+      substituteInPlace "./libnacl/__init__.py" --replace \
+        "ctypes.cdll.LoadLibrary('libsodium${soext}')" \
+        "ctypes.cdll.LoadLibrary('${libsodium}/lib/libsodium${soext}')"
+    '';
+
+  checkInputs = [ 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/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..3f7eaad8ce81
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/libpyfoscam/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "libpyfoscam";
+  version = "1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c274cafd2c6493ab397fe9f0f8aae0b2c35c7c661fe76dde3bd2f1cd56b8fc32";
+  };
+
+  # tests need access to a camera
+  doCheck = false;
+
+  pythonImportsCheck = [ "libpyfoscam" ];
+
+  meta = with lib; {
+    description = "Python Library for Foscam IP Cameras";
+    homepage = "https://github.com/viswa-swami/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..db9f14a5a80a
--- /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
+  ];
+
+  checkInputs = [
+    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/librosa/default.nix b/nixpkgs/pkgs/development/python-modules/librosa/default.nix
new file mode 100644
index 000000000000..d12087e59f3f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/librosa/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, joblib
+, matplotlib
+, six
+, scikit-learn
+, decorator
+, audioread
+, resampy
+, soundfile
+, pooch
+}:
+
+buildPythonPackage rec {
+  pname = "librosa";
+  version = "0.9.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-W1drXv3OQo6QvJiL3VqVPRKnJ+X5MfMNdMU7Y6u+PIk=";
+  };
+
+  propagatedBuildInputs = [ joblib matplotlib six scikit-learn decorator audioread resampy soundfile pooch ];
+
+  # No tests
+  # 1. Internet connection is required
+  # 2. Got error "module 'librosa' has no attribute 'version'"
+  doCheck = false;
+
+  # check that import works, this allows to capture errors like https://github.com/librosa/librosa/issues/1160
+  pythonImportsCheck = [ "librosa" ];
+
+  meta = with lib; {
+    description = "Python module for audio and music processing";
+    homepage = "http://librosa.github.io/";
+    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..6994c8abca4b
--- /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;
+    sha256 = "sha256-VwpZ1RY6Sul7xvWY7ZoOxZ7KgbRmKRwcVdF9e2b3f6Q=";
+  };
+
+  checkInputs = [
+    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..5cc36906610b
--- /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.21.0";
+
+  src = fetchFromGitHub {
+    owner = "sass";
+    repo = "libsass-python";
+    rev = version;
+    sha256 = "sha256-4doz3kkRlyfVfeUarYw2tcybeDVeE2jpgmHxFJsPiVc=";
+  };
+
+  buildInputs = [ libsass ];
+
+  propagatedBuildInputs = [ six ];
+
+  preBuild = ''
+    export SYSTEM_SASS=true;
+  '';
+
+  checkInputs = [
+    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; [ SuperSandro2000 ];
+  };
+}
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..588ebfcd1e95
--- /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;
+    sha256 = "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/libsoundtouch/default.nix b/nixpkgs/pkgs/development/python-modules/libsoundtouch/default.nix
new file mode 100644
index 000000000000..edee7a625366
--- /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
+  ];
+
+  checkInputs = [
+    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..199f467fbbca
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/libtmux/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, buildPythonPackage
+, poetry-core
+, pytestCheckHook
+, procps
+, tmux
+}:
+
+buildPythonPackage rec {
+  pname = "libtmux";
+  version = "0.13.0";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "tmux-python";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-u08lxVMuyO5CwFbmxn69QqdSWcvGaSMZgizRJlsHa0k=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  checkInputs = [
+    procps
+    tmux
+
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = lib.optionals stdenv.isDarwin [ "--ignore=tests/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..da84d890eced
--- /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.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5792a9defee40f15d330a40d9b1800545c32e47ba7fc66b6f28f133c9fcc8538";
+  };
+
+  postPatch = ''
+    substituteInPlace usb1/_libusb1.py --replace \
+      "ctypes.util.find_library(base_name)" \
+      "'${libusb1}/lib/libusb-1.0${stdenv.hostPlatform.extensions.sharedLibrary}'"
+  '';
+
+  buildInputs = [ libusb1 ];
+
+  checkInputs = [ 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..5fb33fa54774
--- /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;
+    sha256 = "sha256-p0wtSB+QXAERf+57MMb8cqWoy1bG3XaCpR9GPwYYvJM=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "'pkg-config'" "'$(command -v $PKG_CONFIG)'"
+  '';
+
+  nativeBuildInputs = [
+    pkg-config
+  ];
+
+  buildInputs = [
+    libversion
+  ];
+
+  checkInputs = [
+    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..c24a27e7d300
--- /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 = "8.5.0";
+
+  src = fetchFromGitLab {
+    owner = "libvirt";
+    repo = "libvirt-python";
+    rev = "v${version}";
+    sha256 = "sha256-/OS+qBo0h9jshKDuxKX++cRPAjegImQROb7Uh+imOUA=";
+  };
+
+  nativeBuildInputs = [ pkg-config ];
+  buildInputs = [ libvirt lxml ];
+
+  checkInputs = [ 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/license-expression/default.nix b/nixpkgs/pkgs/development/python-modules/license-expression/default.nix
new file mode 100644
index 000000000000..e1f77e45dcc7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/license-expression/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, boolean-py
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "license-expression";
+  version = "30.0.0";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "nexB";
+    repo = "license-expression";
+    rev = "v${version}";
+    hash = "sha256-tGXNZm9xH8sXa7dtBFsTzGgT+hfbmkwps7breR7KUWU=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  dontConfigure = true;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    boolean-py
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "license_expression"
+  ];
+
+  meta = with lib; {
+    description = "Utility library to parse, normalize and compare License expressions";
+    homepage = "https://github.com/nexB/license-expression";
+    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..1739881ea96d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/life360/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "life360";
+  version = "4.1.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "pnbruckner";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "v+j0DBWQb1JdOu+uxJAdWhzef5zB62z+NSQ+WxpsinA=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "life360"
+  ];
+
+  meta = with lib; {
+    description = "Python module to interact with Life360";
+    homepage = "https://github.com/pnbruckner/life360";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..015417151b7a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lightgbm/default.nix
@@ -0,0 +1,49 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, cmake
+, numpy
+, scipy
+, scikit-learn
+, llvmPackages ? null
+}:
+
+buildPythonPackage rec {
+  pname = "lightgbm";
+  version = "3.3.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5d25d16e77c844c297ece2044df57651139bc3c8ad8c4108916374267ac68b64";
+  };
+
+  nativeBuildInputs = [
+    cmake
+  ];
+
+  dontUseCmakeConfigure = true;
+
+  buildInputs = lib.optional stdenv.cc.isClang [ llvmPackages.openmp ];
+  propagatedBuildInputs = [
+    numpy
+    scipy
+    scikit-learn
+  ];
+
+  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 = with lib; {
+    description = "A fast, distributed, high performance gradient boosting (GBDT, GBRT, GBM or MART) framework";
+    homepage = "https://github.com/Microsoft/LightGBM";
+    license = licenses.mit;
+    maintainers = with maintainers; [ teh costrouc ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/lightning/default.nix b/nixpkgs/pkgs/development/python-modules/lightning/default.nix
new file mode 100644
index 000000000000..f6d21f95dbfc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lightning/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+, jinja2
+, matplotlib
+, numpy
+, requests
+, six
+}:
+
+buildPythonPackage rec {
+  version = "1.2.1";
+  pname = "lightning-python";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3987d7d4a634bdb6db9bcf212cf4d2f72bab5bc039f4f6cbc02c9d01c4ade792";
+  };
+
+  buildInputs = [ pytest ];
+  propagatedBuildInputs = [ jinja2 matplotlib numpy requests six ];
+
+  meta = with lib; {
+    description = "A Python client library for the Lightning data visualization server";
+    homepage = "http://lightning-viz.org";
+    license = licenses.mit;
+  };
+
+}
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..ba937f7700d9
--- /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.20";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-jhffMDhgQ257ZQxvidiRgBSnZvzLJFKNU2NZ8AyGTGc=";
+  };
+
+  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..f5e341fc43aa
--- /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.15";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-FKEUpfHnPwiLwC8fk+6AikviZKX7DBoWpSMxK1cHC2Y=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "lightwave2"
+  ];
+
+  meta = with lib; {
+    description = "Python 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..16a5f01ed7a9
--- /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";
+  };
+
+  checkInputs = [ 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/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..5064f39b991d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/limits/default.nix
@@ -0,0 +1,81 @@
+{ lib
+, buildPythonPackage
+, deprecated
+, fetchFromGitHub
+, hiro
+, packaging
+, pymemcache
+, pymongo
+, pytest-asyncio
+, pytest-lazy-fixture
+, pytestCheckHook
+, pythonOlder
+, redis
+, setuptools
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "limits";
+  version = "2.7.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "alisaifee";
+    repo = pname;
+    rev = 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-TBZElCogPtoR2qX1YjBgpYh99LhrvLHFtr2ogemo9/c=";
+  };
+
+  propagatedBuildInputs = [
+    deprecated
+    packaging
+    setuptools
+    typing-extensions
+  ];
+
+  checkInputs = [
+    hiro
+    pymemcache
+    pymongo
+    pytest-asyncio
+    pytest-lazy-fixture
+    pytestCheckHook
+    redis
+  ];
+
+  postPatch = ''
+    substituteInPlace pytest.ini \
+      --replace "--cov=limits" "" \
+      --replace "-K" ""
+
+    # 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 utilities";
+    homepage = "https://limits.readthedocs.org/";
+    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..7f95f4ae138c
--- /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 = "2022.8.7";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-TRTqhWQSVhjJkd9FLJk1lDwdzyzkeih9zHPSOvTf2oQ=";
+  };
+
+  propagatedBuildInputs = [
+    chardet
+    cryptography
+    feedparser
+    mock
+    pysocks
+    python-dateutil
+    python-gnupg
+  ] ++ lib.optionals (pythonOlder "3.9") [
+    pytz
+  ];
+
+  checkInputs = [
+    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..cafd6d311463
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/line_profiler/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, cython
+, isPyPy
+, ipython
+, python
+, scikit-build
+, cmake
+, pythonOlder
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "line-profiler";
+  version = "3.5.1";
+
+  disabled = pythonOlder "3.6" || isPyPy;
+
+  src = fetchPypi {
+    pname = "line_profiler";
+    inherit version;
+    sha256 = "sha256-d0ACCL+9XUNBk4qaOk+1GU9a9/wjstSWyRN1X4MQ6Lg=";
+  };
+
+  nativeBuildInputs = [
+    cython
+    cmake
+    scikit-build
+  ];
+
+  propagatedBuildInputs = [
+    ipython
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  dontUseCmakeConfigure = true;
+
+  preBuild = ''
+    rm -f _line_profiler.c
+  '';
+
+  checkPhase = ''
+    PYTHONPATH=$out/${python.sitePackages}:$PYTHONPATH cd tests && ${python.interpreter} -m unittest discover -s .
+  '';
+
+  pythonImportsCheck = [
+    "line_profiler"
+  ];
+
+  meta = with lib; {
+    description = "Line-by-line profiler";
+    homepage = "https://github.com/pyutils/line_profiler";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ fridh ];
+  };
+}
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/lingua/default.nix b/nixpkgs/pkgs/development/python-modules/lingua/default.nix
new file mode 100644
index 000000000000..f116df7e2fda
--- /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;
+    sha256 = "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..54f71fe2ec2b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/linkify-it-py/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+, uc-micro-py
+}:
+
+buildPythonPackage rec {
+  pname = "linkify-it-py";
+  version = "2.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "tsutsu3";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-3bgkhIC6tHl5zieiyllvqFCKwLms55m8MGt1xGhQ4Dk=";
+  };
+
+  propagatedBuildInputs = [ uc-micro-py ];
+
+  checkInputs = [ pytestCheckHook ];
+  pythonImportsCheck = [ "linkify_it" ];
+
+  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/linode-api/default.nix b/nixpkgs/pkgs/development/python-modules/linode-api/default.nix
new file mode 100644
index 000000000000..48d5a1e80802
--- /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.0.0";
+  disabled = pythonOlder "3.6";
+
+  # Sources from Pypi exclude test fixtures
+  src = fetchFromGitHub {
+    owner = "linode";
+    repo = "python-linode-api";
+    rev = version;
+    sha256 = "0lqi15vks4fxbki1l7n1bfzygjy3w17d9wchjxvp22ijmas44yai";
+  };
+
+  propagatedBuildInputs = [ requests ];
+
+  checkInputs = [
+    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/liquidctl/default.nix b/nixpkgs/pkgs/development/python-modules/liquidctl/default.nix
new file mode 100644
index 000000000000..37347331b587
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/liquidctl/default.nix
@@ -0,0 +1,69 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, installShellFiles
+, docopt
+, hidapi
+, pyusb
+, smbus-cffi
+, i2c-tools
+, pytestCheckHook
+, colorlog
+}:
+
+buildPythonPackage rec {
+  pname = "liquidctl";
+  version = "1.10.0";
+  disabled = pythonOlder "3.6";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-2mXWih3LchJ/YsjuwHwWse7SNJYx1vxtovl8vasKV4w=";
+  };
+
+  nativeBuildInputs = [ installShellFiles ];
+
+  propagatedBuildInputs = [
+    docopt
+    hidapi
+    pyusb
+    smbus-cffi
+    i2c-tools
+    colorlog
+  ];
+
+  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/.
+  '';
+
+  checkInputs = [ 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/master/CHANGELOG.md";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ arturcygan evils ];
+  };
+}
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..ea490f19fe5d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/littleutils/default.nix
@@ -0,0 +1,25 @@
+{ buildPythonPackage
+, fetchPypi
+, lib
+}:
+
+buildPythonPackage rec {
+  pname = "littleutils";
+  version = "0.2.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0vwijrylppmk0nbddqvn527r9cg3zw8d6zk6r58hslry42jf7jp6";
+  };
+
+  # This tiny package has no unit tests at all
+  doCheck = false;
+  pythonImportsCheck = [ "littleutils" ];
+
+  meta = with lib; {
+    description = "Small collection of Python utility functions";
+    homepage = "https://github.com/alexmojaki/littleutils";
+    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..467d239857af
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/livelossplot/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+, bokeh
+, ipython
+, matplotlib
+, numpy
+, nbconvert
+, nbformat
+}:
+
+buildPythonPackage rec {
+  pname = "livelossplot";
+  version = "0.5.4";
+
+  disabled = pythonOlder "3.6";
+
+  # version number in source is wrong in this release
+  postPatch = ''substituteInPlace ${pname}/version.py --replace "0.5.3" "0.5.4"'';
+
+  src = fetchFromGitHub {
+    owner  = "stared";
+    repo   = pname;
+    rev    = "v${version}";
+    sha256 = "IV6YAidoqVoKvpy+LNNHTPpobiDoGX59bHqJcBtaydk=";
+  };
+
+  propagatedBuildInputs = [ bokeh ipython matplotlib numpy ];
+
+  checkInputs = [ 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..958236606c67
--- /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 ];
+
+  checkInputs = [ 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..53cb71a123b5
--- /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}";
+    sha256 = "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..4dd4c35cc738
--- /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}";
+    sha256 = "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/llfuse/default.nix b/nixpkgs/pkgs/development/python-modules/llfuse/default.nix
new file mode 100644
index 000000000000..497e1e279ebe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/llfuse/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, contextlib2
+, cython
+, fuse
+, pkg-config
+, pytestCheckHook
+, python
+, which
+}:
+
+buildPythonPackage rec {
+  pname = "llfuse";
+  version = "1.4.2";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "python-llfuse";
+    repo = "python-llfuse";
+    rev = "release-${version}";
+    hash = "sha256-TnZnv439fLvg0WM96yx0dPSSz8Mrae6GDC9LiLFrgQ8=";
+  };
+
+  nativeBuildInputs = [ cython pkg-config ];
+
+  buildInputs = [ fuse ];
+
+  propagatedBuildInputs = [ contextlib2 ];
+
+  preConfigure = ''
+    substituteInPlace setup.py \
+        --replace "'pkg-config'" "'${stdenv.cc.targetPrefix}pkg-config'"
+  '';
+
+  preBuild = ''
+    ${python.pythonForBuild.interpreter} setup.py build_cython
+  '';
+
+  # On Darwin, the test requires macFUSE to be installed outside of Nix.
+  doCheck = !stdenv.isDarwin;
+  checkInputs = [ 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";
+    license = licenses.lgpl2Plus;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ bjornfor dotlambda ];
+  };
+}
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..b928fe59c1cd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/llvmlite/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, stdenv
+, fetchPypi
+, buildPythonPackage
+, python
+, llvm
+, pythonOlder
+, isPyPy
+, enum34
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "llvmlite";
+  version = "0.38.1";
+
+  disabled = isPyPy || !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-BiKoYwH8+BzFDX7VtL6+mSwDBYDUE6hEOzKO1PTYJWE=";
+  };
+
+  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..8efc1e3fb12c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lmdb/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, cffi
+, lmdb
+}:
+
+buildPythonPackage rec {
+  pname = "lmdb";
+  version = "1.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "60a11efc21aaf009d06518996360eed346f6000bfc9de05114374230879f992e";
+  };
+
+  buildInputs = [ lmdb ];
+
+  checkInputs = [ 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";
+    license = licenses.openldap;
+    maintainers = with maintainers; [ copumpkin ivan ];
+  };
+}
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..f426d3dd7b4c
--- /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";
+  };
+
+  checkInputs = [
+    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; [ jtojnar ];
+  };
+}
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..8ad0a4adbe74
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/loca/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, pythonOlder, fetchFromSourcehut }:
+
+buildPythonPackage rec {
+  pname = "loca";
+  version = "2.0.1";
+  format = "flit";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromSourcehut {
+    owner = "~cnx";
+    repo = pname;
+    rev = version;
+    sha256 = "1l6jimw3wd81nz1jrzsfw1zzsdm0jm998xlddcqaq0h38sx69w8g";
+  };
+
+  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/localzone/default.nix b/nixpkgs/pkgs/development/python-modules/localzone/default.nix
new file mode 100644
index 000000000000..0fcf15fe9474
--- /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 ];
+
+  checkInputs = [ 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..2004f962098b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/locationsharinglib/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, betamax
+, buildPythonPackage
+, cachetools
+, coloredlogs
+, emoji
+, fetchPypi
+, nose
+, pythonOlder
+, pytz
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "locationsharinglib";
+  version = "4.1.8";
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-69NzKSWpuU0Riwlj6cFC4h/shc/83e1mpq++zxDqftY=";
+  };
+
+  propagatedBuildInputs = [
+    coloredlogs
+    requests
+    cachetools
+    pytz
+  ];
+
+  checkInputs = [
+    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"
+  '';
+
+  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/";
+    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..295c8eaf9790
--- /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 ];
+  checkInputs = [ 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/logfury/default.nix b/nixpkgs/pkgs/development/python-modules/logfury/default.nix
new file mode 100644
index 000000000000..d25278a4e57c
--- /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
+  ];
+
+  checkInputs = [
+    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/logi-circle/default.nix b/nixpkgs/pkgs/development/python-modules/logi-circle/default.nix
new file mode 100644
index 000000000000..4894bfe26290
--- /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
+  ];
+
+  checkInputs = [
+    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..b89fcb25339e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/logical-unification/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, toolz
+, multipledispatch
+, pytestCheckHook
+, pytest-html
+, pytest-benchmark
+}:
+
+buildPythonPackage rec {
+  pname = "logical-unification";
+  version = "0.4.5";
+
+  src = fetchFromGitHub {
+    owner = "pythological";
+    repo = "unification";
+    rev = "707cf4a39e27a4a8bf06b7e7dce7223085574e65";
+    sha256 = "sha256-3wqO0pWWFRQeoGNvbSDdLNYFyjNnv+O++F7+vTBUJoI=";
+  };
+
+  propagatedBuildInputs = [
+    toolz
+    multipledispatch
+  ];
+
+  checkInputs = [
+    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..a1cb1b248ae3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/logilab/common.nix
@@ -0,0 +1,24 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27, unittest2, six }:
+
+buildPythonPackage rec {
+  pname = "logilab-common";
+  version = "1.6.1";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0h0b2vg2xpfbnynrkg2yki4zjpscm6wgm6nhaahb088v98zxqbrk";
+  };
+
+  propagatedBuildInputs = [ unittest2 six ];
+
+  # package supports 3.x but tests require egenix-mx-base which is python 2.x only
+  # and is not currently in nixos
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Python packages and modules used by Logilab ";
+    homepage = "https://www.logilab.org/project/logilab-common";
+    license = licenses.lgpl21;
+  };
+}
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..ca9e5b17be85
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/logilab/constraint.nix
@@ -0,0 +1,22 @@
+{ lib, buildPythonPackage, fetchPypi, logilab_common, six }:
+
+buildPythonPackage rec {
+  pname = "logilab-constraint";
+  version = "0.6.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-Jk6wvvcDEeHfy7dUcjbnzFIeGBYm5tXzCI26yy+t2qs=";
+  };
+
+  propagatedBuildInputs = [
+    logilab_common six
+  ];
+
+
+  meta = with lib; {
+    description = "logilab-database provides some classes to make unified access to different";
+    homepage = "https://www.logilab.org/project/logilab-database";
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/logilab_astng/default.nix b/nixpkgs/pkgs/development/python-modules/logilab_astng/default.nix
new file mode 100644
index 000000000000..dac5862324ab
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/logilab_astng/default.nix
@@ -0,0 +1,24 @@
+{ lib
+, buildPythonPackage
+, fetchurl
+, logilab_common
+}:
+
+buildPythonPackage rec {
+  pname = "logilab-astng";
+  version = "0.24.3";
+
+  src = fetchurl {
+    url = "http://download.logilab.org/pub/astng/${pname}-${version}.tar.gz";
+    sha256 = "0np4wpxyha7013vkkrdy54dvnil67gzi871lg60z8lap0l5h67wn";
+  };
+
+  propagatedBuildInputs = [ logilab_common ];
+
+  meta = with lib; {
+    homepage = "https://www.logilab.org/project/logilab-astng";
+    description = "Python Abstract Syntax Tree New Generation";
+    license = licenses.lgpl2;
+  };
+
+}
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..9c0d88df644d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/loguru/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, stdenv
+, aiocontextvars
+, buildPythonPackage
+, colorama
+, fetchpatch
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "loguru";
+  version = "0.6.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-BmvQZ1jQpRPpg2/ZxrWnW/s/02hB9LmWvGC1R6MJ1Bw=";
+  };
+
+  patches = [
+    (fetchpatch {
+      name = "fix-test-repr-infinite-recursion.patch";
+      url = "https://github.com/Delgan/loguru/commit/4fe21f66991abeb1905e24c3bc3c634543d959a2.patch";
+      hash = "sha256-NUOkgUS28TOazO0txMinFtaKwsi/J1Y7kqjjvMRCnR8=";
+    })
+  ];
+
+  propagatedBuildInputs = lib.optionals (pythonOlder "3.7") [
+    aiocontextvars
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    colorama
+  ];
+
+  disabledTestPaths = lib.optionals stdenv.isDarwin [
+    "tests/test_multiprocessing.py"
+  ];
+
+  disabledTests = [
+    "test_time_rotation_reopening"
+    "test_file_buffering"
+    # Tests are failing with Python 3.10
+    "test_exception_others"
+    ""
+  ] ++ 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; {
+    homepage = "https://github.com/Delgan/loguru";
+    description = "Python logging made (stupidly) simple";
+    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..0a49262647e9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/logutils/default.nix
@@ -0,0 +1,21 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "logutils";
+  version = "0.3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "bc058a25d5c209461f134e1f03cab637d66a7a5ccc12e593db56fbb279899a82";
+  };
+
+  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..4e3ffd255e07
--- /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";
+  };
+
+  checkInputs = [ 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..f5bfef6a0a27
--- /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
+  ];
+
+  checkInputs = [
+    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..75d250ad03da
--- /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; [ costrouc ];
+  };
+}
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..f27897a7e1ed
--- /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.16.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Losant";
+    repo = "losant-rest-python";
+    rev = "v${version}";
+    sha256 = "sha256-s9WPr5sFSyPIDRgRYcD55iRLhaVIvkiDGg/m//6acFY=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  checkInputs = [
+    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/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..36b8c8978954
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lru-dict/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+}:
+
+let
+  pname = "lru-dict";
+  version = "1.1.8";
+in
+buildPythonPackage {
+  inherit pname version;
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-h4vI70Bz5c+5U9/Bz0WF20HouBTAEGq9400A7g0LMRU=";
+  };
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "lru"
+  ];
+
+  meta = with lib; {
+    description = "Fast and memory efficient LRU cache for Python";
+    homepage = "https://github.com/amitdev/lru-dict";
+    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..f1a62b8856d3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lsassy/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, impacket
+, netaddr
+, pypykatz
+, rich
+}:
+
+buildPythonPackage rec {
+  pname = "lsassy";
+  version = "3.1.3";
+
+  src = fetchFromGitHub {
+    owner = "Hackndo";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-h99wqgRNy2GkiertDddFJQN4hv2R26bo72zNwLPR3mk=";
+  };
+
+  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";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..46a5f2952902
--- /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 ];
+
+  checkInputs = [ 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/ludios_wpull/default.nix b/nixpkgs/pkgs/development/python-modules/ludios_wpull/default.nix
new file mode 100644
index 000000000000..0045f4b3e0fa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ludios_wpull/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, chardet
+, dnspython
+, html5-parser
+, lxml
+, namedlist
+, sqlalchemy
+, tornado
+, Yapsy
+, pythonAtLeast
+}:
+
+buildPythonPackage rec {
+  pname = "ludios_wpull";
+  version = "3.0.9";
+
+  # https://github.com/ArchiveTeam/ludios_wpull/issues/20
+  disabled = pythonAtLeast "3.9";
+
+  src = fetchFromGitHub {
+    rev = version;
+    owner = "ArchiveTeam";
+    repo = "ludios_wpull";
+    sha256 = "0j4dir0dgg8pkf4d1znicz6wyyi1wzij50r21z838cycsdr54j4c";
+  };
+
+  propagatedBuildInputs = [ chardet dnspython html5-parser lxml namedlist sqlalchemy tornado Yapsy ];
+
+  # Test suite has tests that fail on all platforms
+  doCheck = false;
+
+  meta = {
+    description = "Web crawler; fork of wpull used by grab-site";
+    homepage = "https://github.com/ArchiveTeam/ludios_wpull";
+    license = lib.licenses.gpl3;
+    maintainers = with lib.maintainers; [ ivan ];
+    broken = lib.versions.major tornado.version != "4";
+  };
+}
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..e14db125fba5
--- /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.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "home-assistant-ecosystem";
+    repo = "python-luftdaten";
+    rev = version;
+    sha256 = "sha256-tYaY/F4mdO5k+Oj+RkNFWP8xqh1xuDyoAKBFzAhamkA=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    httpx
+  ];
+
+  checkInputs = [
+    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..09ab90a3b177
--- /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;
+    sha256 = "sha256-ZifaCjOVhWdXuzi5n6V+6eVN5vrEHKgUdpSOXoMyR18=";
+  };
+
+  checkInputs = [
+    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/lupa/default.nix b/nixpkgs/pkgs/development/python-modules/lupa/default.nix
new file mode 100644
index 000000000000..b2099e162d20
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lupa/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, cython
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "lupa";
+  version = "1.13";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-4dlKwqYw0nECfawsIdFCh3HZ6p1NiPFfIKd4E0DwKk4=";
+  };
+
+  nativeBuildInputs = [ cython ];
+
+  pythonImportsCheck = [ "lupa" ];
+
+  meta = with lib; {
+    description = "Lua in Python";
+    homepage = "https://github.com/scoder/lupa";
+    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..8daee818d9dd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lupupy/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, colorlog
+, pyyaml
+, fetchPypi
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "lupupy";
+  version = "0.1.9";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-UclKPuWcIa1nNFKqPIEnqlnJh0aXP50k2nMbHhT1aFs=";
+  };
+
+  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";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..ebebdd0d9bc9
--- /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
+  ];
+
+  checkInputs = [
+    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..b1e74c9ba606
--- /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;
+    sha256 = "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..4142b0b505aa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lxmf/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, rns
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "lxmf";
+  version = "0.1.7";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "markqvist";
+    repo = "lxmf";
+    rev = "refs/tags/${version}";
+    hash = "sha256-SRDUFDtXJ1ZkX8A4ekF+YSOnxj/vsFsvr3W/LOIuerg=";
+  };
+
+  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";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..f0a9d6ff523a
--- /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.1";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "refs/tags/lxml-${version}";
+    sha256 = "sha256-5MJw3ciXYnfctSNcemJ/QJGKAaYpadvdbFhkc8+pmPM=";
+  };
+
+  # 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..19bb14419a4f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lyricwikia/default.nix
@@ -0,0 +1,23 @@
+{ lib, fetchPypi, buildPythonPackage, pytest-runner, six, beautifulsoup4, requests, }:
+buildPythonPackage rec {
+  pname = "lyricwikia";
+  version = "0.1.11";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0l5lkvr3299x79i7skdiggp67rzgax3s00psd1zqkxfysq27jvc8";
+  };
+
+  buildInputs = [ pytest-runner ];
+  propagatedBuildInputs = [ six beautifulsoup4 requests ];
+  # upstream has no code tests
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/enricobacis/lyricwikia";
+    maintainers = [ maintainers.kmein ];
+    description = "LyricWikia API for song lyrics";
+    license = licenses.mit;
+    platforms = platforms.all;
+  };
+}
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..aaf4e0aa69bc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lz4/default.nix
@@ -0,0 +1,69 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, python
+
+# native inputs
+, pkgconfig
+, setuptools-scm
+
+# tests
+, psutil
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "python-lz4";
+  version = "4.0.1";
+  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}";
+    sha256 = "sha256-hQuZkstsB37pFDWmA0W6qGd7rAer1mun7Z6MxMp0ZmE=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  postPatch = ''
+    sed -i '/pytest-cov/d' setup.py
+  '';
+
+  nativeBuildInputs = [
+    setuptools-scm
+    pkgconfig
+  ];
+
+  pythonImportsCheck = [
+    "lz4"
+    "lz4.block"
+    "lz4.frame"
+    "lz4.stream"
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    psutil
+  ];
+
+  # 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";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ costrouc ];
+  };
+}
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..8e214540b12d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/m2crypto/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, fetchpatch
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, swig2
+, openssl
+, typing
+}:
+
+
+buildPythonPackage rec {
+  version = "0.36.0";
+  pname = "M2Crypto";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1hadbdckmjzfb8qzbkafypin6sakfx35j2qx0fsivh757s7c2hhm";
+  };
+
+  patches = [
+    (fetchpatch {
+      url = "https://github.com/void-linux/void-packages/raw/7946d12eb3d815e5ecd4578f1a6133d948694370/srcpkgs/python-M2Crypto/patches/libressl.patch";
+      sha256 = "0z5qnkndg6ma5f5qqrid5m95i9kybsr000v3fdy1ab562kf65a27";
+    })
+  ];
+  patchFlags = [ "-p0" ];
+
+  nativeBuildInputs = [ swig2 ];
+  buildInputs = [ swig2 openssl ];
+
+  propagatedBuildInputs = lib.optional (pythonOlder "3.5") typing;
+
+  preConfigure = ''
+    substituteInPlace setup.py --replace "self.openssl = '/usr'" "self.openssl = '${openssl.dev}'"
+  '';
+
+  doCheck = false; # another test that depends on the network.
+
+  meta = with lib; {
+    description = "A Python crypto and SSL toolkit";
+    homepage = "https://gitlab.com/m2crypto/m2crypto";
+    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..d85c2196e843
--- /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.2.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "bf90bad66cda1164b17e5ba4a037806d2443f2a4d5ddc9f6a5554a0322aaed99";
+  };
+
+  patches = [
+    # fix tests in python 3.10
+    (fetchpatch {
+      url = "https://github.com/miyakogi/m2r/commit/58ee9cabdadf5e3deb13037f3052238f0f2bffcd.patch";
+      sha256 = "sha256-CN3PWmnk7xsn1wngRHuEWmDTP3HtVNxkFv0xzD2Zjlo=";
+    })
+    ./docutils-0.19-compat.patch
+  ];
+
+  postPatch = ''
+    substituteInPlace tests/test_cli.py \
+      --replace "optional" "positional"
+  '';
+
+  propagatedBuildInputs = [ mistune docutils ];
+
+  checkInputs = [ pygments ];
+
+  meta = with lib; {
+    homepage = "https://github.com/miyakogi/m2r";
+    description = "Markdown to reStructuredText converter";
+    license = licenses.mit;
+    maintainers = with maintainers; [ AndersonTorres SuperSandro2000 ];
+    # 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..e69bf61657fa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/m3u8/default.nix
@@ -0,0 +1,39 @@
+{ lib, buildPythonPackage, fetchFromGitHub, fetchpatch, requests, iso8601, bottle, pytestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "m3u8";
+  version = "0.9.0";
+
+  src = fetchFromGitHub {
+    owner = "globocom";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-EfHhmV2otEgEy2OVohS+DF7dk97GFdWZ4cFCERZBmlA=";
+  };
+
+  patches = [
+    # Fix hardcoded /tmp dir (fix build on Hydra)
+    (fetchpatch {
+      url = "https://github.com/globocom/m3u8/commit/cf7ae5fda4681efcea796cd7c51c02f152c36009.patch";
+      sha256 = "sha256-SEETpIJQddid8D//6DVrSGs/BqDeMOzufE0bBrm+/xY=";
+    })
+  ];
+
+  propagatedBuildInputs = [ requests iso8601 ];
+
+  checkInputs = [ bottle pytestCheckHook ];
+
+  pytestFlagsArray = [
+    "tests/test_parser.py"
+    "tests/test_model.py"
+    "tests/test_variant_m3u8.py"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/globocom/m3u8";
+    description = "Python m3u8 parser";
+    license = licenses.mit;
+    maintainers = with maintainers; [ Scriptkiddi ];
+  };
+}
+
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..ac750b13e390
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mac_alias/default.nix
@@ -0,0 +1,31 @@
+{ lib, buildPythonPackage, fetchPypi
+}:
+
+buildPythonPackage rec {
+  version = "2.2.0";
+  pname = "mac_alias";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0eb84a63f98bf54c2f9fbdc4de956a63e64eb8a4a124143a1c1f5a78326442f0";
+  };
+
+  # 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/macfsevents/default.nix b/nixpkgs/pkgs/development/python-modules/macfsevents/default.nix
new file mode 100644
index 000000000000..0ba4d08ff0d2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/macfsevents/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildPythonPackage, fetchPypi, CoreFoundation, CoreServices }:
+
+buildPythonPackage rec {
+  pname = "MacFSEvents";
+  version = "0.8.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1324b66b356051de662ba87d84f73ada062acd42b047ed1246e60a449f833e10";
+  };
+
+  buildInputs = [ CoreFoundation CoreServices ];
+
+  # Some tests fail under nix build directory
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/malthe/macfsevents";
+    description = "Thread-based interface to file system observation primitives";
+    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..9345573e9a24
--- /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 = [ maintainers.costrouc ];
+    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..aeae43aeee4d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/maestral/default.nix
@@ -0,0 +1,97 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, makePythonPath
+, pythonOlder
+, python
+, click
+, desktop-notifier
+, dropbox
+, fasteners
+, keyring
+, keyrings-alt
+, packaging
+, pathspec
+, Pyro5
+, requests
+, setuptools
+, sdnotify
+, survey
+, watchdog
+, importlib-metadata
+, pytestCheckHook
+, nixosTests
+}:
+
+buildPythonPackage rec {
+  pname = "maestral";
+  version = "1.6.3";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "SamSchott";
+    repo = "maestral";
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-JVzaWwdHAn5JOruLEN9Z2/5eV1oh3J2NQffNI3RqYfA=";
+  };
+
+  format = "pyproject";
+
+  propagatedBuildInputs = [
+    click
+    desktop-notifier
+    dropbox
+    fasteners
+    keyring
+    keyrings-alt
+    packaging
+    pathspec
+    Pyro5
+    requests
+    setuptools
+    sdnotify
+    survey
+    watchdog
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  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"
+  ];
+
+  checkInputs = [
+    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"
+  ];
+
+  pythonImportsCheck = [ "maestral" ];
+
+  passthru.tests.maestral = nixosTests.maestral;
+
+  meta = with lib; {
+    description = "Open-source Dropbox client for macOS and Linux";
+    license = licenses.mit;
+    maintainers = with maintainers; [ peterhoeg sfrijters ];
+    platforms = platforms.unix;
+    homepage = "https://maestral.app";
+  };
+}
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..4d000c7a1672
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/magic-wormhole-mailbox-server/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, six
+, attrs
+, twisted
+, pyopenssl
+, service-identity
+, autobahn
+, treq
+, mock
+}:
+
+buildPythonPackage rec {
+  version = "0.4.1";
+  pname = "magic-wormhole-mailbox-server";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1af10592909caaf519c00e706eac842c5e77f8d4356215fe9c61c7b2258a88fb";
+  };
+
+  propagatedBuildInputs = [
+    attrs
+    six
+    twisted
+    autobahn
+  ] ++ autobahn.optional-dependencies.twisted
+  ++ twisted.optional-dependencies.tls;
+
+  checkInputs = [
+    treq
+    mock
+    twisted
+  ];
+  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";
+    license = licenses.mit;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..a618be999c0b
--- /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 ];
+
+  checkInputs = [ 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; [ SuperSandro2000 ];
+  };
+}
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..38e0b16726a8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/magic-wormhole/default.nix
@@ -0,0 +1,82 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, spake2
+, pynacl
+, six
+, attrs
+, twisted
+, autobahn
+, automat
+, hkdf
+, tqdm
+, click
+, humanize
+, txtorcon
+, nettools
+, mock
+, magic-wormhole-transit-relay
+, magic-wormhole-mailbox-server
+}:
+
+buildPythonPackage rec {
+  pname = "magic-wormhole";
+  version = "0.12.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0q41j99718y7m95zg1vaybnsp31lp6lhyqkbv4yqz5ys6jixh3qv";
+  };
+
+  propagatedBuildInputs = [
+    spake2
+    pynacl
+    six
+    attrs
+    twisted
+    autobahn
+    automat
+    hkdf
+    tqdm
+    click
+    humanize
+    txtorcon
+  ] ++ autobahn.optional-dependencies.twisted
+  ++ twisted.optional-dependencies.tls;
+
+  checkInputs = [
+    mock
+    magic-wormhole-transit-relay
+    magic-wormhole-mailbox-server
+    twisted
+  ];
+
+  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
+  '';
+
+  checkPhase = ''
+    export PATH=$out/bin:$PATH
+    export LANG="en_US.UTF-8"
+    export LC_ALL="en_US.UTF-8"
+    substituteInPlace src/wormhole/test/test_cli.py \
+      --replace 'getProcessOutputAndValue("locale", ["-a"])' 'getProcessOutputAndValue("locale", ["-a"], env=os.environ)' \
+      --replace 'if (os.path.dirname(os.path.abspath(wormhole))' 'if not os.path.abspath(wormhole).startswith("/nix/store") and (os.path.dirname(os.path.abspath(wormhole))' \
+      --replace 'locale_env = dict(LC_ALL=locale, LANG=locale)' 'locale_env = dict(LC_ALL=locale, LANG=locale, LOCALE_ARCHIVE=os.getenv("LOCALE_ARCHIVE"))'
+
+    trial -j$NIX_BUILD_CORES wormhole
+  '';
+
+  meta = with lib; {
+    description = "Securely transfer data between computers";
+    homepage = "https://github.com/magic-wormhole/magic-wormhole";
+    license = licenses.mit;
+    maintainers = with maintainers; [ asymmetric SuperSandro2000 ];
+    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..d6c6108d52be
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/magicgui/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools-scm
+, pytestCheckHook
+, pytest-mypy-plugins
+, 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}";
+    sha256 = "sha256-fVfBQaaT8/lUGqZRXjOPgvkC01Izb8Sxqn7RCqnW9bo=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [ setuptools-scm ];
+  propagatedBuildInputs = [ typing-extensions qtpy pyside2 psygnal docstring-parser ];
+  checkInputs = [ pytestCheckHook pytest-mypy-plugins ];
+
+  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..6151525de1dc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mahotas/default.nix
@@ -0,0 +1,71 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, pillow
+, scipy
+, numpy
+, pytestCheckHook
+, imread
+, freeimage
+, lib
+, stdenv
+}:
+
+buildPythonPackage rec {
+  pname = "mahotas";
+  version = "1.4.12";
+
+  src = fetchFromGitHub {
+    owner = "luispedro";
+    repo = "mahotas";
+    rev = "v${version}";
+    sha256 = "1n19yha1cqyx7hnlici1wkl7n68dh0vbpsyydfhign2c0w9jvg42";
+  };
+
+  patches = [
+    (fetchpatch {
+      name = "fix-freeimage-tests.patch";
+      url = "https://github.com/luispedro/mahotas/commit/08cc4aa0cbd5dbd4c37580d52b822810c03b2c69.patch";
+      sha256 = "0389sz7fyl8h42phw8sn4pxl4wc3brcrj9d05yga21gzil9bfi23";
+      excludes = [ "ChangeLog" ];
+    })
+  ];
+
+  propagatedBuildInputs = [ numpy imread pillow scipy freeimage ];
+  checkInputs = [ 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")'
+  '';
+
+  # 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..da735d9d048d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mailcap-fix/default.nix
@@ -0,0 +1,23 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy36
+}:
+
+buildPythonPackage rec {
+  pname = "mailcap-fix";
+  version = "1.0.1";
+  disabled = isPy36; # this fix is merged into python 3.6
+
+  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..36b1e9f42d14
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mailchecker/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "mailchecker";
+  version = "5.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-d8RG/PSWPHvQy7o9tPLPGrEp0r/Y3JWwWoT3cS4iR38=";
+  };
+
+  # 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";
+    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..7aafe6e61e81
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mailmanclient/default.nix
@@ -0,0 +1,22 @@
+{ lib, buildPythonPackage, fetchPypi, isPy3k, six, httplib2, requests }:
+
+buildPythonPackage rec {
+  pname = "mailmanclient";
+  version = "3.3.3";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "92fe624675e41f41f59de1208e0125dfaa8d062bbe6138bd7cd79e4dd0b6f85e";
+  };
+
+  propagatedBuildInputs = [ six httplib2 requests ];
+
+  meta = with lib; {
+    homepage = "https://www.gnu.org/software/mailman/";
+    description = "REST client for driving Mailman 3";
+    license = licenses.lgpl3;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ globin qyliss ];
+  };
+}
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..147686afb95c
--- /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.5";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-bvS+sH10LkQkH/nAGuk/rvPjPhaR/rArIf9W9CWjFMY=";
+  };
+
+  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/makefun/default.nix b/nixpkgs/pkgs/development/python-modules/makefun/default.nix
new file mode 100644
index 000000000000..030ea2df3161
--- /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.14.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-dwxuRY8e9HMEGFM08daG7iAXVdBhUqh44mRidTQMGB0=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "pytest-runner" ""
+  '';
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  checkInputs = [
+    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/malduck/default.nix b/nixpkgs/pkgs/development/python-modules/malduck/default.nix
new file mode 100644
index 000000000000..7d5998da2e96
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/malduck/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, capstone
+, click
+, cryptography
+, fetchFromGitHub
+, pefile
+, pycryptodomex
+, pyelftools
+, pythonOlder
+, typing-extensions
+, yara-python
+}:
+
+buildPythonPackage rec {
+  pname = "malduck";
+  version = "4.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "CERT-Polska";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-UgpblcZ/Jxl3U4256YIHzly7igNXwhTdFN4HOqZBVbM=";
+  };
+
+  propagatedBuildInputs = [
+    capstone
+    click
+    cryptography
+    pefile
+    pycryptodomex
+    pyelftools
+    typing-extensions
+    yara-python
+  ];
+
+  postPatch = ''
+    substituteInPlace requirements.txt \
+      --replace "pefile==2019.4.18" "pefile"
+  '';
+
+  # Project has no tests. They will come with the next release
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "malduck"
+  ];
+
+  meta = with lib; {
+    description = "Helper for malware analysis";
+    homepage = "https://github.com/CERT-Polska/malduck";
+    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..fd2eac2b2c7e
--- /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";
+  };
+
+  checkInputs = [ 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/manhole/default.nix b/nixpkgs/pkgs/development/python-modules/manhole/default.nix
new file mode 100644
index 000000000000..34be99bc8df5
--- /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;
+
+  checkInputs = [ 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/manimpango/default.nix b/nixpkgs/pkgs/development/python-modules/manimpango/default.nix
new file mode 100644
index 000000000000..f77aa81bbb60
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/manimpango/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, python
+, pkg-config
+, pango
+, cython
+, AppKit
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "manimpango";
+  version = "0.4.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "ManimCommunity";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-ourSUYBAFONdupdsjo/PtwRQpXS7HqLxrHj0Ejr/Wdw=";
+  };
+
+  nativeBuildInputs = [
+    pkg-config
+  ];
+
+  buildInputs = [
+    pango
+  ] ++ lib.optionals stdenv.isDarwin [
+    AppKit
+  ];
+
+  propagatedBuildInputs = [
+    cython
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "--cov --no-cov-on-fail" ""
+  '';
+
+  preBuild = ''
+    ${python.interpreter} setup.py build_ext --inplace
+  '';
+
+  pythonImportsCheck = [
+    "manimpango"
+  ];
+
+  meta = with lib; {
+    description = "Binding for Pango";
+    homepage = "https://github.com/ManimCommunity/ManimPango";
+    license = licenses.mit;
+    maintainers = with maintainers; [ emilytrau ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/manticore/default.nix b/nixpkgs/pkgs/development/python-modules/manticore/default.nix
new file mode 100644
index 000000000000..c645a070e4b1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/manticore/default.nix
@@ -0,0 +1,136 @@
+{ lib
+, buildPythonPackage
+, capstone
+, crytic-compile
+, fetchFromGitHub
+, intervaltree
+, ply
+, prettytable
+, protobuf
+, pyelftools
+, pyevmasm
+, pysha3
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, rlp
+, stdenv
+, unicorn
+, wasm
+, yices
+, z3
+}:
+
+buildPythonPackage rec {
+  pname = "manticore";
+  version = "0.3.7";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "trailofbits";
+    repo = "manticore";
+    rev = version;
+    hash = "sha256-+17VBfAtkZZIi3SF5Num1Uqg3WjIpgbz3Jx65rD5zkM=";
+  };
+
+  propagatedBuildInputs = [
+    crytic-compile
+    intervaltree
+    ply
+    prettytable
+    protobuf
+    pyevmasm
+    pysha3
+    pyyaml
+    rlp
+    wasm
+  ] ++ lib.optionals (stdenv.isLinux) [
+    capstone
+    pyelftools
+    unicorn
+  ];
+
+  postPatch = ''
+    # Python API is not used in the code, only z3 from PATH
+    substituteInPlace setup.py \
+      --replace "z3-solver" "" \
+      --replace "crytic-compile==0.2.2" "crytic-compile>=0.2.2"
+  '';
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    export PATH=${yices}/bin:${z3}/bin:$PATH
+  '';
+
+  disabledTestPaths = [
+    "tests/ethereum" # Enable when solc works again
+    "tests/ethereum_bench"
+  ] ++ lib.optionals (!stdenv.isLinux) [
+    "tests/native"
+    "tests/other/test_locking.py"
+    "tests/other/test_state_introspection.py"
+  ];
+
+  disabledTests = [
+    # Failing tests
+    "test_chmod"
+    "test_timeout"
+    "test_wasm_main"
+    # Slow tests
+    "testmprotectFailSymbReading"
+    "test_ConstraintsForking"
+    "test_resume"
+    "test_symbolic"
+    "test_symbolic_syscall_arg"
+    "test_state_merging"
+    "test_decree"
+    "test_register_comparison"
+    "test_arguments_assertions_armv7"
+    "test_integration_basic_stdout"
+    "test_fclose_linux_amd64"
+    "test_fileio_linux_amd64"
+    "test_arguments_assertions_amd64"
+    "test_ioctl_bogus"
+    "test_ioctl_socket"
+    "test_brk_regression"
+    "test_basic_arm"
+    "test_logger_verbosity"
+    "test_profiling_data"
+    "test_integration_basic_stdin"
+    "test_getchar"
+    "test_ccmp_reg"
+    "test_ld1_mlt_structs"
+    "test_ccmp_imm"
+    "test_try_to_allocate_greater_than_last_space_memory_page_12"
+    "test_not_enough_memory_page_12"
+    "test_PCMPISTRI_30_symbolic"
+    "test_ld1_mlt_structs"
+    "test_time"
+    "test_implicit_call"
+    "test_trace"
+    "test_plugin"
+    # Tests are failing with latest unicorn
+    "Aarch64UnicornInstructions"
+    "test_integration_resume"
+  ];
+
+  pythonImportsCheck = [
+    "manticore"
+  ];
+
+  meta = with lib; {
+    # m.c.manticore:WARNING: Manticore is only supported on Linux. Proceed at your own risk!
+    broken = (stdenv.isLinux && stdenv.isAarch64) || stdenv.isDarwin;
+    description = "Symbolic execution tool for analysis of smart contracts and binaries";
+    homepage = "https://github.com/trailofbits/manticore";
+    changelog = "https://github.com/trailofbits/manticore/releases/tag/${version}";
+    license = licenses.agpl3Only;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ arturcygan ];
+  };
+}
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..7bf02f03895b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/manuel/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, six
+, zope_testing
+}:
+
+buildPythonPackage rec {
+  pname = "manuel";
+  version = "1.12.4";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-A5Wq32mR+SSseVz61Z2l3AYYcyqMxYrQ9HSWWrco9/Q=";
+  };
+
+  propagatedBuildInputs = [ six ];
+  checkInputs = [ 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/mapbox-earcut/default.nix b/nixpkgs/pkgs/development/python-modules/mapbox-earcut/default.nix
new file mode 100644
index 000000000000..009bf2ed653c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mapbox-earcut/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchFromGitHub
+, numpy
+, pybind11
+, pytestCheckHook
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "mapbox-earcut";
+  version = "1.0.0";
+
+  src = fetchFromGitHub {
+    owner = "skogler";
+    repo = "mapbox_earcut_python";
+    rev = "v${version}";
+    sha256 = "m4q2qTL55fkdi3hm75C3/XV9SUQkpJS+B5SEgpPEctk=";
+  };
+
+  nativeBuildInputs = [ setuptools pybind11 ];
+
+  propagatedBuildInputs = [ numpy ];
+
+  checkInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "mapbox_earcut" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/skogler/mapbox_earcut_python";
+    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..84ca6199e2f4
--- /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 ];
+  checkInputs = [ 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..02d98c86c841
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/marisa-trie/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, cython
+, pytestCheckHook
+, hypothesis
+, readme_renderer
+}:
+
+buildPythonPackage rec {
+  pname = "marisa-trie";
+  version = "0.7.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "bbeafb7d92839dc221365340e79d012cb50ee48a1f3f30dd916eb35a8b93db00";
+  };
+
+  nativeBuildInputs = [
+    cython
+  ];
+
+  checkInputs = [
+    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";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ixxie ];
+  };
+}
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..091809d8314b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/markdown-include/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, markdown
+}:
+
+buildPythonPackage rec {
+  pname = "markdown-include";
+  version = "0.7.0";
+  format = "setuptools";
+
+  # only wheel on pypi
+  src = fetchFromGitHub {
+    owner = "cmacmackin";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-2pC0K/Z5l7q6sx4FSM4Pi1/5bt1wLZsqOmcbnE47rVs=";
+  };
+
+  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..f4c83d5df348
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/markdown-it-py/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, attrs
+, buildPythonPackage
+, fetchFromGitHub
+, flit-core
+, linkify-it-py
+, mdurl
+, psutil
+, pytest-benchmark
+, pytest-regressions
+, pytestCheckHook
+, pythonOlder
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "markdown-it-py";
+  version = "2.1.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "executablebooks";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-6UATJho3SuIbLktZtFcDrCTWIAh52E+n5adcgl49un0=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    attrs
+    linkify-it-py
+    mdurl
+  ] ++ lib.optional (pythonOlder "3.8") [
+    typing-extensions
+  ];
+
+  checkInputs = [
+    psutil
+    pytest-benchmark
+    pytest-regressions
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "markdown_it"
+  ];
+
+  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..e95cbe3c4c10
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/markdown-macros/default.nix
@@ -0,0 +1,40 @@
+{ 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
+    (fetchpatch {
+      url = "https://github.com/wnielson/markdown-macros/pull/1.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..7207edb5815c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/markdown/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, importlib-metadata
+, pyyaml
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "markdown";
+  version = "3.3.7";
+
+  disabled = pythonOlder "3.6";
+
+  format = "setuptools";
+
+  src = fetchPypi {
+    pname = "Markdown";
+    inherit version;
+    sha256 = "cbb516f16218e643d8e0a95b309f77eb118cb138d39a4f27851e6a63581db874";
+  };
+
+  propagatedBuildInputs = lib.optionals (pythonOlder "3.10") [
+    importlib-metadata
+  ];
+
+  checkInputs = [ pyyaml ];
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest discover
+  '';
+
+  pythonImportsCheck = [ "markdown" ];
+
+  meta = with lib; {
+    description = "A Python implementation of John Gruber's Markdown with Extension support";
+    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..8b9fa1181452
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/markdown2/default.nix
@@ -0,0 +1,27 @@
+{ lib, buildPythonPackage, fetchFromGitHub, python, pygments }:
+
+buildPythonPackage rec {
+  pname = "markdown2";
+  version = "2.4.1";
+
+  # PyPI does not contain tests, so using GitHub instead.
+  src = fetchFromGitHub {
+    owner = "trentm";
+    repo = "python-markdown2";
+    rev = version;
+    sha256 = "0y7kh9jj8ys00qkfmmyqj63y21g7wn7yr715kj0j1nabs6xbp0y7";
+  };
+
+  checkInputs = [ pygments ];
+
+  checkPhase = ''
+    ${python.interpreter} ./test/test.py
+  '';
+
+  meta = with lib; {
+    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/markdownsuperscript/default.nix b/nixpkgs/pkgs/development/python-modules/markdownsuperscript/default.nix
new file mode 100644
index 000000000000..04e59287a86a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/markdownsuperscript/default.nix
@@ -0,0 +1,31 @@
+{ lib, buildPythonPackage, fetchPypi, markdown,
+  pytest, pytest-runner, pytest-cov, coverage }:
+
+buildPythonPackage rec {
+  pname = "MarkdownSuperscript";
+  version = "2.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "2c255b5959c1f5dd364ae80762bd0a568a0fcc9fd4e4a3d7e7b192e88adf8900";
+  };
+
+  propagatedBuildInputs = [ markdown ];
+
+  postPatch = ''
+    # remove version bounds for Markdown dependency
+    sed 's/\["Markdown.*"\]/["Markdown"]/' -i setup.py
+
+    # remove version bounds for test dependencies
+    sed 's/=.*//' -i requirements/*.txt
+  '';
+
+  checkInputs = [ pytest pytest-runner pytest-cov coverage ];
+
+  meta = with lib; {
+    description = "An extension to the Python Markdown package enabling superscript text";
+    homepage = "https://github.com/jambonrose/markdown_superscript_extension";
+    license = licenses.bsd2;
+    broken = true; # unmaintained in nixpkgs, barely maintained in pypi, added 2020-11-29
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/markerlib/default.nix b/nixpkgs/pkgs/development/python-modules/markerlib/default.nix
new file mode 100644
index 000000000000..7762a970fb1e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/markerlib/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools
+, nose
+}:
+
+buildPythonPackage rec {
+  version = "0.6.0";
+  pname = "markerlib";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "2fdb3939441f5bf4f090b1979a34f84a11d33eed6c0e3995de88ae5c06b6e3ae";
+  };
+
+  buildInputs = [ setuptools ];
+  checkInputs = [ nose ];
+
+  checkPhase = ''
+    nosetests
+  '';
+
+  meta = with lib; {
+    homepage = "https://bitbucket.org/dholth/markerlib/";
+    description = "A compiler for PEP 345 environment markers";
+    license = licenses.mit;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..2a0db14d96e7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/markups/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, docutils
+, fetchPypi
+, importlib-metadata
+, markdown
+, pygments
+, pytestCheckHook
+, python-markdown-math
+, pythonOlder
+, pyyaml
+, textile
+}:
+
+buildPythonPackage rec {
+  pname = "markups";
+  version = "3.1.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "Markups";
+    inherit version;
+    hash = "sha256-q5dHpywcZFdBjrQnbHmHGXfBOmVGGOTxLiofCZD78vw=";
+  };
+
+  propagatedBuildInputs = [
+    docutils
+    markdown
+    pygments
+    python-markdown-math
+    pyyaml
+    textile
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  checkInputs = [
+    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..0c36299b1f12
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/markupsafe/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "markupsafe";
+  version = "2.1.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "MarkupSafe";
+    inherit version;
+    sha256 = "sha256-f5EZfMnkj5idEuTm+8RklcRGY238gbnM9Quw7HS5HUs=";
+  };
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "markupsafe" ];
+
+  meta = with lib; {
+    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..32a490822d2a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/marshmallow-dataclass/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, marshmallow
+, marshmallow-enum
+, pytestCheckHook
+, pythonAtLeast
+, pythonOlder
+, typeguard
+, typing-inspect
+}:
+
+buildPythonPackage rec {
+  pname = "marshmallow-dataclass";
+  version = "8.5.8";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "lovasoa";
+    repo = "marshmallow_dataclass";
+    rev = "v${version}";
+    sha256 = "sha256-3kd/V3U3+/HfUmzwkp3/ChwSjknQ8rIYnTUsRH3WoP4=";
+  };
+
+  propagatedBuildInputs = [
+    marshmallow
+    typing-inspect
+  ];
+
+  checkInputs = [
+    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";
+    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..a7852afb7082
--- /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 ];
+
+  checkInputs = [
+    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 = [ maintainers.costrouc ];
+  };
+}
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..8fc946305bc8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/marshmallow-oneofschema/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, marshmallow
+, pytestCheckHook
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "marshmallow-oneofschema";
+  version = "3.0.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "marshmallow-code";
+    repo = pname;
+    rev = version;
+    hash = "sha256-x0v8WkfjGkP2668QIQiewQViYFDIS2zBWMULcDThWas=";
+  };
+
+  propagatedBuildInputs = [
+    marshmallow
+    setuptools
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "marshmallow_oneofschema"
+  ];
+
+  meta = with lib; {
+    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..6b5394ac2770
--- /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}";
+    sha256 = "sha256-oF5LBuDK4kqsAcKwidju+wFjigjy4CNbJ6bfWpGO1yQ=";
+  };
+
+  propagatedBuildInputs = [
+    marshmallow
+  ];
+
+  checkInputs = [
+    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..e7921a29f54a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/marshmallow-sqlalchemy/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, marshmallow
+, sqlalchemy
+, pytest-lazy-fixture
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "marshmallow-sqlalchemy";
+  version = "0.28.0";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-+2sGaG84/sLqDsU6XuSXkhlAnisiYPm8keS0MQXRl4I=";
+  };
+
+  propagatedBuildInputs = [
+    marshmallow
+    sqlalchemy
+  ];
+
+  pythonImportsCheck = [
+    "marshmallow_sqlalchemy"
+  ];
+
+  checkInputs = [
+    pytest-lazy-fixture
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/marshmallow-code/marshmallow-sqlalchemy";
+    description = "SQLAlchemy integration with marshmallow";
+    license = licenses.mit;
+  };
+
+}
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..5f41a048760a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/marshmallow/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, pytz
+, simplejson
+, packaging
+}:
+
+buildPythonPackage rec {
+  pname = "marshmallow";
+  version = "3.16.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "marshmallow-code";
+    repo = pname;
+    rev = version;
+    hash = "sha256-bR10hYViK7OrAaBpKaeM7S5XyHQZhlGUQTwH/EJ0kME=";
+  };
+
+  propagatedBuildInputs = [
+    packaging
+  ];
+
+  checkInputs = [
+    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";
+    license = licenses.mit;
+    maintainers = with maintainers; [ cript0nauta ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mask-rcnn/default.nix b/nixpkgs/pkgs/development/python-modules/mask-rcnn/default.nix
new file mode 100644
index 000000000000..2ef6ff5c56d9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mask-rcnn/default.nix
@@ -0,0 +1,68 @@
+{ buildPythonPackage
+, cython
+, fetchFromGitHub
+, fetchpatch
+, h5py
+, imgaug
+, ipython
+, keras
+, lib
+, matplotlib
+, numpy
+, opencv3
+, pillow
+, scikitimage
+, scipy
+, tensorflow
+}:
+
+buildPythonPackage rec {
+  pname = "mask-rcnn";
+  version = "2.1";
+
+  src = fetchFromGitHub {
+    owner = "matterport";
+    repo = "Mask_RCNN";
+    rev = "3deaec5d902d16e1daf56b62d5971d428dc920bc";
+    sha256 = "13s3q9yh2q9m9vyksd269mww3bni4q2w7q5l419q70ca075qp8zp";
+  };
+
+  patches = [
+    # Fix for TF2:
+    # https://github.com/matterport/Mask_RCNN/issues/2734
+    (fetchpatch {
+      url = "https://github.com/BupyeongHealer/Mask_RCNN_tf_2.x/commit/7957839fe2b248f2f22c7e991ead12068ddc6cfc.diff";
+      excludes = [ "mrcnn/model.py" ];
+      sha256 = "sha256-70BGrx6X1uJDA2025f0YTlreT2uB3n35yIzuhf+ypVc=";
+    })
+  ];
+
+  # Fix for recent Keras
+  postPatch = ''
+    substituteInPlace mrcnn/model.py \
+      --replace "KE." "KL."
+  '';
+
+  nativeBuildInputs = [ cython ];
+
+  propagatedBuildInputs = [
+    h5py
+    imgaug
+    ipython
+    keras
+    matplotlib
+    numpy
+    opencv3
+    pillow
+    scikitimage
+    scipy
+    tensorflow
+  ];
+
+  meta = with lib; {
+    description = "Mask R-CNN for object detection and instance segmentation on Keras and TensorFlow";
+    homepage = "https://github.com/matterport/Mask_RCNN";
+    license = licenses.mit;
+    maintainers = with maintainers; [ rakesh4g ];
+  };
+}
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..178ed4b8fc06
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mastodon-py/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, blurhash
+, cryptography
+, decorator
+, http-ece
+, python-dateutil
+, python-magic
+, pytz
+, requests
+, six
+, pytestCheckHook
+, pytest-mock
+, pytest-vcr
+, requests-mock
+}:
+
+buildPythonPackage rec {
+  pname = "mastodon-py";
+  version = "1.5.1";
+
+  src = fetchFromGitHub {
+    owner = "halcy";
+    repo = "Mastodon.py";
+    rev = version;
+    sha256 = "044iqydw69a6xpz2hdjv1fc6a9b7bqdpnh3b33xqbks9d2415ddm";
+  };
+
+  postPatch = ''
+    sed -i '/^addopts/d' setup.cfg
+  '';
+
+  propagatedBuildInputs = [
+    blurhash
+    cryptography
+    decorator
+    http-ece
+    python-dateutil
+    python-magic
+    pytz
+    requests
+    six
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    pytest-mock
+    pytest-vcr
+    requests-mock
+  ];
+
+  pythonImportsCheck = [ "mastodon" ];
+
+  meta = with lib; {
+    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..cd11b56ac267
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mat2/default.nix
@@ -0,0 +1,106 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, python
+, 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.0";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitLab {
+    domain = "0xacab.org";
+    owner = "jvoisin";
+    repo = "mat2";
+    rev = version;
+    hash = "sha256-H3l8w2F+ZcJ1P/Dg0ZVBJPUK0itLocL7a0jeSrG3Ws8=";
+  };
+
+  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
+    # fix gobject-introspection typelib path for Nautilus extension
+    (substituteAll {
+      src = ./fix_poppler.patch;
+      poppler_path = "${poppler_gi}/lib/girepository-1.0";
+    })
+  ] ++ lib.optionals (stdenv.hostPlatform.isLinux) [
+    (substituteAll {
+      src = ./bubblewrap-path.patch;
+      bwrap = "${bubblewrap}/bin/bwrap";
+    })
+  ];
+
+  postPatch = ''
+    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"
+    install -Dm 444 nautilus/mat2.py -t "$out/share/nautilus-python/extensions"
+    buildPythonPath "$out $pythonPath $propagatedBuildInputs"
+    patchPythonScript "$out/share/nautilus-python/extensions/mat2.py"
+  '' + lib.optionalString dolphinIntegration ''
+    install -Dm 444 dolphin/mat2.desktop -t "$out/share/kservices5/ServiceMenus"
+  '';
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest discover -v
+  '';
+
+  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;
+    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/fix_poppler.patch b/nixpkgs/pkgs/development/python-modules/mat2/fix_poppler.patch
new file mode 100644
index 000000000000..02bdbb6345dc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mat2/fix_poppler.patch
@@ -0,0 +1,14 @@
+diff --git a/nautilus/mat2.py b/nautilus/mat2.py
+index 11e6986..5a0e68f 100644
+--- a/nautilus/mat2.py
++++ b/nautilus/mat2.py
+@@ -22,6 +22,9 @@ import gi
+ gi.require_version('Nautilus', '3.0')
+ gi.require_version('Gtk', '3.0')
+ gi.require_version('GdkPixbuf', '2.0')
++gi.require_version('GIRepository', '2.0')
++from gi.repository import GIRepository
++GIRepository.Repository.prepend_search_path('@poppler_path@')
+ from gi.repository import Nautilus, GObject, Gtk, Gio, GLib, GdkPixbuf
+ 
+ from libmat2 import parser_factory
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..784e04cda383
--- /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 eb65b2a..51a0fa1 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 Dict, Union, Set
+ 
+@@ -70,14 +68,5 @@ class ExiftoolParser(abstract.AbstractParser):
+             return False
+         return True
+ 
+-@functools.lru_cache()
+ 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 ae9e463..2acc65c 100644
+--- a/libmat2/video.py
++++ b/libmat2/video.py
+@@ -1,6 +1,4 @@
+ import subprocess
+-import functools
+-import shutil
+ import logging
+ 
+ from typing import Dict, Union
+@@ -135,10 +133,5 @@ class MP4Parser(AbstractFFmpegParser):
+     }
+ 
+ 
+-@functools.lru_cache()
+ 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..efcf1741ab41
--- /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
+  ];
+
+  checkInputs = [
+    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; [ costrouc ];
+  };
+}
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..be1df56206d8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mathlibtools/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchPypi, PyGithub, GitPython, toml, click, tqdm,
+  networkx, pydot, pyyaml, atomicwrites }:
+
+buildPythonPackage rec {
+  pname = "mathlibtools";
+  version = "1.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-0iW7SWIxb+Ek4T26hru5EgBgXfqRh6zOR73GAgLFNyE=";
+  };
+
+  propagatedBuildInputs = [
+    PyGithub GitPython toml click tqdm networkx pydot pyyaml atomicwrites
+  ];
+
+  # requires internet access
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/leanprover-community/mathlib-tools";
+    description = "leanproject is a supporting tool for Lean's mathlib";
+    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..d863239430dc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/matplotlib-inline/default.nix
@@ -0,0 +1,33 @@
+{ lib, buildPythonPackage, fetchPypi
+, traitlets
+
+# tests
+, ipython
+}:
+
+buildPythonPackage rec {
+  pname = "matplotlib-inline";
+  version = "0.1.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a04bfba22e0d1395479f866853ec1ee28eea1485c1d69a6faf00dc3e24ff34ee";
+  };
+
+  propagatedBuildInputs = [
+    traitlets
+  ];
+
+  # wants to import ipython, which creates a circular dependency
+  doCheck = false;
+  pythonImportsCheck = [ "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/default.nix b/nixpkgs/pkgs/development/python-modules/matplotlib/default.nix
new file mode 100644
index 000000000000..933fd3865d6b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/matplotlib/default.nix
@@ -0,0 +1,127 @@
+{ lib, stdenv, fetchPypi, writeText, buildPythonPackage, isPy3k, pycairo
+, which, cycler, python-dateutil, numpy, pyparsing, sphinx, tornado, kiwisolver
+, freetype, qhull, libpng, pkg-config, mock, pytz, pygobject3, gobject-introspection
+, certifi, pillow, fonttools, setuptools-scm, setuptools-scm-git-archive, packaging
+, enableGhostscript ? true, ghostscript, gtk3
+, enableGtk3 ? false, cairo
+# darwin has its own "MacOSX" backend
+, enableTk ? !stdenv.isDarwin, tcl, tk, tkinter
+, enableQt ? false, pyqt5
+# required for headless detection
+, libX11, wayland
+, Cocoa
+}:
+
+let
+  interactive = enableTk || enableGtk3 || enableQt;
+in
+
+buildPythonPackage rec {
+  version = "3.5.2";
+  pname = "matplotlib";
+  format = "setuptools";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "18h78s5ld1i6mz00w258hy29909nfr3ddq6ry9kq18agw468bks8";
+  };
+
+  XDG_RUNTIME_DIR = "/tmp";
+
+  nativeBuildInputs = [
+    pkg-config
+    setuptools-scm
+    setuptools-scm-git-archive
+  ];
+
+  buildInputs = [
+    which
+    sphinx
+  ] ++ lib.optional enableGhostscript [
+    ghostscript
+  ] ++ lib.optional stdenv.isDarwin [
+    Cocoa
+  ];
+
+  propagatedBuildInputs = [
+    certifi
+    cycler
+    fonttools
+    freetype
+    kiwisolver
+    libpng
+    mock
+    numpy
+    packaging
+    pillow
+    pyparsing
+    python-dateutil
+    pytz
+    qhull
+    tornado
+  ] ++ lib.optionals enableGtk3 [
+    cairo
+    gobject-introspection
+    gtk3
+    pycairo
+    pygobject3
+  ] ++ lib.optionals enableTk [
+    libX11
+    tcl
+    tk
+    tkinter
+  ] ++ lib.optionals enableQt [
+    pyqt5
+  ];
+
+  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;
+    };
+  };
+
+  MPLSETUPCFG = writeText "mplsetup.cfg" (lib.generators.toINI {} passthru.config);
+
+  # 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
+    '' +
+    # avoid matplotlib trying to download dependencies
+    ''
+      echo "[libs]
+      system_freetype=true
+      system_qhull=true" > mplsetup.cfg
+    '';
+
+  # 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/";
+    license     = with licenses; [ psfl bsd0 ];
+    maintainers = with maintainers; [ lovek323 veprbl ];
+  };
+}
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..6605009b8fdd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/matrix-client/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, requests
+, responses
+, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "matrix_client";
+  version = "0.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0mii7ib3bah5ppqs7i8sjv5l0zbl57011908m4l0jbyby90ayy06";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    urllib3
+  ];
+
+  checkInputs = [
+    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..324b3a2df06c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/matrix-common/default.nix
@@ -0,0 +1,27 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchPypi
+, attrs
+}:
+
+buildPythonPackage rec {
+  pname = "matrix_common";
+  version = "1.2.1";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-qZ3PAqa9lbJKWmGzVIiKKskr8rS4OccnuN2dos36OFM=";
+  };
+
+  propagatedBuildInputs = [ attrs ];
+  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..586f1ef96a1c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/matrix-nio/default.nix
@@ -0,0 +1,99 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, Logbook
+, aiofiles
+, aiohttp
+, aiohttp-socks
+, aioresponses
+, atomicwrites
+, attrs
+, cachetools
+, faker
+, future
+, git
+, h11
+, h2
+, hypothesis
+, jsonschema
+, peewee
+, poetry-core
+, pycryptodome
+, pytest-aiohttp
+, pytest-benchmark
+, pytestCheckHook
+, python-olm
+, unpaddedbase64
+}:
+
+buildPythonPackage rec {
+  pname = "matrix-nio";
+  version = "0.19.0";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "poljar";
+    repo = "matrix-nio";
+    rev = version;
+    hash = "sha256-+WZk2m05y/bYj8zSuWTzm+rnCC0L9H9WNQ2RLXv7hDk=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'aiofiles = "^0.6.0"' 'aiofiles = "*"' \
+      --replace 'h11 = "^0.12.0"' 'h11 = "*"' \
+      --replace 'jsonschema = "^3.2.0"' 'jsonschema = "*"' \
+      --replace 'cachetools = { version = "^4.2.1", optional = true }' 'cachetools = { version = "*", optional = true }'
+  '';
+
+  nativeBuildInputs = [
+    git
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    Logbook
+    aiofiles
+    aiohttp
+    aiohttp-socks
+    atomicwrites
+    attrs
+    cachetools
+    future
+    h11
+    h2
+    jsonschema
+    peewee
+    pycryptodome
+    python-olm
+    unpaddedbase64
+  ];
+
+  checkInputs = [
+    aioresponses
+    faker
+    hypothesis
+    pytest-aiohttp
+    pytest-benchmark
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "--asyncio-mode=legacy"
+    "--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";
+    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..7b85a17a31a3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mautrix/default.nix
@@ -0,0 +1,38 @@
+{ lib, buildPythonPackage, fetchPypi, aiohttp, pythonOlder
+, sqlalchemy, ruamel-yaml, CommonMark, lxml, aiosqlite
+}:
+
+buildPythonPackage rec {
+  pname = "mautrix";
+  version = "0.17.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-j49NrZJMDw8m5ZGP4DXxk7uzF+0BxDjs4coEkMDUP+0=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+
+    # defined in optional-requirements.txt
+    sqlalchemy
+    aiosqlite
+    ruamel-yaml
+    CommonMark
+    lxml
+  ];
+
+  disabled = pythonOlder "3.8";
+
+  # no tests available
+  doCheck = false;
+
+  pythonImportsCheck = [ "mautrix" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/tulir/mautrix-python";
+    description = "A Python 3 asyncio Matrix framework.";
+    license = licenses.mpl20;
+    maintainers = with maintainers; [ nyanloutre ma27 sumnerevans ];
+  };
+}
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..36bcc35fc036
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/maxcube-api/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, python
+}:
+
+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'"
+  '';
+
+  pythonImportsCheck = [
+    "maxcube"
+    "maxcube.cube"
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+    ${python.interpreter} -m unittest discover
+    runHook postCheck
+  '';
+
+  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..09997b5e60f2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/maxminddb/default.nix
@@ -0,0 +1,35 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, pythonOlder
+, pythonAtLeast
+, fetchPypi
+, libmaxminddb
+, mock
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "maxminddb";
+  version = "2.2.0";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "e37707ec4fab115804670e0fb7aedb4b57075a8b6f80052bdc648d3c005184e5";
+  };
+
+  buildInputs = [ libmaxminddb ];
+
+  checkInputs = [ nose mock ];
+
+  # Tests are broken for macOS on python38
+  doCheck = !(stdenv.isDarwin && pythonAtLeast "3.8");
+
+  meta = with lib; {
+    description = "Reader for the MaxMind DB format";
+    homepage = "https://github.com/maxmind/MaxMind-DB-Reader-python";
+    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..baa95f7c7de2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/maya/default.nix
@@ -0,0 +1,32 @@
+{ lib, fetchPypi, fetchpatch, buildPythonPackage
+, dateparser, humanize, pendulum, ruamel-yaml, tzlocal }:
+
+buildPythonPackage rec {
+  pname = "maya";
+  version = "0.3.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1x88k4irpckvd7jf2yvqjw1s52hjqbxym1r1d928yb3fkj7rvlxs";
+  };
+
+  patches = [
+    (fetchpatch {
+      # https://github.com/kennethreitz/maya/issues/112
+      # Merged, so should be in next release.
+      url = "https://github.com/kennethreitz/maya/commit/f69a93b1103130139cdec30511777823957fb659.patch";
+      sha256 = "152ba7amv9dhhx1wcklfalsdzsxggik9f7rsrikms921lq9xqc8h";
+    })
+  ];
+
+  propagatedBuildInputs = [ dateparser humanize pendulum ruamel-yaml tzlocal ];
+
+  # No tests
+  doCheck = false;
+
+  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..55f8fca0c35e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mayavi/default.nix
@@ -0,0 +1,70 @@
+{ lib
+, apptools
+, buildPythonPackage
+, envisage
+, fetchPypi
+, numpy
+, pyface
+, pygments
+, pyqt5
+, pythonOlder
+, traitsui
+, vtk
+, wrapQtAppsHook
+}:
+
+buildPythonPackage rec {
+  pname = "mayavi";
+  version = "4.8.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-TGBDYdn1+juBvhjVvxTzBlCw7jju1buhbMikQ5QXj2M=";
+  };
+
+  postPatch = ''
+    # Discovery of 'vtk' in setuptools is not working properly, due to a missing
+    # .egg-info in the vtk package. It does however import and run just fine.
+    substituteInPlace mayavi/__init__.py --replace "'vtk'" ""
+
+    # 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
+    pyface
+    pygments
+    pyqt5
+    traitsui
+    vtk
+  ];
+
+  # 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/mccabe/default.nix b/nixpkgs/pkgs/development/python-modules/mccabe/default.nix
new file mode 100644
index 000000000000..f47e4e4d4b6e
--- /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;
+    sha256 = "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..f8001dbdd568
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mcstatus/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, asyncio-dgram
+, buildPythonPackage
+, click
+, dnspython
+, fetchFromGitHub
+, mock
+, poetry-core
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "mcstatus";
+  version = "9.3.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "py-mine";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-kNThVElEDqhbCitktBv5tQkjMaU4IsX0dJk63hvLhb0=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    asyncio-dgram
+    click
+    dnspython
+  ];
+
+  checkInputs = [
+    mock
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'version = "0.0.0"' 'version = "${version}"' \
+      --replace " --cov=mcstatus --cov-append --cov-branch --cov-report=term-missing -vvv --no-cov-on-fail" "" \
+      --replace 'asyncio-dgram = "2.1.2"' 'asyncio-dgram = ">=2.1.2"' \
+      --replace 'dnspython = "2.2.1"' 'dnspython = ">=2.2.0"'
+  '';
+
+  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";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..0510aed835ad
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/md-toc/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fpyutils
+, pyfakefs
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "md-toc";
+  version = "8.1.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "frnmst";
+    repo = pname;
+    rev = version;
+    hash = "sha256-7bXd+kTB1NF5KfcDVsvemCfIbZxv6nAw851bNo375Xs=";
+  };
+
+  propagatedBuildInputs = [
+    fpyutils
+  ];
+
+  checkInputs = [
+    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/";
+    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..bc4e4fc4b2c6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/md2gemini/default.nix
@@ -0,0 +1,23 @@
+{ lib, buildPythonPackage, fetchPypi, mistune, cjkwrap, wcwidth
+, pytestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "md2gemini";
+  version = "1.9.0";
+
+  propagatedBuildInputs = [ mistune cjkwrap wcwidth ];
+  checkInputs = [ pytestCheckHook ];
+  pythonImportsCheck = [ "md2gemini" ];
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-d1zuK+NqoPS36ihh8qx9gOET94tApY+SGStsc/bITnU=";
+  };
+
+  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 ];
+  };
+}
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..23bef4bda405
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mdformat/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, importlib-metadata
+, markdown-it-py
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+, tomli
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "mdformat";
+  version = "0.7.14";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "executablebooks";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-bImBW6r8g/4MQ9yNrBBhk7AGqKRXFyAew6HHEmqelxw=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    markdown-it-py
+    tomli
+  ] ++ lib.optionals (pythonOlder "3.10") [
+    importlib-metadata
+  ] ++ lib.optionals (pythonOlder "3.7") [
+    typing-extensions
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # AssertionError
+    "test_no_codeblock_trailing_newline"
+    # Issue with upper/lower case
+    "default_style.md-options0"
+  ];
+
+  pythonImportsCheck = [
+    "mdformat"
+  ];
+
+  meta = with lib; {
+    description = "CommonMark compliant Markdown formatter";
+    homepage = "https://mdformat.rtfd.io/";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..03a64588f85b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mdit-py-plugins/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, markdown-it-py
+, pytest-regressions
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "mdit-py-plugins";
+  version = "0.3.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "executablebooks";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-3zFSTjqwjUV6+fU6falYbIzj/Hp7E/9EXKZIi00tkg4=";
+  };
+
+  propagatedBuildInputs = [
+    markdown-it-py
+  ];
+
+  checkInputs = [
+    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";
+    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..dc73daa449b9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mdp/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, future
+, numpy
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "MDP";
+  version = "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ac52a652ccbaed1857ff1209862f03bf9b06d093b12606fb410787da3aa65a0e";
+  };
+
+  propagatedBuildInputs = [ future numpy ];
+
+  checkInputs = [ pytest ];
+
+  doCheck = true;
+
+  pythonImportsCheck = [ "mdp" "bimdp" ];
+
+  postPatch = ''
+    # https://github.com/mdp-toolkit/mdp-toolkit/issues/92
+    substituteInPlace mdp/utils/routines.py --replace numx.typeDict numx.sctypeDict
+  '';
+
+  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 = "http://mdp-toolkit.sourceforge.net";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ nico202 ];
+  };
+}
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..da44a1dbbc3d
--- /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.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "hukkin";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-SBJSs+i+I0jF90i3o6BUgLCDR6Et34fXEmQ7fbDoAbA=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  checkInputs = [
+    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..08ea5eb8b6fc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mdutils/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "mdutils";
+  version = "1.4.0";
+
+  src = fetchFromGitHub {
+    owner = "didix21";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-regIrMWbGmW574dfojxZFJoivpaqOpN1I6YsqLEp8BM=";
+  };
+
+  checkPhase = ''
+    runHook preCheck
+    ${python.interpreter} -m unittest discover
+    runHook postCheck
+  '';
+
+  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..5d100c3d24f5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mdx-truly-sane-lists/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, markdown
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "mdx_truly_sane_lists";
+  version = "1.2";
+
+  src = fetchFromGitHub {
+    owner = "radude";
+    repo = "mdx_truly_sane_lists";
+    rev = version;
+    sha256 = "1h8403ch016cwdy5zklzp7c6xrdyyhl4z07h97qzbafrbq07jyss";
+  };
+
+  patches = [
+    # fix with markdown>=3.4
+    # Upstream PR: https://github.com/radude/mdx_truly_sane_lists/pull/12/
+    (fetchpatch {
+      url = "https://github.com/radude/mdx_truly_sane_lists/commit/197fa16bc8d3481b8ea29d54b9cc89716f5d43a2.patch";
+      sha256 = "sha256-cYCb+EI4RpebNN02bCy1SSH9Tz4BsnFgUCOeQNC03Oo=";
+    })
+  ];
+
+  propagatedBuildInputs = [ markdown ];
+
+  pythonImportsCheck = [ "mdx_truly_sane_lists" ];
+
+  # Hard ImportError from the package trying to view version of markdown,
+  # which was removed.
+  # Upstream issue: https://github.com/radude/mdx_truly_sane_lists/issues/11
+  doCheck = false;
+  checkPhase = ''
+    ${python.interpreter} mdx_truly_sane_lists/tests.py
+  '';
+
+  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..30969501213c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/measurement/default.nix
@@ -0,0 +1,31 @@
+{ lib, fetchFromGitHub, buildPythonPackage, isPy3k
+, sympy, pytest, pytest-runner, sphinx, setuptools-scm }:
+
+buildPythonPackage rec {
+  pname = "measurement";
+  version = "3.2.0";
+
+  disabled = !isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "coddingtonbear";
+    repo = "python-measurement";
+    rev = version;
+    sha256 = "1mk9qg1q4cnnipr6xa72i17qvwwhz2hd8p4vlsa9gdzrcv4vr8h9";
+  };
+
+  postPatch = ''
+    sed -i 's|use_scm_version=True|version="${version}"|' setup.py
+  '';
+
+  checkInputs = [ pytest pytest-runner ];
+  nativeBuildInputs = [ sphinx setuptools-scm ];
+  propagatedBuildInputs = [ sympy ];
+
+  meta = with lib; {
+    description = "Use and manipulate unit-aware measurement objects in Python";
+    homepage = "https://github.com/coddingtonbear/python-measurement";
+    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..1b452850161b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mecab-python3/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, mecab
+, swig
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "mecab-python3";
+  version = "1.0.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-5wPXjIimcau4FwNRZEhQAV2bv6sxUwo7QNEkgaZ3mhE=";
+  };
+
+  nativeBuildInputs = [
+    mecab # for mecab-config
+    swig
+    setuptools-scm
+  ];
+
+  buildInputs = [ mecab ];
+
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A python wrapper for mecab: Morphological Analysis engine";
+    homepage =  "https://github.com/SamuraiT/mecab-python3";
+    license = with licenses; [ gpl2 lgpl21 bsd3 ]; # any of the three
+    maintainers = with maintainers; [ ixxie ];
+  };
+}
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..5f11d5cc9e85
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mechanicalsoup/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, beautifulsoup4
+, buildPythonPackage
+, pythonAtLeast
+, fetchFromGitHub
+, lxml
+, pytest-httpbin
+, pytest-mock
+, pytestCheckHook
+, requests
+, requests-mock
+}:
+
+buildPythonPackage rec {
+  pname = "mechanicalsoup";
+  version = "1.1.0";
+
+  disabled = ! pythonAtLeast "3.6";
+
+  src = fetchFromGitHub {
+    owner = "MechanicalSoup";
+    repo = "MechanicalSoup";
+    rev = "v${version}";
+    sha256 = "1mly0ivai3rx64frk7a7ra6abhdxm9x3l6s6x7sgrl9qx1z8zsp3";
+  };
+
+  propagatedBuildInputs = [
+    beautifulsoup4
+    lxml
+    requests
+  ];
+
+  checkInputs = [
+    pytest-httpbin
+    pytest-mock
+    pytestCheckHook
+    requests-mock
+  ];
+
+  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" ""
+  '';
+
+  pythonImportsCheck = [ "mechanicalsoup" ];
+
+  meta = with lib; {
+    description = "Python library for automating interaction with websites";
+    homepage = "https://github.com/hickford/MechanicalSoup";
+    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..5b0ca1735cbd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mechanize/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, html5lib
+}:
+
+buildPythonPackage rec {
+  pname = "mechanize";
+  version = "0.4.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-XoasB3c1fgBusEzSj37Z+BHUjf+mA9OJGsbSuSKA3JE=";
+  };
+
+  propagatedBuildInputs = [ html5lib ];
+
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Stateful programmatic web browsing in Python";
+    homepage = "https://github.com/python-mechanize/mechanize";
+    license = "BSD-style";
+  };
+
+}
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..c15bb59f4738
--- /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.9.0";
+  format = "flit";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "beetbox";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-S90BgjKXpE4kAR0mPXgacmr2A+0hrkGpHRMeuvyFNCg=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    mutagen
+    six
+  ];
+
+  checkInputs = [
+    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..9b188f9c2a59
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mediapy/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, ipython
+, matplotlib
+, numpy
+, pillow
+}:
+
+buildPythonPackage rec {
+  pname = "mediapy";
+  version = "1.1.0";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-CejgiCiW7an1GpKB5MUiA1Alkigv3RmfTq0um9pc93E=";
+  };
+
+  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/meilisearch/default.nix b/nixpkgs/pkgs/development/python-modules/meilisearch/default.nix
new file mode 100644
index 000000000000..f215ec661f0e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/meilisearch/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "meilisearch";
+  version = "0.19.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "meilisearch";
+    repo = "meilisearch-python";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-/z1UtZJE91dUHogXCbCv8nI8bd26HYVi1OzUV3sArJU=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  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";
+    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..0fced5f3e71e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/meinheld/default.nix
@@ -0,0 +1,28 @@
+{ 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,<2.0.0"
+  '';
+
+  propagatedBuildInputs = [ greenlet ];
+
+  # No tests
+  doCheck = false;
+
+  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/memory-allocator/default.nix b/nixpkgs/pkgs/development/python-modules/memory-allocator/default.nix
new file mode 100644
index 000000000000..921f2962f25d
--- /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";
+    sha256 = "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..994863dbbc06
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/memory_profiler/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, python
+}:
+
+python.pkgs.buildPythonPackage rec {
+  pname = "memory_profiler";
+  version = "0.55.0";
+
+  src = python.pkgs.fetchPypi {
+    inherit pname version;
+    sha256 = "1hdgh5f59bya079w4ahx4l0hf4gc5yvaz44irp5x57cj9hkpp92z";
+  };
+
+  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/mercantile/default.nix b/nixpkgs/pkgs/development/python-modules/mercantile/default.nix
new file mode 100644
index 000000000000..e7f307361ed3
--- /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;
+    sha256 = "sha256-DiDXO2XnD3We6NhP81z7aIHzHrHDi/nkqy98OT9986w=";
+  };
+
+  propagatedBuildInputs = [ click ];
+
+  checkInputs = [ 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/mergedb/default.nix b/nixpkgs/pkgs/development/python-modules/mergedb/default.nix
new file mode 100644
index 000000000000..b31d4ddf1928
--- /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
+  ];
+
+  checkInputs = [
+    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..46de34050239
--- /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";
+  };
+
+  checkInputs = [ 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..b1ed82f5348f
--- /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;
+    sha256 = "sha256-4ZkrNqVCKQFPvLx6nIwo0fSuEx6h2NNFyTlz+fDcb9w=";
+  };
+
+  checkInputs = [ 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..a57f926a615f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/merkletools/default.nix
@@ -0,0 +1,20 @@
+{ lib, buildPythonPackage, fetchPypi, pysha3 }:
+
+buildPythonPackage rec {
+  pname = "merkletools";
+  version = "1.0.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0pdik5sil0xcrwdcgdfy86c5qcfrz24r0gfc8m8bxa0i7h7x2v9l";
+  };
+
+  propagatedBuildInputs = [ pysha3 ];
+
+  meta = with lib; {
+    description = "Python tools for creating Merkle trees, generating Merkle proofs, and verification of Merkle proofs";
+    homepage = "https://github.com/Tierion/pymerkletools";
+    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..713408e08c1c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/meross-iot/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, paho-mqtt
+, pytestCheckHook
+, pythonOlder
+, requests
+, retrying
+}:
+
+buildPythonPackage rec {
+  pname = "meross-iot";
+  version = "0.4.5.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "albertogeniola";
+    repo = "MerossIot";
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-6TWtqPYbHZKiAEHAGxZrPxvIiLdNhwOtqtgG+HtQGjI=";
+  };
+
+  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";
+    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..aaf13a76530d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mesa/default.nix
@@ -0,0 +1,34 @@
+{ lib, buildPythonPackage, fetchFromGitHub, isPy27
+, cookiecutter, networkx , pandas, tornado, tqdm
+, pytest }:
+
+buildPythonPackage rec {
+  pname = "mesa";
+  version = "0.8.7";
+
+  # According to their docs, this library is for Python 3+.
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "projectmesa";
+    repo = "mesa";
+    rev = "v${version}";
+    sha256 = "0i1bpdqjrx4avgrzyqxpwxx86j11yhrq1j4kca854xahvhmwis19";
+  };
+
+  checkInputs = [ pytest ];
+
+  # Ignore test which tries to mkdir in unreachable location.
+  checkPhase = ''
+    pytest tests -k "not scaffold"
+  '';
+
+  propagatedBuildInputs = [ cookiecutter networkx pandas tornado tqdm ];
+
+  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/meshio/default.nix b/nixpkgs/pkgs/development/python-modules/meshio/default.nix
new file mode 100644
index 000000000000..1df5a7f47807
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/meshio/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, numpy
+, netcdf4
+, h5py
+, exdown
+, pytestCheckHook
+, rich
+}:
+
+buildPythonPackage rec {
+  pname = "meshio";
+  version = "5.3.4";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-4kBpLX/yecErE8bl17QDYpqGrStE6SMJWLPwDB7DafA=";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    netcdf4
+    h5py
+    rich
+  ];
+
+  checkInputs = [
+    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..596b622f6793
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/meshtastic/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, buildPythonPackage
+, dotmap
+, fetchFromGitHub
+, pexpect
+, protobuf
+, pygatt
+, pypubsub
+, pyqrcode
+, pyserial
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, tabulate
+, pytap2
+, timeago
+}:
+
+buildPythonPackage rec {
+  pname = "meshtastic";
+  version = "1.2.95";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "meshtastic";
+    repo = "Meshtastic-python";
+    rev = version;
+    sha256 = "sha256-CMw7PbM82AjbhrCYnRuxF9WFJqr6gvCEkTyG2vKM7FM=";
+  };
+
+  propagatedBuildInputs = [
+    dotmap
+    pexpect
+    protobuf
+    pygatt
+    pypubsub
+    pyqrcode
+    pyserial
+    pyyaml
+    tabulate
+    timeago
+  ];
+
+  checkInputs = [
+    pytap2
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    export PATH="$PATH:$out/bin";
+  '';
+
+  pythonImportsCheck = [
+    "meshtastic"
+  ];
+
+  meta = with lib; {
+    description = "Python API for talking to Meshtastic devices";
+    homepage = "https://meshtastic.github.io/Meshtastic-python/";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..5e33ae9c1033
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mesonpep517/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, meson
+, ninja
+, toml
+}:
+
+# 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;
+    sha256 = "sha256-Fyo7JfLqHJqbahEjVDt/0xJxOfVLqLn3xNJ4lSB7KIw=";
+  };
+
+  propagatedBuildInputs = [ toml ];
+
+  # postPatch = ''
+  #   # Meson tries to detect ninja as well, so we should patch meson as well.
+  #   substituteInPlace mesonpep517/buildapi.py \
+  #     --replace "'meson'" "'${meson}/bin/meson'" \
+  #     --replace "'ninja'" "'${ninja}/bin/ninja'"
+  # '';
+
+  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..2b428964655f
--- /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
+  ];
+
+  checkInputs = [
+    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..417b4d914e63
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/metakernel/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, ipykernel
+}:
+
+buildPythonPackage rec {
+  pname = "metakernel";
+  version = "0.29.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-+B8ywp7q42g8H+BPFK+D1VyLfyqgnrYIN3ai/mdcwcA=";
+  };
+
+  propagatedBuildInputs = [ ipykernel ];
+
+  # Tests hang, so disable
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Jupyter/IPython Kernel Tools";
+    homepage = "https://github.com/Calysto/metakernel";
+    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..5fb1804dc64f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/metar/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "metar";
+  version = "1.9.0";
+
+  src = fetchFromGitHub {
+    owner = "python-metar";
+    repo = "python-metar";
+    rev = "v${version}";
+    sha256 = "sha256-pl2NWRfFCYyM2qvBt4Ic3wgbGkYZvAO6pX2Set8zYW8=";
+  };
+
+  patches = [
+    # Fix flapping test; https://github.com/python-metar/python-metar/issues/161
+    (fetchpatch {
+      url = "https://github.com/python-metar/python-metar/commit/716fa76682e6c2936643d1cf62e3d302ef29aedd.patch";
+      hash = "sha256-y82NN+KDryOiH+eG+2ycXCO9lqQLsah4+YpGn6lM2As=";
+      name = "fix_flapping_test.patch";
+    })
+
+    # Fix circumvent a sometimes impossible test
+    # https://github.com/python-metar/python-metar/issues/165
+    (fetchpatch {
+      url = "https://github.com/python-metar/python-metar/commit/b675f4816d15fbfc27e23ba9a40cdde8bb06a552.patch";
+      hash = "sha256-v+E3Ckwxb42mpGzi2C3ka96wHvurRNODMU3xLxDoVZI=";
+      name = "fix_impossible_test.patch";
+    })
+  ];
+
+  checkInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "metar" ];
+
+  meta = with lib; {
+    description = "Python parser for coded METAR weather reports";
+    homepage = "https://github.com/python-metar/python-metar";
+    license = with licenses; [ bsd1 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..c6f39a4fb29d
--- /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}";
+    sha256 = "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..6b18bba979ca
--- /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=";
+  };
+
+  checkInputs = [
+    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..5e738adb62bf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/meteofrance-api/default.nix
@@ -0,0 +1,76 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry
+, pytestCheckHook
+, pythonOlder
+, pytz
+, requests
+, requests-mock
+, typing-extensions
+, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "meteofrance-api";
+  version = "1.0.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "hacf-fr";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-X8f0z9ZPXH7Wc3GqHmPptxpNxbHeezdOzw4gZCprumU=";
+  };
+
+  nativeBuildInputs = [
+    # Doesn't work with poetry-core at the moment
+    poetry
+  ];
+
+  propagatedBuildInputs = [
+    pytz
+    requests
+    urllib3
+  ] ++ lib.optionals (pythonOlder "3.7") [
+    typing-extensions
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    requests-mock
+  ];
+
+  postPatch = ''
+    # https://github.com/hacf-fr/meteofrance-api/pull/378
+    substituteInPlace pyproject.toml \
+      --replace 'pytz = ">=2020.4,<2022.0"' 'pytz = ">=2020.4,<2023.0"'
+  '';
+
+  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_workflow"
+  ];
+
+  meta = with lib; {
+    description = "Module to access information from the Meteo-France API";
+    homepage = "https://github.com/hacf-fr/meteofrance-api";
+    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..d4087e12c88d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mezzanine/default.nix
@@ -0,0 +1,88 @@
+{ lib
+, beautifulsoup4
+, bleach
+, buildPythonPackage
+, chardet
+, django
+, django_contrib_comments
+, fetchPypi
+, filebrowser_safe
+, future
+, grappelli_safe
+, isPyPy
+, pep8
+, pillow
+, pyflakes
+, pythonOlder
+, requests
+, requests-oauthlib
+, tzlocal
+}:
+
+buildPythonPackage rec {
+  pname = "mezzanine";
+  version = "6.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6" || 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
+    requests
+    requests-oauthlib
+    tzlocal
+  ];
+
+  # Tests Fail Due to Syntax Warning, Fixed for v3.1.11+
+  doCheck = false;
+  # sed calls will be unecessary 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/micawber/default.nix b/nixpkgs/pkgs/development/python-modules/micawber/default.nix
new file mode 100644
index 000000000000..a7956241adf2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/micawber/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchPypi, beautifulsoup4 }:
+
+buildPythonPackage rec {
+  pname = "micawber";
+  version = "0.5.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "003c5345aafe84f6b60fd289c003e8b1fef04c14e015c2d52d792a6b88135c89";
+  };
+
+  propagatedBuildInputs = [ beautifulsoup4 ];
+
+  meta = with lib; {
+    homepage = "https://micawber.readthedocs.io/en/latest/";
+    description = "A small library 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..07db8906c5d3
--- /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.5";
+
+  src = fetchFromGitHub {
+    owner = "Squachen";
+    repo = "micloud";
+    rev = "v_${version}";
+    sha256 = "sha256-1qtOsEH+G5ASsRyVCa4U0WQ/9kDRn1WpPNkvuvWFovQ=";
+  };
+
+  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/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..25d8d492dd71
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mido/default.nix
@@ -0,0 +1,45 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchPypi
+, substituteAll
+, portmidi
+, python-rtmidi
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "mido";
+  version = "1.2.10";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "17b38a8e4594497b850ec6e78b848eac3661706bfc49d484a36d91335a373499";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./libportmidi-cdll.patch;
+      libportmidi = "${portmidi.out}/lib/libportmidi${stdenv.targetPlatform.extensions.sharedLibrary}";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    python-rtmidi
+  ];
+
+  checkInputs = [
+    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..41396e1c623b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/migen/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, colorama
+}:
+
+buildPythonPackage rec {
+  pname = "migen";
+  version = "unstable-2021-09-14";
+  disabled = pythonOlder "3.3";
+
+  src = fetchFromGitHub {
+    owner = "m-labs";
+    repo = "migen";
+    rev = "a5bc262560238f93ceaad423820eb06843326274";
+    sha256 = "32UjaIam/B7Gx6XbPcR067LcXfokJH2mATG9mU38a6o=";
+  };
+
+  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/milc/default.nix b/nixpkgs/pkgs/development/python-modules/milc/default.nix
new file mode 100644
index 000000000000..ebf4d1d2d224
--- /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;
+    sha256 = "sha256-aX6cTpIN9+9xuEGYHVlM5SjTPLcudJFEuOI4CiN3byE=";
+  };
+
+  propagatedBuildInputs = [
+    appdirs
+    argcomplete
+    colorama
+    halo
+  ];
+
+  checkInputs = [
+    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..003fbc974f1d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mill-local/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, aiohttp
+, async-timeout
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "mill-local";
+  version = "0.1.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "Danielhiversen";
+    repo = "pyMillLocal";
+    rev = version;
+    sha256 = "sha256-OKaR0hpNVBlaZrEmEmHxqRG1i03XP2Z4c7c35YIqe+I=";
+  };
+
+  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";
+    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..3968e8bf8088
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/millheater/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, aiohttp
+, async-timeout
+, buildPythonPackage
+, cryptography
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "millheater";
+  version = "0.9.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "Danielhiversen";
+    repo = "pymill";
+    rev = version;
+    sha256 = "sha256-ocPp9tRghlOb0vZrpELDkwOq8ue+JBCRf2uB0Q7CPF8=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    async-timeout
+    cryptography
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "mill"
+  ];
+
+  meta = with lib; {
+    description = "Python library for Mill heater devices";
+    homepage = "https://github.com/Danielhiversen/pymill";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..0417fe7594fd
--- /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}";
+    sha256 = "sha256-Om67ttAHxu7C3IwPB+JHYi78E9qBi1E6layMVg4+S3M=";
+  };
+
+  propagatedBuildInputs = [ numpy ];
+
+  pythonImportsCheck = [ "minexr" ];
+  checkInputs = [ 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..d3d370d40cfc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/miniaudio/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, cffi
+, pytestCheckHook
+, AudioToolbox
+, CoreAudio
+}:
+
+buildPythonPackage rec {
+  pname = "miniaudio";
+  version = "1.52";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "irmen";
+    repo = "pyminiaudio";
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-qy2FKzg02M1MwUwuPKmK8uGhCrR19Hyzg2YRmlHl67s=";
+  };
+
+  buildInputs = lib.optionals stdenv.isDarwin [
+    AudioToolbox
+    CoreAudio
+  ];
+
+  propagatedNativeBuildInputs = [ cffi ];
+  propagatedBuildInputs = [ cffi ];
+
+  checkInputs = [
+    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/minidb/default.nix b/nixpkgs/pkgs/development/python-modules/minidb/default.nix
new file mode 100644
index 000000000000..5723138ecc3e
--- /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.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "thp";
+    repo = "minidb";
+    rev = version;
+    hash = "sha256-H7W+GBapT9uJgbPlARp4ZLKTN7hZlF/FbNo7rObqDM4=";
+  };
+
+  checkInputs = [
+    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..76ac4abf8ca1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/minidump/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "minidump";
+  version = "0.0.21";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-g9YSr7bFdyfr84rKQztVD4P5+MfDtlYq0quXBx/YXzo=";
+  };
+
+  # 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";
+    license = with licenses; [ mit ];
+    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..7452148e8e47
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/minikanren/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, toolz
+, cons
+, multipledispatch
+, etuples
+, logical-unification
+, pytestCheckHook
+, pytest-html
+}:
+
+buildPythonPackage rec {
+  pname = "minikanren";
+  version = "1.0.3";
+
+  src = fetchFromGitHub {
+    owner = "pythological";
+    repo = "kanren";
+    rev = "5aa9b1734cbb3fe072a7c72b46e1b72a174d28ac";
+    sha256 = "sha256-daAtREgm91634Q0mc0/WZivDiyZHC7TIRoGRo8hMnGE=";
+  };
+
+  propagatedBuildInputs = [
+    toolz
+    cons
+    multipledispatch
+    etuples
+    logical-unification
+  ];
+
+  checkInputs = [
+    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..a6e9fd68c2bd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/minikerberos/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, asn1crypto
+, asysocks
+, buildPythonPackage
+, fetchPypi
+, oscrypto
+, pythonOlder
+, unicrypto
+}:
+
+buildPythonPackage rec {
+  pname = "minikerberos";
+  version = "0.2.20";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-eJ+AImP6GIL3AbEj9u7ASLRc1zG/G1KIcABdrwdAIEc=";
+  };
+
+  propagatedBuildInputs = [
+    asn1crypto
+    asysocks
+    oscrypto
+    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";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..faa836b71d7b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/minimock/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchurl
+, nose
+}:
+
+buildPythonPackage rec {
+  version = "1.2.8";
+  pname = "minimock";
+
+  src = fetchurl {
+    url = "https://bitbucket.org/jab/minimock/get/${version}.zip";
+    sha256 = "c88fa8a7120623f23990a7f086a9657f6ced09025a55e3be8649a30b4945441a";
+  };
+
+  checkInputs = [ nose ];
+
+  checkPhase = ''
+    ./test
+  '';
+
+  meta = with lib; {
+    description = "A minimalistic mocking library for python";
+    homepage = "https://pypi.python.org/pypi/MiniMock";
+    license = licenses.mit;
+  };
+
+}
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..e91507379e00
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/minio/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, buildPythonPackage
+, certifi
+, configparser
+, faker
+, fetchFromGitHub
+, future
+, mock
+, nose
+, pytestCheckHook
+, python-dateutil
+, pythonOlder
+, pytz
+, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "minio";
+  version = "7.1.10";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "minio";
+    repo = "minio-py";
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-od+I3rPLyLYbHAadWks5ccRkmAqhwn4+geRKq0qSnAs=";
+  };
+
+  propagatedBuildInputs = [
+    certifi
+    configparser
+    future
+    python-dateutil
+    pytz
+    urllib3
+  ];
+
+  checkInputs = [
+    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";
+    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..316f5c0853f6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/miniupnpc/default.nix
@@ -0,0 +1,19 @@
+{ stdenv, lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "miniupnpc";
+  version = "2.0.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0ca94zz7sr2x57j218aypxqcwkr23n8js30f3yrvvqbg929nr93y";
+  };
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    description = "miniUPnP client";
+    homepage = "http://miniupnp.free.fr/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ peterhoeg ];
+  };
+}
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/mistletoe/default.nix b/nixpkgs/pkgs/development/python-modules/mistletoe/default.nix
new file mode 100644
index 000000000000..814a93e9c544
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mistletoe/default.nix
@@ -0,0 +1,22 @@
+{ lib
+, isPy3k
+, fetchPypi
+, buildPythonPackage }:
+
+buildPythonPackage rec {
+  pname = "mistletoe";
+  version = "0.8.2";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-ouNU5lPym8r1WZ2JSFEhGaxgN+nC+O53851VRQ59Gmw=";
+  };
+
+  meta = with lib; {
+    description = "A fast, extensible Markdown parser in pure Python.";
+    homepage = "https://github.com/miyuchina/mistletoe";
+    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..16a5e22ac6a4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mistune/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "mistune";
+  version = "2.0.4";
+
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9ee0a66053e2267aba772c71e06891fa8f1af6d4b01d5e84e267b4570d4d9808";
+  };
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "mistune" ];
+
+  meta = with lib; {
+    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/default.nix b/nixpkgs/pkgs/development/python-modules/mitmproxy/default.nix
new file mode 100644
index 000000000000..ed390ef33658
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mitmproxy/default.nix
@@ -0,0 +1,126 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, buildPythonPackage
+, pythonOlder
+  # Mitmproxy requirements
+, asgiref
+, blinker
+, brotli
+, certifi
+, click
+, cryptography
+, flask
+, h11
+, h2
+, hyperframe
+, kaitaistruct
+, ldap3
+, msgpack
+, passlib
+, protobuf
+, publicsuffix2
+, pyasn1
+, pyopenssl
+, pyparsing
+, pyperclip
+, ruamel-yaml
+, setuptools
+, sortedcontainers
+, tornado
+, urwid
+, wsproto
+, zstandard
+  # Additional check requirements
+, beautifulsoup4
+, glibcLocales
+, hypothesis
+, parver
+, pytest-asyncio
+, pytest-timeout
+, pytest-xdist
+, pytestCheckHook
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "mitmproxy";
+  version = "8.1.1";
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-nW/WfiY6uF67qNa95tvNvSv/alP2WmzTk34LEBma/04=";
+  };
+
+  propagatedBuildInputs = [
+    setuptools
+    # setup.py
+    asgiref
+    blinker
+    brotli
+    certifi
+    click
+    cryptography
+    flask
+    h11
+    h2
+    hyperframe
+    kaitaistruct
+    ldap3
+    msgpack
+    passlib
+    protobuf
+    publicsuffix2
+    pyopenssl
+    pyparsing
+    pyperclip
+    ruamel-yaml
+    sortedcontainers
+    tornado
+    urwid
+    wsproto
+    zstandard
+  ];
+
+  checkInputs = [
+    hypothesis
+    parver
+    pytest-asyncio
+    pytest-timeout
+    pytest-xdist
+    pytestCheckHook
+    requests
+  ];
+
+  postPatch = ''
+    # remove dependency constraints
+    sed 's/>=\([0-9]\.\?\)\+\( \?, \?<\([0-9]\.\?\)\+\)\?\( \?, \?!=\([0-9]\.\?\)\+\)\?//' -i setup.py
+  '';
+
+  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"
+  ];
+  dontUsePytestXdist = true;
+
+  pythonImportsCheck = [ "mitmproxy" ];
+
+  meta = with lib; {
+    description = "Man-in-the-middle proxy";
+    homepage = "https://mitmproxy.org/";
+    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..6b6f29e1d5f4
--- /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.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "mitogen-hq";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-cx0q2Y9A6UzpdD1kuGBtXIs9oBGFpkIyvPfN2hj+A1g=";
+  };
+
+  # 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/mixpanel/default.nix b/nixpkgs/pkgs/development/python-modules/mixpanel/default.nix
new file mode 100644
index 000000000000..fac1afe2c97b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mixpanel/default.nix
@@ -0,0 +1,46 @@
+
+{ buildPythonPackage
+, fetchFromGitHub
+, isPy37
+, lib
+
+# Python Dependencies
+, mock
+, pytest
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "mixpanel";
+  version = "4.5.0";
+  disabled = !isPy37;
+
+  src = fetchFromGitHub {
+    owner = "mixpanel";
+    repo = "mixpanel-python";
+    rev = version;
+    sha256 = "1hlc717wcn71i37ngsfb3c605rlyjhsn3v6b5bplq00373r4d39z";
+  };
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  checkInputs = [
+    mock
+    pytest
+  ];
+
+  checkPhase = ''
+    py.test
+  '';
+
+  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..8cd4eb98330b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mizani/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, matplotlib
+, palettable
+, pandas
+, pytestCheckHook
+, pythonOlder
+, scipy
+}:
+
+buildPythonPackage rec {
+  pname = "mizani";
+  version = "0.7.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "has2k1";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-oqbo/aQ5L1nQO8BvXH6/8PBPiWcv2m/LUjwow8+J90w=";
+  };
+
+  propagatedBuildInputs = [
+    matplotlib
+    palettable
+    pandas
+    scipy
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace pytest.ini \
+      --replace " --cov=mizani --cov-report=xml" ""
+  '';
+
+  pythonImportsCheck = [
+    "mizani"
+  ];
+
+  meta = with lib; {
+    description = "Scales for Python";
+    homepage = "https://github.com/has2k1/mizani";
+    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..ea1dffdf0db0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mkdocs-autorefs/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonApplication
+, fetchFromGitHub
+, markdown
+, mkdocs
+, pytestCheckHook
+, pdm-pep517
+, pythonOlder
+}:
+
+buildPythonApplication rec {
+  pname = "mkdocs-autorefs";
+  version = "0.4.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "mkdocstrings";
+    repo = "autorefs";
+    rev = version;
+    sha256 = "sha256-kiHb/XSFw6yaUbLJHBvHaQAOVUM6UfyFeomgniDZqgU=";
+  };
+
+  nativeBuildInputs = [
+    pdm-pep517
+  ];
+
+  propagatedBuildInputs = [
+    markdown
+    mkdocs
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'dynamic = ["version"]' 'version = "${version}"'
+  '';
+
+  pythonImportsCheck = [
+    "mkdocs_autorefs"
+  ];
+
+  meta = with lib; {
+    description = "Automatically link across pages in MkDocs";
+    homepage = "https://github.com/mkdocstrings/autorefs/";
+    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..9d95d72fee77
--- /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;
+    sha256 = "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-gitlab-plugin/default.nix b/nixpkgs/pkgs/development/python-modules/mkdocs-gitlab-plugin/default.nix
new file mode 100644
index 000000000000..5e8f12337e38
--- /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";
+    sha256 = "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-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..fed1eab648e6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mkdocs-material/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, callPackage
+, buildPythonApplication
+, fetchFromGitHub
+, jinja2
+, markdown
+, mkdocs
+, mkdocs-material-extensions
+, pygments
+, pymdown-extensions
+, pythonOlder
+}:
+
+buildPythonApplication rec {
+  pname = "mkdocs-material";
+  version = "8.3.9";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "squidfunk";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-Mi5eWznVuyH+69RtS0fUS9YD9mCumTk8HmgLVDKZC+I=";
+  };
+
+  propagatedBuildInputs = [
+    jinja2
+    markdown
+    mkdocs
+    mkdocs-material-extensions
+    pygments
+    pymdown-extensions
+  ];
+
+  # 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..2d03c8fa8c5d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mkdocs-material/mkdocs-material-extensions.nix
@@ -0,0 +1,24 @@
+{ lib, fetchFromGitHub, buildPythonPackage }:
+
+buildPythonPackage rec {
+  pname = "mkdocs-material-extensions";
+  version = "1.0.3";
+
+  src = fetchFromGitHub {
+    owner = "facelessuser";
+    repo = pname;
+    rev = version;
+    sha256 = "1mvc13lz16apnli2qcqf0dvlm8mshy47jmz2vp72lja6x8jfq2p3";
+  };
+
+  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-minify/default.nix b/nixpkgs/pkgs/development/python-modules/mkdocs-minify/default.nix
new file mode 100644
index 000000000000..0beeb5164160
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mkdocs-minify/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, callPackage
+, buildPythonApplication
+, fetchFromGitHub
+, mkdocs
+, csscompressor
+, htmlmin
+, jsmin
+}:
+
+buildPythonApplication rec {
+  pname = "mkdocs-minify";
+  version = "0.5.0";
+
+  src = fetchFromGitHub {
+    owner = "byrnereese";
+    repo = "${pname}-plugin";
+    rev = version;
+    sha256 = "sha256-7v4uX711KAKuXFeVdLuIdGQi2i+dL4WX7+Zd4H1L3lM=";
+  };
+
+  propagatedBuildInputs = [
+    csscompressor
+    htmlmin
+    jsmin
+    mkdocs
+  ];
+
+  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..44d3ac83a67c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mkdocs-redirects/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, callPackage
+, buildPythonApplication
+, fetchFromGitHub
+, mkdocs
+}:
+
+buildPythonApplication rec {
+  pname = "mkdocs-redirects";
+  version = "1.0.4";
+
+  src = fetchFromGitHub {
+    owner = "mkdocs";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-hdMfl8j+kZzePkSd/bBHKuVXAVA1sAt7DvPZj9x5i0c=";
+  };
+
+  propagatedBuildInputs = [
+    mkdocs
+  ];
+
+  pythonImportsCheck = [ "mkdocs" ];
+
+  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/default.nix b/nixpkgs/pkgs/development/python-modules/mkdocs/default.nix
new file mode 100644
index 000000000000..2345ca93f94f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mkdocs/default.nix
@@ -0,0 +1,81 @@
+{
+  # eval time deps
+  lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+  # runtime deps
+, click
+, ghp-import
+, importlib-metadata
+, jinja2
+, markdown
+, mergedeep
+, packaging
+, pyyaml
+, pyyaml-env-tag
+, watchdog
+  # testing deps
+, babel
+, mock
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "mkdocs";
+  version = "1.3.0";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-S4xkr3jS5GvkMu8JnEGfqhmkxy3FtZZb7Rbuniltudg=";
+  };
+
+  propagatedBuildInputs = [
+    click
+    jinja2
+    markdown
+    mergedeep
+    pyyaml
+    pyyaml-env-tag
+    ghp-import
+    importlib-metadata
+    watchdog
+    packaging
+  ];
+
+  checkInputs = [
+    babel
+    mock
+  ];
+
+
+  checkPhase = ''
+    set -euo pipefail
+
+    runHook preCheck
+
+    python -m unittest discover -v -p '*tests.py' mkdocs --top-level-directory .
+
+    runHook postCheck
+  '';
+
+  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..4e10c4287d8c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mkdocstrings-python/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonApplication
+, fetchFromGitHub
+, griffe
+, mkdocs-material
+, mkdocstrings
+, pdm-pep517
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonApplication rec {
+  pname = "mkdocstrings-python";
+  version = "0.7.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "mkdocstrings";
+    repo = "python";
+    rev = version;
+    hash = "sha256-cZk6Eu6Jp3tSPAb0HplR/I0pX2YIFhOaAsI3YRS0LVw=";
+  };
+
+  nativeBuildInputs = [
+    pdm-pep517
+  ];
+
+  propagatedBuildInputs = [
+    griffe
+    mkdocstrings
+  ];
+
+  checkInputs = [
+    mkdocs-material
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'dynamic = ["version"]' 'version = "${version}"'
+  '';
+
+  pythonImportsCheck = [
+    "mkdocstrings_handlers"
+  ];
+
+  meta = with lib; {
+    description = "Python handler for mkdocstrings";
+    homepage = "https://github.com/mkdocstrings/python";
+    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..b151727a8fbd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mkdocstrings/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, buildPythonApplication
+, fetchFromGitHub
+, jinja2
+, markdown
+, markupsafe
+, mkdocs
+, mkdocs-autorefs
+, pymdown-extensions
+, pytestCheckHook
+, pdm-pep517
+, pythonOlder
+}:
+
+buildPythonApplication rec {
+  pname = "mkdocstrings";
+  version = "0.19.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "mkdocstrings";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-7OF1CrRnE4MYHuYD/pasnZpLe9lrbieGp4agnWAaKVo=";
+  };
+
+  nativeBuildInputs = [
+    pdm-pep517
+  ];
+
+  propagatedBuildInputs = [
+    jinja2
+    markdown
+    markupsafe
+    mkdocs
+    mkdocs-autorefs
+    pymdown-extensions
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'dynamic = ["version"]' 'version = "${version}"'
+  '';
+
+  pythonImportsCheck = [
+    "mkdocstrings"
+  ];
+
+  disabledTestPaths = [
+    # Circular dependencies
+    "tests/test_extension.py"
+  ];
+
+  meta = with lib; {
+    description = "Automatic documentation from sources for MkDocs";
+    homepage = "https://github.com/mkdocstrings/mkdocstrings";
+    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..be0ac454ee98
--- /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;
+
+  checkInputs = [ 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..ffa3a6ade32e
--- /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.0";
+
+  # 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";
+    sha256 = "0g6gxfz8g6fh1sghys869ylxgpda9hq7ylc8jw05608l3k6pz8ar";
+  };
+
+  # 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/mlflow/default.nix b/nixpkgs/pkgs/development/python-modules/mlflow/default.nix
new file mode 100644
index 000000000000..48b70d35a896
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mlflow/default.nix
@@ -0,0 +1,87 @@
+{ lib
+, alembic
+, buildPythonPackage
+, click
+, cloudpickle
+, databricks-cli
+, docker
+, entrypoints
+, fetchpatch
+, fetchPypi
+, flask
+, GitPython
+, gorilla
+, gunicorn
+, importlib-metadata
+, numpy
+, packaging
+, pandas
+, prometheus-flask-exporter
+, protobuf
+, python-dateutil
+, pythonOlder
+, pyyaml
+, querystring_parser
+, requests
+, scipy
+, simplejson
+, six
+, sqlalchemy
+, sqlparse
+}:
+
+buildPythonPackage rec {
+  pname = "mlflow";
+  version = "1.28.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-aXZp4eQuiHwzBQKuTw7WROgUvgas2pDOpEU57M4zSmQ=";
+  };
+
+  propagatedBuildInputs = [
+    alembic
+    click
+    cloudpickle
+    databricks-cli
+    docker
+    entrypoints
+    flask
+    GitPython
+    gorilla
+    gunicorn
+    importlib-metadata
+    numpy
+    packaging
+    pandas
+    prometheus-flask-exporter
+    protobuf
+    python-dateutil
+    pyyaml
+    querystring_parser
+    requests
+    scipy
+    simplejson
+    six
+    sqlalchemy
+    sqlparse
+  ];
+
+  pythonImportsCheck = [
+    "mlflow"
+  ];
+
+  # 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 buildFHSUserEnv
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Open source platform for the machine learning lifecycle";
+    homepage = "https://github.com/mlflow/mlflow";
+    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..2187f2726801
--- /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 ];
+  checkInputs = [ 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..63cc4e3b39ec
--- /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.20.0";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "rasbt";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-ECDO3nc9IEgmZNdSA70BzOODOi0wnisI00F2Dxzdz+M=";
+  };
+
+  checkInputs = [ 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/mmh3/default.nix b/nixpkgs/pkgs/development/python-modules/mmh3/default.nix
new file mode 100644
index 000000000000..66d33d97f702
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mmh3/default.nix
@@ -0,0 +1,22 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+}:
+
+buildPythonPackage rec {
+  pname = "mmh3";
+  version = "3.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d1ec578c09a07d3518ec9be540b87546397fa3455de73c166fcce51eaa5c41c5";
+  };
+
+  pythonImportsCheck = [ "mmh3" ];
+
+  meta = with lib; {
+    description = "Python wrapper for MurmurHash3, a set of fast and robust hash functions";
+    homepage = "https://pypi.org/project/mmh3/";
+    license = licenses.cc0;
+  };
+}
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/mne-python/default.nix b/nixpkgs/pkgs/development/python-modules/mne-python/default.nix
new file mode 100644
index 000000000000..cfebe532375f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mne-python/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, isPy27
+, numpy
+, scipy
+, pytestCheckHook
+, pytest-cov
+, pytest-timeout
+, h5py
+, matplotlib
+, nibabel
+, pandas
+, scikit-learn
+}:
+
+buildPythonPackage rec {
+  pname = "mne-python";
+  version = "1.0.3";
+
+  disabled = isPy27;
+
+  # PyPI dist insufficient to run tests
+  src = fetchFromGitHub {
+    owner = "mne-tools";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-6eDS/hKqEQqUxJtnfsPhxw9b4p5CC1ifnxVCRBmVVA8=";
+  };
+
+  propagatedBuildInputs = [ numpy scipy ];
+
+  # all tests pass, but Pytest hangs afterwards - probably some thread hasn't terminated
+  doCheck = false;
+  checkInputs = [
+    pytestCheckHook
+    pytest-cov
+    pytest-timeout
+    h5py
+    matplotlib
+    nibabel
+    pandas
+    scikit-learn
+  ];
+  preCheck = ''
+    export HOME=$TMP
+    export MNE_SKIP_TESTING_DATASET_TESTS=true
+    export MNE_SKIP_NETWORK_TESTS=1
+  '';
+
+  pythonImportsCheck = [ "mne" ];
+
+  meta = with lib; {
+    homepage = "https://mne.tools";
+    description = "Magnetoencephelography and electroencephalography in Python";
+    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..86590c1d7b8d
--- /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}";
+    sha256 = "sha256-YYgWlYfVd1iALOziaUI8uVYjJDCIVk/dXcUmJd2jcvQ=";
+  };
+
+  checkInputs = [ 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..022cd3a2e02b
--- /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;
+
+  checkInputs = [ 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..33a59c72f8a0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/moat-ble/default.nix
@@ -0,0 +1,55 @@
+{ 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 = "v${version}";
+    hash = "sha256-dy1Fm0Z1PUsPY8QTiXUcWSi+csFnTUsobSkA92m06QI=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    bluetooth-sensor-state-data
+    home-assistant-bluetooth
+    sensor-state-data
+  ];
+
+  checkInputs = [
+    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";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..2917b21dcfe4
--- /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
+  ];
+
+  checkInputs = [
+    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/default.nix b/nixpkgs/pkgs/development/python-modules/mock/default.nix
new file mode 100644
index 000000000000..464a6ae969d7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mock/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, python
+, pythonOlder
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "mock";
+  version = "4.0.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "7d3fbbde18228f4ff2f1f119a45cdffa458b4c0dee32eb4d2bb2f82554bac7bc";
+  };
+
+  patches = [
+    (fetchpatch {
+      url = "https://github.com/testing-cabal/mock/commit/f3e3d82aab0ede7e25273806dc0505574d85eae2.patch";
+      sha256 = "sha256-wPrv1/WeICZHn31UqFlICFsny2knvn3+Xg8BZoaGbwQ=";
+    })
+  ];
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest discover
+  '';
+
+  checkInputs = [
+    pytest
+  ];
+
+  meta = with lib; {
+    description = "Mock objects for Python";
+    homepage = "https://github.com/testing-cabal/mock";
+    license = licenses.bsd2;
+  };
+}
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..1e9203f4abe0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mocket/default.nix
@@ -0,0 +1,80 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, isPy3k
+, decorator
+, http-parser
+, python-magic
+, urllib3
+, pytestCheckHook
+, pytest-mock
+, aiohttp
+, gevent
+, redis
+, requests
+, sure
+, pook
+}:
+
+buildPythonPackage rec {
+  pname = "mocket";
+  version = "3.10.6";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-pD6WiK3OgDD2Xy9r59KOB9TT/LNiQa/DWRXA+w76oe8=";
+  };
+
+  propagatedBuildInputs = [
+    decorator
+    http-parser
+    python-magic
+    urllib3
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    pytest-mock
+    aiohttp
+    gevent
+    redis
+    requests
+    sure
+    pook
+  ];
+
+  # skip http tests
+  SKIP_TRUE_HTTP = true;
+  pytestFlagsArray = [
+    # Requires a live Redis instance
+    "--ignore=tests/main/test_redis.py"
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    # Uses IsolatedAsyncioTestCase which is only available >= 3.8
+    "--ignore=tests/tests38/test_http_aiohttp.py"
+  ];
+
+  disabledTests = [
+    # tests that require network access (like DNS lookups)
+    "test_truesendall"
+    "test_truesendall_with_chunk_recording"
+    "test_truesendall_with_gzip_recording"
+    "test_truesendall_with_recording"
+    "test_wrongpath_truesendall"
+    "test_truesendall_with_dump_from_recording"
+    "test_truesendall_with_recording_https"
+    "test_truesendall_after_mocket_session"
+    "test_real_request_session"
+    "test_asyncio_record_replay"
+  ];
+
+  pythonImportsCheck = [ "mocket" ];
+
+  meta = with lib; {
+    description = "A socket mock framework - for all kinds of socket animals, web-clients included";
+    homepage = "https://github.com/mindflayer/python-mocket";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
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..1c27f7bccb45
--- /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.3.4";
+  pname = "mockito";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-RdJibODIxwY8xE8Gox9X1B0kHvLsm9pAMtULOedZXrE=";
+  };
+
+  propagatedBuildInputs = lib.optionals (!isPy3k) [ funcsigs ];
+  checkInputs = [ 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..47107f0617be
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mockupdb/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildPythonPackage, fetchPypi
+, pymongo
+}:
+
+buildPythonPackage rec {
+  pname = "mockupdb";
+  version = "1.8.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d36d0e5b6445ff9141e34d012fa2b5dfe589847aa1e3ecb8d774074962af944e";
+  };
+
+  propagatedBuildInputs = [ pymongo ];
+
+  pythonImportsCheck = [ "mockupdb" ];
+
+  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/modeled/default.nix b/nixpkgs/pkgs/development/python-modules/modeled/default.nix
new file mode 100644
index 000000000000..dc50ea3141e3
--- /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 ];
+
+  checkInputs = [ 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 = [ maintainers.costrouc ];
+  };
+}
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..447d2b00b019
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/moderngl/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, libGL
+, libX11
+, glcontext
+}:
+
+buildPythonPackage rec {
+  pname = "moderngl";
+  version = "5.6.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "8c6d04559f5e3bf75a18525cd46d213c0f3a8409363718978e6de691bdb551fb";
+  };
+
+  disabled = !isPy3k;
+
+  buildInputs = [ libGL libX11 glcontext ];
+
+  # Tests need a display to run.
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/moderngl/moderngl";
+    description = "High performance rendering for Python 3";
+    license = licenses.mit;
+    platforms = platforms.linux; # should be mesaPlatforms, darwin build breaks.
+    maintainers = with maintainers; [ c0deaddict ];
+  };
+}
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..6888356ec431
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/moderngl_window/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, isPy3k
+, numpy
+, moderngl
+, pyglet
+, pillow
+, pyrr
+, glcontext
+}:
+
+buildPythonPackage rec {
+  pname = "moderngl_window";
+  version = "2.4.1";
+
+  src = fetchFromGitHub {
+    owner = "moderngl";
+    repo = pname;
+    rev = version;
+    sha256 = "12a5nl01c9b1ww7sj7i02xa7zmlrgg8jvi8cz004hw98kjcs9li8";
+  };
+
+  propagatedBuildInputs = [ numpy moderngl pyglet pillow pyrr glcontext ];
+
+  disabled = !isPy3k;
+
+  # Tests need a display to run.
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/moderngl/moderngl_window";
+    description = "Cross platform helper library for ModernGL making window creation and resource loading simple";
+    license = licenses.mit;
+    platforms = platforms.linux; # should be mesaPlatforms, darwin build breaks.
+    maintainers = with maintainers; [ c0deaddict ];
+  };
+}
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..6616ba7d537b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mohawk/default.nix
@@ -0,0 +1,27 @@
+{ lib, buildPythonPackage, fetchPypi, mock, nose, pytest, six }:
+
+with lib;
+buildPythonPackage rec {
+  pname = "mohawk";
+  version = "1.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "08wppsv65yd0gdxy5zwq37yp6jmxakfz4a2yx5wwq2d222my786j";
+  };
+
+  propagatedBuildInputs = [ six ];
+
+  checkInputs = [ mock nose pytest ];
+
+  checkPhase = ''
+    pytest mohawk/tests.py
+  '';
+
+  meta = {
+    description = "Python library for Hawk HTTP authorization.";
+    homepage = "https://github.com/kumar303/mohawk";
+    license = licenses.mpl20;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/moku/default.nix b/nixpkgs/pkgs/development/python-modules/moku/default.nix
new file mode 100644
index 000000000000..de17bca79916
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/moku/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, zeroconf
+, requests
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "moku";
+  version = "2.4";
+
+  /*
+
+  Pypi's webpage <https://pypi.org/project/moku/> lists
+  https://github.com/liquidinstruments/moku/archive/${version}.tar.gz as the
+  download link, but that repository doesn't exist from some reason :/. When
+  packaging this, I didn't find any mention of a git repo of the sources. Note
+  that the pymoku <https://github.com/liquidinstruments/pymoku> repo holds the
+  sources of the legacy API package.
+
+  */
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-yFA2NkiRt6wjXJk6i7oxrjD597acAligWId3MDYwTd0=";
+  };
+  /*
+
+  Note: If you run `moku download` and encounter the error:
+
+  [Errno 13] Permission denied: '/nix/store/.../lib/python 3.9/site-packages/moku/data'
+
+  Then use the $MOKU_DATA_PATH environment variable to control where the
+  downloaded files will go to. It is undocumented upstream and there's no
+  repository to contribute such documentation unfortunately. Also there is no
+  suitable default value for this on Nix systems, so there's no patch we can
+  apply locally to make the situation better.
+
+  */
+
+  propagatedBuildInputs = [
+    zeroconf
+    requests
+    setuptools
+  ];
+
+  pythonImportsCheck = [
+    "moku"
+  ];
+
+  meta = with lib; {
+    description = "Python scripting interface to the Liquid Instruments Moku";
+    homepage = "https://apis.liquidinstruments.com/starting-python.html";
+    license = licenses.mit;
+    maintainers = with maintainers; [ doronbehar ];
+  };
+}
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..74ccf0b1868e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/monai/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, ninja
+, ignite
+, numpy
+, pybind11
+, pytorch
+, which
+}:
+
+buildPythonPackage rec {
+  pname = "monai";
+  version = "0.9.0";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Project-MONAI";
+    repo = "MONAI";
+    rev = version;
+    sha256 = "sha256-HxW9WYxt2a7fS9/1E9DtiH+SCTTJoxYBfgZqskYdcvI=";
+  };
+
+  # 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 pytorch ignite ];
+
+  BUILD_MONAI = 1;
+
+  doCheck = false;  # takes too long; numerous dependencies, some not in Nixpkgs
+
+  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";
+    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..907e54417d6d
--- /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.0.1";
+
+  src = fetchFromGitHub {
+    owner = "monero-ecosystem";
+    repo = "monero-python";
+    rev = "v${version}";
+    sha256 = "sha256-ZjAShIeGVVIKlwgSNPVSN7eaqhKu3wEpDP9wgBMOyZU=";
+  };
+
+  postPatch = ''
+    substituteInPlace requirements.txt \
+      --replace 'pynacl~=1.4' 'pynacl>=1.4' \
+      --replace 'ipaddress' ""
+  '';
+
+  pythonImportsCheck = [ "monero" ];
+
+  propagatedBuildInputs = [
+    pycryptodomex
+    pynacl
+    pysocks
+    requests
+    six
+    varint
+  ];
+
+  checkInputs = [ 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..ff91a63d792f
--- /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.24.1";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "MongoEngine";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-KmCk4YTkwpWePTOOFyp4hGIcxpy/rrfAAC1/Xes/IYk=";
+  };
+
+  propagatedBuildInputs = [
+    pymongo
+    six
+  ];
+
+  checkInputs = [
+    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 = [ maintainers.costrouc ];
+  };
+}
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..e3dc90ef8082
--- /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
+  ];
+
+  checkInputs = [
+    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/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..8e115bf3a180
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/monty/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, msgpack
+, pytestCheckHook
+, numpy
+, pandas
+, pydantic
+, pymongo
+, ruamel-yaml
+, tqdm
+}:
+
+buildPythonPackage rec {
+  pname = "monty";
+  version = "2022.4.26";
+  disabled = pythonOlder "3.5"; # uses type annotations
+
+  src = fetchFromGitHub {
+    owner = "materialsvirtuallab";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-SQku10nzTSuO5ISUDyDKAEoMhBBxPzyLNhoAyrlKH+E=";
+  };
+
+  postPatch = ''
+    substituteInPlace tests/test_os.py \
+      --replace 'self.assertEqual("/usr/bin/find", which("/usr/bin/find"))' '#'
+  '';
+
+  propagatedBuildInputs = [
+    ruamel-yaml
+    tqdm
+    msgpack
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    numpy
+    pandas
+    pydantic
+    pymongo
+  ];
+
+  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";
+    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..50ba81d6d526
--- /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}";
+    sha256 = "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
+  ];
+
+  checkInputs = [
+    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/more-itertools/default.nix b/nixpkgs/pkgs/development/python-modules/more-itertools/default.nix
new file mode 100644
index 000000000000..9f3ce69394fa
--- /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 = "8.13.0";
+  format = "flit";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-pCkBoKWxadkl9vIXzVoZDjLvVDYJBbnDnufbUxO/7A8=";
+  };
+
+  nativeBuildInouts = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  checkInputs = [
+    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..e878c8e72254
--- /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 ""
+  '';
+
+  checkInputs = [
+    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/moretools/default.nix b/nixpkgs/pkgs/development/python-modules/moretools/default.nix
new file mode 100644
index 000000000000..01f6b58a9475
--- /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 ];
+  checkInputs = [ 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/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..dc395a87a560
--- /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";
+  };
+
+  checkInputs = [
+    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..2742df71aa63
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/motionblinds/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pycryptodomex
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "motionblinds";
+  version = "0.6.12";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "starkillerOG";
+    repo = "motion-blinds";
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-QVGOVb/YbpCcPIfJbhjBXOi1c72yMwghFpFeWCy3S48=";
+  };
+
+  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";
+    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..f1ba9ee73304
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/motioneye-client/default.nix
@@ -0,0 +1,57 @@
+{ stdenv
+, lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytest-aiohttp
+, pytest-timeout
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "motioneye-client";
+  version = "0.3.12";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "dermotduffy";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-vEB9ztz0RTGoolFUVQcMV7DUthCEAx1kpwkAS2186OU=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  checkInputs = [
+    pytest-aiohttp
+    pytest-timeout
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace " --cov-report=html:htmlcov --cov-report=xml:coverage.xml --cov-report=term-missing --cov=motioneye_client --cov-fail-under=100" ""
+  '';
+
+  pythonImportsCheck = [
+    "motioneye_client"
+  ];
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    description = "Python library for motionEye";
+    homepage = "https://github.com/dermotduffy/motioneye-client";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..52c0b6a250b2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/moto/default.nix
@@ -0,0 +1,141 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+
+# runtime
+, aws-xray-sdk
+, boto3
+, botocore
+, cfn-lint
+, cryptography
+, docker
+, flask
+, flask-cors
+, graphql-core
+, idna
+, jinja2
+, jsondiff
+, openapi-spec-validator
+, python-dateutil
+, python-jose
+, pytz
+, pyyaml
+, requests
+, responses
+, sshpubkeys
+, werkzeug
+, xmltodict
+
+# tests
+, freezegun
+, pytestCheckHook
+, pytest-xdist
+, sure
+}:
+
+buildPythonPackage rec {
+  pname = "moto";
+  version = "3.1.16";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-y+itipSfUZdx5dJbZwc4YEdX+2fNR0110UwgZ3WC6B8=";
+  };
+
+  propagatedBuildInputs = [
+    aws-xray-sdk
+    boto3
+    botocore
+    cfn-lint
+    cryptography
+    docker
+    flask
+    flask-cors
+    graphql-core
+    idna
+    jinja2
+    jsondiff
+    openapi-spec-validator
+    python-dateutil
+    python-jose
+    pytz
+    pyyaml
+    requests
+    responses
+    sshpubkeys
+    werkzeug
+    xmltodict
+  ];
+
+  checkInputs = [
+    freezegun
+    pytestCheckHook
+    sure
+  ];
+
+  pytestFlagsArray = [
+    # Disable tests that try to access the network
+    "--deselect=tests/test_cloudformation/test_cloudformation_custom_resources.py::test_create_custom_lambda_resource__verify_cfnresponse_failed"
+    "--deselect=tests/test_cloudformation/test_server.py::test_cloudformation_server_get"
+    "--deselect=tests/test_core/test_decorator_calls.py::test_context_manager"
+    "--deselect=tests/test_core/test_decorator_calls.py::test_decorator_start_and_stop"
+    "--deselect=tests/test_core/test_request_mocking.py::test_passthrough_requests"
+    "--deselect=tests/test_firehose/test_firehose_put.py::test_put_record_batch_http_destination"
+    "--deselect=tests/test_firehose/test_firehose_put.py::test_put_record_http_destination"
+    "--deselect=tests/test_logs/test_integration.py::test_put_subscription_filter_with_lambda"
+    "--deselect=tests/test_sqs/test_integration.py::test_invoke_function_from_sqs_exception"
+    "--deselect=tests/test_sqs/test_sqs_integration.py::test_invoke_function_from_sqs_exception"
+    "--deselect=tests/test_stepfunctions/test_stepfunctions.py::test_state_machine_creation_fails_with_invalid_names"
+    "--deselect=tests/test_stepfunctions/test_stepfunctions.py::test_state_machine_list_executions_with_pagination"
+    "--deselect=tests/test_iotdata/test_iotdata.py::test_update"
+    "--deselect=tests/test_iotdata/test_iotdata.py::test_basic"
+    "--deselect=tests/test_iotdata/test_iotdata.py::test_delete_field_from_device_shadow"
+    "--deselect=tests/test_iotdata/test_iotdata.py::test_publish"
+    "--deselect=tests/test_s3/test_server.py::test_s3_server_bucket_versioning"
+
+    # Disalbe test that require docker daemon
+    "--deselect=tests/test_events/test_events_lambdatriggers_integration.py::test_creating_bucket__invokes_lambda"
+    "--deselect=tests/test_s3/test_s3_lambda_integration.py::test_objectcreated_put__invokes_lambda"
+
+    # json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
+    "--deselect=tests/test_cloudformation/test_cloudformation_stack_integration.py::test_lambda_function"
+
+    # AssertionError: CloudWatch log event was not found.
+    "--deselect=tests/test_logs/test_integration.py::test_subscription_filter_applies_to_new_streams"
+
+    # KeyError: 'global'
+    "--deselect=tests/test_iotdata/test_server.py::test_iotdata_list"
+    "--deselect=tests/test_iotdata/test_server.py::test_publish"
+
+    # Blocks test execution
+    "--deselect=tests/test_utilities/test_threaded_server.py::TestThreadedMotoServer::test_load_data_from_inmemory_client"
+  ];
+
+  disabledTestPaths = [
+    # xml.parsers.expat.ExpatError: out of memory: line 1, column 0
+    "tests/test_sts/test_sts.py"
+    # botocore.exceptions.NoCredentialsError: Unable to locate credentials
+    "tests/test_redshiftdata/test_redshiftdata.py"
+    # Tries to access the network
+    "tests/test_appsync/test_appsync_schema.py"
+    "tests/test_awslambda/test_lambda_eventsourcemapping.py"
+    "tests/test_awslambda/test_lambda_invoke.py"
+    "tests/test_batch/test_batch_jobs.py"
+  ];
+
+  disabledTests = [
+    # only appears in aarch64 currently, but best to be safe
+    "test_state_machine_list_executions_with_filter"
+  ];
+
+  meta = with lib; {
+    description = "Allows your tests to easily mock out AWS Services";
+    homepage = "https://github.com/spulec/moto";
+    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..030b22a723e2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/motor/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, mockupdb
+, pymongo
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "motor";
+  version = "3.0.0";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "mongodb";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-xq3EpTncnMskn3aJdLAtD/kKhn/cS2nrLrVliyh2z28=";
+  };
+
+  propagatedBuildInputs = [ pymongo ];
+
+  checkInputs = [ 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..683062a790f9
--- /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";
+    sha256 = "sha256-UTaHTJE0xFihN9r+DY/WhekZ7S/CXtMFbqAayzexRxk=";
+  };
+
+  patches = [
+    ./fix-xlib-version.patch
+    ./pillow-version.patch
+  ];
+
+  doCheck = false;
+  # Mouseinfo requires a X server running to import succesfully
+  # 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..a353816d252e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/moviepy/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, numpy
+, decorator
+, imageio
+, imageio-ffmpeg
+, proglog
+, requests
+, tqdm
+  # Advanced image processing (triples size of output)
+, advancedProcessing ? false
+, opencv3
+, scikitimage
+, 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 [
+    opencv3
+    scikitimage
+    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/mox/default.nix b/nixpkgs/pkgs/development/python-modules/mox/default.nix
new file mode 100644
index 000000000000..bd7fc589a7aa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mox/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "mox";
+  version = "0.7.8";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "ivancrneto";
+    repo = "pymox";
+    rev = "v${version}";
+    hash = "sha256-gODE9IGDk3WtO8iPOlp98fGp6Ih2laA3YlOHmq62m8Y=";
+  };
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "mox"
+  ];
+
+  meta = with lib; {
+    description = "Mock object framework";
+    homepage = "https://github.com/ivancrneto/pymox";
+    license = licenses.asl20;
+    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..3aa8b02dc101
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mox3/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, subunit
+, testrepository
+, testtools
+, six
+, pbr
+, fixtures
+}:
+
+buildPythonPackage rec {
+  pname = "mox3";
+  version = "1.1.0";
+  disabled = pythonOlder "3.6";
+
+  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..282d4a71c962
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mpd2/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, python
+, mock
+}:
+
+buildPythonPackage rec {
+  pname = "python-mpd2";
+  version = "3.0.5";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-bxv/2TuaMvwBipu/NIdQW1Lg11fsNAZpBcYKkS1JI4Q=";
+  };
+
+  buildInputs = [ mock ];
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest mpd.tests
+  '';
+
+  meta = with lib; {
+    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..aa5a74c2cfe8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mpi4py/default.nix
@@ -0,0 +1,51 @@
+{ lib, fetchPypi, fetchpatch, python, buildPythonPackage, mpi, openssh }:
+
+buildPythonPackage rec {
+  pname = "mpi4py";
+  version = "3.1.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-8en64QefQ+r92fgXzbP9MNcJ7cCTtdXa2lekYbLbMAg=";
+  };
+
+  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
+
+    # Needed to run the tests reliably. See:
+    # https://bitbucket.org/mpi4py/mpi4py/issues/87/multiple-test-errors-with-openmpi-30
+    export OMPI_MCA_rmaps_base_oversubscribe=yes
+  '';
+
+  setupPyBuildFlags = ["--mpicc=${mpi}/bin/mpicc"];
+
+  nativeBuildInputs = [ mpi openssh ];
+
+  meta = with lib; {
+    description = "Python bindings for the Message Passing Interface standard";
+    homepage = "https://bitbucket.org/mpi4py/mpi4py/";
+    license = licenses.bsd3;
+  };
+}
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/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..b1d0bf2b9aa9
--- /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;
+    sha256 = "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/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..59ebfc7091e3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mpmath/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "mpmath";
+  version = "1.2.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "79ffb45cf9f4b101a807595bcb3e72e0396202e0b1d25d689134b48c4216a81a";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  # error: invalid command 'test'
+  doCheck = false;
+
+  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/mpv/default.nix b/nixpkgs/pkgs/development/python-modules/mpv/default.nix
new file mode 100644
index 000000000000..11d0bed476af
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mpv/default.nix
@@ -0,0 +1,33 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub, python, isPy27
+, mpv
+}:
+
+buildPythonPackage rec {
+  pname = "mpv";
+  version = "0.5.2";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "jaseg";
+    repo = "python-mpv";
+    rev = "v${version}";
+    sha256 = "0ffskpynhl1252h6a05087lvpjgn1cn2z3caiv3i666dn1n79fjd";
+  };
+
+  buildInputs = [ mpv ];
+
+  postPatch = ''
+    substituteInPlace mpv.py \
+      --replace "sofile = ctypes.util.find_library('mpv')" \
+                'sofile = "${mpv}/lib/libmpv${stdenv.targetPlatform.extensions.sharedLibrary}"'
+  '';
+
+  # tests impure, will error if it can't load libmpv.so
+  checkPhase = "${python.interpreter} -c 'import mpv'";
+
+  meta = with lib; {
+    description = "A python interface to the mpv media player";
+    homepage = "https://github.com/jaseg/python-mpv";
+    license = licenses.agpl3Plus;
+  };
+}
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/mrkd/default.nix b/nixpkgs/pkgs/development/python-modules/mrkd/default.nix
new file mode 100644
index 000000000000..0d97a91a16f3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mrkd/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, jinja2
+, mistune
+, pygments
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "mrkd";
+  version = "0.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "456f8c1be99da268554b29c6b5383532e58119def5a65d85270bc6a0ecc26aaf";
+  };
+
+  propagatedBuildInputs = [ jinja2 mistune pygments setuptools ];
+
+  pythonImportsCheck = [ "mrkd" ];
+
+  meta = with lib; {
+    description = "Write man pages using Markdown, and convert them to Roff or HTML";
+    homepage = "https://github.com/refi64/mrkd";
+    license = licenses.bsd2;
+    # https://github.com/refi64/mrkd/pull/6
+    broken = versionAtLeast mistune.version "2";
+  };
+}
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..3262ba31cb6b
--- /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}";
+    sha256 = "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..aa8e361338dd
--- /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" ""
+  '';
+
+  checkInputs = [
+    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..a811018da214
--- /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;
+    sha256 = "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..b4b47c5268e9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/msal/default.nix
@@ -0,0 +1,43 @@
+{ buildPythonPackage
+, fetchPypi
+, lib
+
+# pythonPackages
+, pyjwt
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "msal";
+  version = "1.18.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-V2r1WGYDi2DtvLMdgxMlob2CQe0nIYbigylo/UcX0gI=";
+  };
+
+  propagatedBuildInputs = [
+    pyjwt
+    requests
+  ];
+
+  # we already have cryptography included, version bounds are causing issues
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "PyJWT[crypto]>=1.0.0,<3" "PyJWT" \
+      --replace "cryptography>=0.6,<38" "cryptography"
+  '';
+
+  # 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 = "The Microsoft Authentication Library (MSAL) for Python library enables your app 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";
+    license = licenses.mit;
+    maintainers = with maintainers; [ kamadorueda ];
+  };
+}
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..1442bc61657d
--- /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;
+    sha256 = "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..aa413190d4da
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/msgpack/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "msgpack";
+  version = "1.0.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-9dhpwY8DAgLrQS8Iso0q/upVPWYTruieIA16yn7wH18=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "msgpack"
+  ];
+
+  meta = with lib;  {
+    description = "MessagePack serializer implementation";
+    homepage = "https://github.com/msgpack/msgpack-python";
+    changelog = "https://github.com/msgpack/msgpack-python/blob/master/ChangeLog.rst";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..22e18e5975f2
--- /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
+  ];
+
+  checkInputs = [
+    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/msldap/default.nix b/nixpkgs/pkgs/development/python-modules/msldap/default.nix
new file mode 100644
index 000000000000..0c0eecbac12f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/msldap/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, asn1crypto
+, asysocks
+, minikerberos
+, prompt-toolkit
+, tqdm
+, winacl
+, winsspi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "msldap";
+  version = "0.3.40";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-4sIqbjlrTX1l1zhj7URhISDo4lcP+JW1Qh3fajUAhbs=";
+  };
+
+  propagatedBuildInputs = [
+    asn1crypto
+    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";
+    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..a1d834929055
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/msoffcrypto-tool/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, olefile
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, cryptography
+, pytestCheckHook
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "msoffcrypto-tool";
+  version = "5.0.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "nolze";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-A5A578JZrxRXX6ewkFzittGTOebeNb99fuKsEm5QGoI=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    cryptography
+    olefile
+    setuptools
+  ];
+
+  checkInputs = [
+    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";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..da130f289fda
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/msrest/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, aiodns
+, aiohttp
+, buildPythonPackage
+, certifi
+, fetchFromGitHub
+, httpretty
+, isodate
+, pytest-aiohttp
+, pytestCheckHook
+, pythonOlder
+, requests
+, requests-oauthlib
+, trio
+}:
+
+buildPythonPackage rec {
+  pname = "msrest";
+  version = "0.6.21";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Azure";
+    repo = "msrest-for-python";
+    rev = "v${version}";
+    hash = "sha256-IlBwlVQ/v+vJmCWNbFZKGL6a9K09z4AYrPm3kwaA/nI=";
+  };
+
+  propagatedBuildInputs = [
+    aiodns
+    aiohttp
+    certifi
+    isodate
+    requests
+    requests-oauthlib
+  ];
+
+  checkInputs = [
+    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..96c546e5d355
--- /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 ];
+
+  checkInputs = [ 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..a0d74719e794
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mss/default.nix
@@ -0,0 +1,27 @@
+{ lib, buildPythonPackage, fetchPypi, isPy3k }:
+
+buildPythonPackage rec {
+  pname = "mss";
+  version = "6.1.0";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "aebd069f3e05667fe9c7b9fa4b1771fe42a4710ce1058ce0236936ce06fa5394";
+  };
+
+  # By default it attempts to build Windows-only functionality
+  prePatch = ''
+    rm mss/windows.py
+  '';
+
+  # Skipping tests due to most relying on DISPLAY being set
+  pythonImportsCheck = [ "mss" ];
+
+  meta = with lib; {
+    description = "Cross-platform multiple screenshots module in pure Python";
+    homepage = "https://github.com/BoboTiG/python-mss";
+    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..3b63b02986a2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mt-940/default.nix
@@ -0,0 +1,31 @@
+{ lib, buildPythonPackage, fetchPypi, isPy3k
+, enum34, pyyaml, pytest
+}:
+
+buildPythonPackage rec {
+  version = "4.26.0";
+  pname = "mt-940";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-HL56TXZNkjVnap0XIhBT/xDA2N80NLCLpvuXkxXu6zE=";
+  };
+
+  propagatedBuildInputs = lib.optional (!isPy3k) enum34;
+
+  checkInputs = [ pyyaml pytest ];
+
+  # requires tests files that are not present
+  doCheck = false;
+  checkPhase = ''
+    py.test
+  '';
+
+  pythonImportsCheck = [ "mt940" ];
+
+  meta = with lib; {
+    description = "A library to parse MT940 files and returns smart Python collections for statistics and manipulation";
+    homepage = "https://github.com/WoLpH/mt940";
+    license = licenses.bsd3;
+  };
+}
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..10f0e40b7626
--- /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;
+    sha256 = "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/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..cb539e4dd90f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/multi_key_dict/default.nix
@@ -0,0 +1,21 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "multi_key_dict";
+  version = "2.0.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "17lkx4rf4waglwbhc31aak0f28c63zl3gx5k5i1iq2m3gb0xxsyy";
+  };
+
+  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..6ee071732691
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/multidict/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "multidict";
+  version = "6.0.2";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-X/O9dfOOTEPx9HDy33pNQwuCHEziK+OE4UWctX1rsBM=";
+  };
+
+  postPatch = ''
+    sed -i '/^addopts/d' setup.cfg
+  '';
+
+  checkInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "multidict" ];
+
+  meta = with lib; {
+    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..fe2bb2ef45c1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/multimethod/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "multimethod";
+  version = "1.6";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "coady";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "09vrxzv8q0lqsbh6d83wjdd29ja66rj31y7wmyha14jk603fd9k0";
+  };
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "multimethod"
+  ];
+
+  meta = with lib; {
+    description = "Multiple argument dispatching";
+    homepage = "https://github.com/coady/multimethod";
+    license = licenses.asl20;
+    maintainers = teams.determinatesystems.members;
+  };
+}
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..ed55b0421cd8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/multipledispatch/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "multipledispatch";
+  version = "0.6.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a7ab1451fd0bf9b92cab3edbd7b205622fb767aeefb4fb536c2e3de9e0a38bea";
+  };
+
+  # 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..8558706485c2
--- /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.13";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "uqfoundation";
+    repo = pname;
+    rev = "refs/tags/multiprocess-${version}";
+    sha256 = "sha256-L/PesvaidavDEgJGqBxwcCYtG9TlKSwaxrUMJ+XVFOM=";
+  };
+
+  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..e511ab100459
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/multiset/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools-scm
+, pytest-runner
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "multiset";
+  version = "3.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "e45671cae8385a8e6248a9b07a3a83280c2d0cc4312713058cfbacdc5ec9973e";
+  };
+
+  buildInputs = [ setuptools-scm pytest-runner ];
+  checkInputs = [ pytest ];
+
+  meta = with lib; {
+    description = "An implementation of a multiset";
+    homepage = "https://github.com/wheerd/multiset";
+    license = licenses.mit;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..c59cfe25089b
--- /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;
+    sha256 = "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..f6ca7c1d6905
--- /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 = "2.5.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "2d735f6f24d4dba3417fa448cae40c6e896ec1fdab6cdb5e6510999758a4dbd2";
+  };
+
+  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/munkres/default.nix b/nixpkgs/pkgs/development/python-modules/munkres/default.nix
new file mode 100644
index 000000000000..ffb4f8774906
--- /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";
+    })
+  ];
+
+  checkInputs = [ 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..23587889f6a3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/murmurhash/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, cython
+}:
+
+buildPythonPackage rec {
+  pname = "murmurhash";
+  version = "1.0.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-Ywo5br0xykTYm07KNvp06oquckrfCvqi3naAw1Cyk28=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py --replace "'wheel>=0.32.0,<0.33.0'" ""
+  '';
+
+  buildInputs = [
+   cython
+  ];
+
+  # No test
+  doCheck = false;
+
+  checkPhase = ''
+    pytest 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/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..b9701073e0bd
--- /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";
+    sha256 = "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..835a9d8861a2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mutagen/default.nix
@@ -0,0 +1,70 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+
+# docs
+, python
+, sphinx
+, sphinx-rtd-theme
+
+# tests
+, hypothesis
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "mutagen";
+  version = "1.45.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "6397602efb3c2d7baebd2166ed85731ae1c1d475abca22090b7141ff5034b3e1";
+  };
+
+  outputs = [ "out" "doc" ];
+
+  nativeBuildInputs = [
+    sphinx
+    sphinx-rtd-theme
+  ];
+
+  postInstall = ''
+    ${python.pythonForBuild.interpreter} setup.py build_sphinx --build-dir=$doc
+  '';
+
+  checkInputs = [
+    hypothesis
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Hypothesis produces unreliable results: Falsified on the first call but did not on a subsequent one
+    "test_test_fileobj_save"
+  ];
+
+  disabledTestPaths = [
+    # we are not interested in code quality measurements
+    "tests/quality/test_flake8.py"
+  ];
+
+  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;
+  };
+}
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..9336dbf354af
--- /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 ];
+  checkInputs = [ 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..954cc663c2a4
--- /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=";
+  };
+
+  checkInputs = [
+    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/mutmut/default.nix b/nixpkgs/pkgs/development/python-modules/mutmut/default.nix
new file mode 100644
index 000000000000..626c768f2a81
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mutmut/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, fetchFromGitHub
+, buildPythonApplication
+, click
+, glob2
+, parso
+, pony
+, junit-xml
+, pythonOlder
+, testers
+}:
+
+let self = buildPythonApplication rec {
+  pname = "mutmut";
+  version = "2.2.0";
+
+  src = fetchFromGitHub {
+    repo = pname;
+    owner = "boxed";
+    rev = version;
+    hash = "sha256-G+OL/9km2iUeZ1QCpU73CIWVWMexcs3r9RdCnAsESnY=";
+  };
+
+  postPatch = ''
+    substituteInPlace requirements.txt --replace 'junit-xml==1.8' 'junit-xml==1.9'
+  '';
+
+  disabled = pythonOlder "3.7";
+
+  doCheck = false;
+
+  propagatedBuildInputs = [ click glob2 parso pony junit-xml ];
+
+  passthru.tests.version = testers.testVersion { package = self; };
+
+  meta = with lib; {
+    description = "mutation testing system for Python, with a strong focus on ease of use";
+    homepage = "https://github.com/boxed/mutmut";
+    changelog = "https://github.com/boxed/mutmut/blob/${version}/HISTORY.rst";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ synthetica ];
+  };
+};
+in self
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..da260251e9f2
--- /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
+  ];
+
+  checkInputs = [
+    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..db81e951cf28
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mwdblib/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, beautifultable
+, buildPythonPackage
+, click
+, click-default-group
+, fetchFromGitHub
+, humanize
+, keyring
+, python
+, python-dateutil
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "mwdblib";
+  version = "4.2.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "CERT-Polska";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-Wkqvi/buYKDoGi+4C9zkxWEiGynk9Ds8gLsdoaZCdKg=";
+  };
+
+  propagatedBuildInputs = [
+    beautifultable
+    click
+    click-default-group
+    humanize
+    keyring
+    python-dateutil
+    requests
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+    ${python.interpreter} -m unittest discover
+    runHook postCheck
+  '';
+
+  pythonImportsCheck = [
+    "mwdblib"
+  ];
+
+  meta = with lib; {
+    description = "Python client library for the mwdb service";
+    homepage = "https://github.com/CERT-Polska/mwdblib";
+    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..1fcd7123ea75
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mwoauth/default.nix
@@ -0,0 +1,46 @@
+{ 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;
+    maintainers = with maintainers; [ ixxie ];
+  };
+}
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..b8399bebef46
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mwparserfromhell/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pytest-runner
+}:
+
+buildPythonPackage rec {
+  pname = "mwparserfromhell";
+  version = "0.6.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-kr7JUorjTScok8yvK1J9+FwxT/KM+7MFY0BGewldg0w=";
+  };
+
+  checkInputs = [
+    pytestCheckHook
+    pytest-runner
+  ];
+
+  meta = with lib; {
+    description = "MWParserFromHell is a parser for MediaWiki wikicode";
+    homepage = "https://mwparserfromhell.readthedocs.io/en/latest/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ melling ];
+  };
+}
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..a9e778bdd8c6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mxnet/default.nix
@@ -0,0 +1,39 @@
+{ 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 = ''
+    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..791cb708be5c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/myfitnesspal/default.nix
@@ -0,0 +1,69 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, blessed
+, keyring
+, keyrings-alt
+, lxml
+, measurement
+, python-dateutil
+, requests
+, rich
+, typing-extensions
+, pytestCheckHook
+, mock
+, nose
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "myfitnesspal";
+  version = "1.17.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-UXFvKQtC44EvscYWXK7KI/do3U0wTWI3zKwvsRdzKrs=";
+  };
+
+  propagatedBuildInputs = [
+    blessed
+    keyring
+    keyrings-alt
+    lxml
+    measurement
+    python-dateutil
+    requests
+    rich
+    typing-extensions
+  ];
+
+  checkInputs = [
+    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..c6956b828dbc
--- /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";
+  };
+
+  checkInputs = [ 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; [ skeidel ];
+  };
+}
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..de729243f042
--- /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}";
+    sha256 = "sha256-DJzwvgvSA9Q0kpueUoQV64pdDDNA7WzGu7r+g5aqutk=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    python-dateutil
+    urllib3
+  ];
+
+  checkInputs = [
+    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..3c21c2c8106f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/myjwt/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, click
+, colorama
+, cryptography
+, exrex
+, fetchFromGitHub
+, pyopenssl
+, pyperclip
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+, questionary
+, requests
+, requests-mock
+}:
+
+buildPythonPackage rec {
+  pname = "myjwt";
+  version = "1.6.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "mBouamama";
+    repo = "MyJWT";
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-A9tsQ6L+y3doL5pJbau3yKnmQtX2IPXWyW/YCLhS7nc=";
+  };
+
+  propagatedBuildInputs = [
+    click
+    colorama
+    cryptography
+    exrex
+    pyopenssl
+    pyperclip
+    questionary
+    requests
+  ];
+
+  checkInputs = [
+    pytest-mock
+    pytestCheckHook
+    requests-mock
+  ];
+
+  postPatch = ''
+    # Remove all version pinning (E.g., tornado==5.1.1 -> tornado)
+    sed -i -e "s/==[0-9.]*//" requirements.txt
+  '';
+
+  pythonImportsCheck = [
+    "myjwt"
+  ];
+
+  meta = with lib; {
+    description = "CLI tool for testing vulnerabilities of JSON Web Tokens (JWT)";
+    homepage = "https://github.com/mBouamama/MyJWT";
+    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..e46d8eab2bce
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mypy-boto3-builder/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, black
+, boto3
+, buildPythonPackage
+, fetchFromGitHub
+, isort
+, jinja2
+, md-toc
+, mdformat
+, newversion
+, poetry-core
+, pyparsing
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "mypy-boto3-builder";
+  version = "7.5.5";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.10";
+
+  src = fetchFromGitHub {
+    owner = "vemel";
+    repo = "mypy_boto3_builder";
+    rev = version;
+    hash = "sha256-rv0c0QoXOd7aSOLhGDGfq4v0bnGBOJhGhZVNhS5hgOs=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    black
+    boto3
+    isort
+    jinja2
+    md-toc
+    mdformat
+    newversion
+    pyparsing
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "mypy_boto3_builder"
+  ];
+
+  disabledTests = [
+    # Tests require network access
+    "TestBotocoreChangelogChangelog"
+  ];
+
+  meta = with lib; {
+    description = "Type annotations builder for boto3";
+    homepage = "https://vemel.github.io/mypy_boto3_builder/";
+    license = with licenses; [ bsd3 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mypy-boto3-s3/default.nix b/nixpkgs/pkgs/development/python-modules/mypy-boto3-s3/default.nix
new file mode 100644
index 000000000000..d87393aec301
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mypy-boto3-s3/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, boto3
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "mypy-boto3-s3";
+  version = "1.24.36.post1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-O9fgb5reUFnq4hgdep8aQef6gHrT6UwByZAYOOh+Cr4=";
+  };
+
+  propagatedBuildInputs = [
+    boto3
+    typing-extensions
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "mypy_boto3_s3"
+  ];
+
+  meta = with lib; {
+    description = "Type annotations for boto3";
+    homepage = "https://vemel.github.io/boto3_stubs_docs/mypy_boto3_s3/";
+    license = with licenses; [ bsd3 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..f1c7d83a6bae
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mypy-protobuf/default.nix
@@ -0,0 +1,23 @@
+{ lib, fetchPypi, buildPythonApplication, protobuf, types-protobuf, grpcio-tools, pythonOlder }:
+
+buildPythonApplication rec {
+  pname = "mypy-protobuf";
+  version = "3.2.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-cwqhUzfDjwRG++CPbGwjcO4B05USU2nUtw4IseLuMO4=";
+  };
+
+  propagatedBuildInputs = [ protobuf types-protobuf grpcio-tools ];
+
+  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..7d2df7e316ba
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mypy/default.nix
@@ -0,0 +1,74 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, fetchpatch
+, buildPythonPackage
+, mypy-extensions
+, python
+, pythonOlder
+, typed-ast
+, typing-extensions
+, tomli
+, types-typed-ast
+}:
+
+buildPythonPackage rec {
+  pname = "mypy";
+  version = "0.961";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "python";
+    repo = "mypy";
+    rev = "v${version}";
+    hash = "sha256-K6p73+/SeWniMSD/mP09qwqFOBr/Pqohl+PaTDVpvZI=";
+  };
+
+  patches = [
+    # FIXME: Remove patch after upstream has decided the proper solution.
+    #        https://github.com/python/mypy/pull/11143
+    (fetchpatch {
+      url = "https://github.com/python/mypy/commit/2004ae023b9d3628d9f09886cbbc20868aee8554.patch";
+      hash = "sha256-y+tXvgyiECO5+66YLvaje8Bz5iPvfWNIBJcsnZ2nOdI=";
+    })
+  ];
+
+  buildInputs = [
+    types-typed-ast
+  ];
+
+  propagatedBuildInputs = [
+    mypy-extensions
+    tomli
+    typed-ast
+    typing-extensions
+  ];
+
+  # Tests not included in pip package.
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "mypy"
+    "mypy.api"
+    "mypy.fastparse"
+    "mypy.report"
+    "mypy.types"
+    "mypyc"
+    "mypyc.analysis"
+  ];
+
+  # 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.
+  MYPY_USE_MYPYC = stdenv.buildPlatform.is64bit;
+
+  # when testing reduce optimisation level to drastically reduce build time
+  MYPYC_OPT_LEVEL = 1;
+
+  meta = with lib; {
+    description = "Optional static typing for Python";
+    homepage = "http://www.mypy-lang.org";
+    license = licenses.mit;
+    maintainers = with maintainers; [ martingms lnl7 SuperSandro2000 ];
+  };
+}
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..04b22e2c5438
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mypy/extensions.nix
@@ -0,0 +1,34 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, typing
+, python
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "mypy-extensions";
+  version = "0.4.3";
+
+  src = fetchFromGitHub {
+    owner = "python";
+    repo = "mypy_extensions";
+    rev = version;
+    sha256 = "sha256-JjhbxX5DBAbcs1o2fSWywz9tot792q491POXiId+NyI=";
+  };
+
+  propagatedBuildInputs = lib.optional (pythonOlder "3.5") typing;
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest discover tests
+  '';
+
+  pythonImportsCheck = [ "mypy_extensions" ];
+
+  meta = with lib; {
+    description = "Experimental type system extensions for programs checked with the mypy typechecker";
+    homepage = "http://www.mypy-lang.org";
+    license = licenses.mit;
+    maintainers = with maintainers; [ martingms lnl7 SuperSandro2000 ];
+  };
+}
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..4356052d8715
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mysql-connector/0001-Revert-Fix-MacOS-wheels-platform-tag.patch
@@ -0,0 +1,36 @@
+From c5d32ef5d656b0aa4b2c1fc61c901d40bf2fb96a Mon Sep 17 00:00:00 2001
+From: Alexander Ben Nasrallah <me@abn.sh>
+Date: Mon, 19 Jul 2021 17:24:41 +0200
+Subject: [PATCH] Revert "Fix MacOS wheels platform tag"
+
+This reverts commit d1e89fd3d7391084cdf35b0806cb5d2a4b413654.
+---
+ cpydist/__init__.py | 5 +----
+ 1 file changed, 1 insertion(+), 4 deletions(-)
+
+diff --git a/cpydist/__init__.py b/cpydist/__init__.py
+index 0e7f341..2619d7a 100644
+--- a/cpydist/__init__.py
++++ b/cpydist/__init__.py
+@@ -41,7 +41,7 @@ from distutils.command.install import install
+ from distutils.command.install_lib import install_lib
+ from distutils.core import Command
+ from distutils.dir_util import mkpath, remove_tree
+-from distutils.sysconfig import get_config_vars, get_python_version
++from distutils.sysconfig import get_python_version
+ from distutils.version import LooseVersion
+ from subprocess import check_call, Popen, PIPE
+ 
+@@ -57,9 +57,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 = [
+     ("byte-code-only", None,
+      "remove Python .py files; leave byte code .pyc only"),
+-- 
+2.31.1
+
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..a8d25b0be186
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mysql-connector/default.nix
@@ -0,0 +1,64 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, django
+, dnspython
+, fetchFromGitHub
+, protobuf
+, pythonOlder
+, fetchpatch
+}:
+
+buildPythonPackage rec {
+  pname = "mysql-connector";
+  version = "8.0.29";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "mysql";
+    repo = "mysql-connector-python";
+    rev = version;
+    hash = "sha256-X0qiXNYkNoR00ESUdByPj4dPnEnjLyopm25lm1JvkAk=";
+  };
+
+  patches = [
+    # mysql-connector overrides MACOSX_DEPLOYMENT_TARGET to 11.
+    # This makes the installation with nixpkgs fail. I suspect, that's
+    # because stdenv.targetPlatform.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
+
+    # Allow for clang to be used to build native extensions
+    (fetchpatch {
+      url = "https://github.com/mysql/mysql-connector-python/commit/fd24ce9dc8c60cc446a8e69458f7851d047c7831.patch";
+      sha256 = "sha256-WvU1iB53MavCsksKCjGvUl7R3Ww/38alxxMVzjpr5Xg=";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    dnspython
+    protobuf
+  ];
+
+  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..c12b16611e92
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mysqlclient/default.nix
@@ -0,0 +1,29 @@
+{ lib, buildPythonPackage, fetchPypi, libmysqlclient }:
+
+buildPythonPackage rec {
+  pname = "mysqlclient";
+  version = "2.1.1";
+
+  nativeBuildInputs = [
+    libmysqlclient
+  ];
+
+  buildInputs = [
+    libmysqlclient
+  ];
+
+  # Tests need a MySQL database
+  doCheck = false;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-godX5Bn7Ed1sXtJXbsksPvqpOg98OeJjWG0e53nD14I=";
+  };
+
+  meta = with lib; {
+    description = "Python interface to MySQL";
+    homepage = "https://github.com/PyMySQL/mysqlclient-python";
+    license = licenses.gpl1;
+    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..c7d9f7999bc7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/myst-docutils/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, docutils
+, fetchPypi
+, flit-core
+, jinja2
+, markdown-it-py
+, mdit-py-plugins
+, pythonOlder
+, pyyaml
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "myst-docutils";
+  version = "0.18.0";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-evyIuNLbBWR3KfQMv2lNw6fOgX1+/uMS5cHIbSTYDmA=";
+  };
+
+  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..a01df8338693
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/myst-nb/default.nix
@@ -0,0 +1,56 @@
+{ 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 = "0.16.0";
+
+  format = "flit";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9c7ab37929da72f78569a37bcccbc5d49fd679fd7935bf6c9fa36365eb58783a";
+  };
+
+  nativeBuildInputs = [ flit-core ];
+
+  propagatedBuildInputs = [
+    importlib-metadata
+    ipython
+    jupyter-cache
+    nbclient
+    myst-parser
+    nbformat
+    pyyaml
+    sphinx
+    sphinx-togglebutton
+    typing-extensions
+    ipykernel
+  ];
+
+  pythonImportsCheck = [ "myst_nb" ];
+
+  meta = with lib; {
+    description = "A Jupyter Notebook Sphinx reader built on top of the MyST markdown parser";
+    homepage = "https://github.com/executablebooks/myst-nb";
+    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..e81bf763b3a8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/myst-parser/default.nix
@@ -0,0 +1,78 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, 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 = "0.18.0";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "executablebooks";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-GEtrC7o5YnkuvBfQQfhG5P74QMiHz63Fdh1cC/r5CF0=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "docutils>=0.15,<0.19" "docutils>=0.15"
+  '';
+
+  format = "flit";
+
+  nativeBuildInputs = [ flit-core ];
+
+  propagatedBuildInputs = [
+    docutils
+    jinja2
+    mdit-py-plugins
+    markdown-it-py
+    pyyaml
+    sphinx
+    typing-extensions
+  ];
+
+  pythonImportsCheck = [ "myst_parser" ];
+
+  checkInputs = [
+    beautifulsoup4
+    pytest-param-files
+    pytest-regressions
+    sphinx-pytest
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # AssertionError due to different files
+    "test_basic"
+    "test_footnotes"
+    "test_gettext_html"
+    "test_fieldlist_extension"
+    # docutils 0.19 expectation mismatches
+    "test_docutils_roles"
+  ];
+
+  meta = with lib; {
+    description = "Sphinx and Docutils extension to parse MyST";
+    homepage = "https://myst-parser.readthedocs.io/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ loicreynier ];
+  };
+}
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..60006c7afcb7
--- /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;
+    sha256 = "sha256-jRMk/yMA48ei+g/33+mMYwfwixaKTMYcU/z/VOoJbvY=";
+  };
+
+  propagatedBuildInputs = [
+    pyserial
+  ];
+
+  checkInputs = [
+    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..fab05cd4acde
--- /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
+  ];
+
+  checkInputs = [
+    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..de073e502dc8
--- /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.10";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "HashPals";
+    repo = pname;
+    rev = version;
+    hash = "sha256-3sddUPoC3NfKQzmNgqPf/uHaYN9VZBqsmV712uz1Phg=";
+  };
+
+  # 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..d9b2db64f465
--- /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=";
+  };
+
+  checkInputs = [
+    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";
+      sha256 = "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..63e795f98c85
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nameparser/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, glibcLocales
+}:
+
+buildPythonPackage rec {
+  pname = "nameparser";
+  version = "1.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-zoM27XRk+nubh0X0i5xi3qa+2TG5lxXKlHk2BUSZIUM=";
+  };
+
+  LC_ALL="en_US.UTF-8";
+  buildInputs = [ glibcLocales ];
+
+  meta = with lib; {
+    description = "A simple Python module for parsing human names into their individual components";
+    homepage = "https://github.com/derek73/python-nameparser";
+    license = licenses.lgpl21Plus;
+  };
+
+}
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..b65bb463475b
--- /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";
+  };
+
+  checkInputs = [
+    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..9f572d141c70
--- /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
+  ];
+
+  checkInputs = [
+    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/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..fc9306eb5714
--- /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";
+  };
+
+  checkInputs = [ 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..9625c8b55649
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/napalm/default.nix
@@ -0,0 +1,67 @@
+{ lib, buildPythonPackage, fetchFromGitHub, fetchpatch, setuptools, cffi
+, paramiko, requests, future, textfsm, jinja2, netaddr, pyyaml, pyeapi, netmiko
+, junos-eznc, ciscoconfparse, scp, lxml, ncclient, pytestCheckHook, ddt, mock
+, pythonOlder, invoke }:
+
+buildPythonPackage rec {
+  pname = "napalm";
+  version = "3.4.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "napalm-automation";
+    repo = "napalm";
+    rev = version;
+    sha256 = "sha256-TNWRJtc6+VS6wgJGGvCPDoFQmOKQAyXdjFQo9bPJ2F8=";
+  };
+
+  patches = [
+    # netmiko 4.0.0 support
+    (fetchpatch{
+      url = "https://github.com/napalm-automation/napalm/commit/4b8cc85db3236099a04f742cf71773e74d9dd70e.patch";
+      excludes = [ "requirements.txt" ];
+      sha256 = "sha256-DBKp+wiKd+/j2xAqaQL3UCcGQd6wnWcNTsNXBBt9c98=";
+    })
+    (fetchpatch{
+      url = "https://github.com/napalm-automation/napalm/commit/4a8b5b1823335dd79aa5269c038a1f08ecd35cdd.patch";
+      sha256 = "sha256-uiou/rzmnFf4wAvXwmUsGJx99GeHWKJB2JrMM1kLakM=";
+    })
+  ];
+
+  postPatch = ''
+    substituteInPlace requirements.txt \
+      --replace "netmiko>=3.3.0,<4.0.0" "netmiko"
+  '';
+
+  propagatedBuildInputs = [
+    cffi
+    paramiko
+    requests
+    future
+    textfsm
+    invoke
+    jinja2
+    netaddr
+    pyyaml
+    pyeapi
+    netmiko
+    junos-eznc
+    ciscoconfparse
+    scp
+    setuptools
+    lxml
+    ncclient
+  ];
+
+  checkInputs = [ 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..f6ebfa980e6e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/napalm/hp-procurve.nix
@@ -0,0 +1,43 @@
+{ lib, buildPythonPackage, fetchFromGitHub, setuptools, napalm, netmiko
+, pytestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "napalm-hp-procurve";
+  version = "0.7.0";
+
+  src = fetchFromGitHub {
+    owner = "napalm-automation-community";
+    repo = pname;
+    rev = version;
+    sha256 = "1lspciddkd1w5lfyz35i0qwgpbn5jq9cbqkwjbsvi4kliz229vkh";
+  };
+
+  # dependency installation in setup.py doesn't work
+  patchPhase = ''
+    echo -n > requirements.txt
+  '';
+
+  buildInputs = [ setuptools napalm ];
+  propagatedBuildInputs = [ netmiko ];
+
+  # setup.cfg seems to contain invalid pytest parameters
+  preCheck = ''
+    rm setup.cfg
+  '';
+  checkInputs = [ pytestCheckHook ];
+  disabledTests = [
+    # AssertionError: Some methods vary.
+    "test_method_signatures"
+    # AttributeError: 'PatchedProcurveDriver' object has no attribute 'platform'
+    "test_get_config_filtered"
+    # AssertionError
+    "test_get_interfaces"
+  ];
+
+  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..f809587f75f2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/napari-console/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools-scm
+, pytestCheckHook
+, pytest
+, ipython
+, ipykernel
+, qtconsole
+, napari-plugin-engine
+, imageio
+}: buildPythonPackage rec {
+  pname = "napari-console";
+  version = "0.0.4";
+  src = fetchFromGitHub {
+    owner = "napari";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-aVdYOzkZ+dqB680oDjNCg6quXU+QgUZI09E/MSTagyA=";
+  };
+  nativeBuildInputs = [ setuptools-scm ];
+  # setup.py somehow requires pytest
+  propagatedBuildInputs = [ pytest ipython ipykernel napari-plugin-engine imageio qtconsole ];
+  chechInputs = [ pytestCheckHook ];
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  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..4ca75cf0237c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/napari-npe2/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, appdirs
+, pyyaml
+, pytomlpp
+, pydantic
+, magicgui
+, typer
+, setuptools-scm
+, napari # reverse dependency, for tests
+}:
+
+let
+  pname = "napari-npe2";
+  version = "0.5.1";
+in
+buildPythonPackage {
+  inherit pname version;
+
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "napari";
+    repo = "npe2";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-+tTJrtJFUGwOhFzWgA5cFVp458DGuPVkErN/5O2LHk4=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    # npe2 *can* build without it,
+    # but then setuptools refuses to acknowledge it when building napari
+    setuptools-scm
+  ];
+  propagatedBuildInputs = [
+    appdirs
+    pyyaml
+    pytomlpp
+    pydantic
+    magicgui
+    typer
+  ];
+
+  passthru.tests = { inherit napari; };
+
+  meta = with lib; {
+    description = "Yet another 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..802b25e8df14
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/napari-plugin-engine/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools-scm
+, pytestCheckHook
+}: buildPythonPackage rec {
+  pname = "napari-plugin-engine";
+  version = "0.2.0";
+  src = fetchFromGitHub {
+    owner = "napari";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-cKpCAEYYRq3UPje7REjzhEe1J9mmrtXs8TBnxWukcNE=";
+  };
+  nativeBuildInputs = [ setuptools-scm ];
+  checkInputs = [ pytestCheckHook ];
+  doCheck = false;
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  meta = with lib; {
+    description = "A fork of pluggy for napari - plugin management package";
+    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..89101e824445
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/napari-svg/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools-scm
+, pytestCheckHook
+, vispy
+, napari-plugin-engine
+, imageio
+}: buildPythonPackage rec {
+  pname = "napari-svg";
+  version = "0.1.5";
+  src = fetchFromGitHub {
+    owner = "napari";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-20NLi6JTugP+hxqF2AnhSkuvhkGGbeG+tT3M2SZbtRc=";
+  };
+  nativeBuildInputs = [ setuptools-scm ];
+  propagatedBuildInputs = [ vispy napari-plugin-engine imageio ];
+  checkInputs = [ pytestCheckHook ];
+  doCheck = false; # Circular dependency: napari
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  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..a55d45bccce9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/napari/default.nix
@@ -0,0 +1,84 @@
+{ lib
+, mkDerivationWith
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools-scm
+, superqt
+, typing-extensions
+, tifffile
+, napari-npe2
+, pint
+, pyyaml
+, numpydoc
+, dask
+, magicgui
+, docstring-parser
+, appdirs
+, imageio
+, pyopengl
+, cachey
+, napari-svg
+, psutil
+, napari-console
+, wrapt
+, pydantic
+, tqdm
+, jsonschema
+, scipy
+, wrapQtAppsHook
+}: mkDerivationWith buildPythonPackage rec {
+  pname = "napari";
+  version = "0.4.16";
+
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "napari";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-Fx3DoTIb2ev5wMP/gmprPIoxeF2f+Cbac6pnWB/zTTw=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+    wrapQtAppsHook
+  ];
+  propagatedBuildInputs = [
+    napari-npe2
+    cachey
+    napari-svg
+    napari-console
+    superqt
+    magicgui
+    typing-extensions
+    tifffile
+    pint
+    pyyaml
+    numpydoc
+    dask
+    docstring-parser
+    appdirs
+    imageio
+    pyopengl
+    psutil
+    wrapt
+    pydantic
+    tqdm
+    jsonschema
+    scipy
+  ];
+
+  dontUseSetuptoolsCheck = true;
+  postFixup = ''
+    wrapQtApp $out/bin/napari
+  '';
+
+  meta = with lib; {
+    description = "A fast, interactive, multi-dimensional image viewer for python";
+    homepage = "https://github.com/napari/napari";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ SomeoneSerge ];
+  };
+}
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..8637580c39d3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nats-py/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, buildPythonPackage
+, ed25519
+, fetchFromGitHub
+, nats-server
+, pytestCheckHook
+, pythonOlder
+, uvloop
+}:
+
+buildPythonPackage rec {
+  pname = "nats-py";
+  version = "2.1.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "nats-io";
+    repo = "nats.py";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-gLNMKLkufy/+zS5quH/UYXBIBfkZUyHtB0TiPNEBw6I=";
+  };
+
+  propagatedBuildInputs = [
+    ed25519
+  ];
+
+  checkInputs = [
+    nats-server
+    pytestCheckHook
+    uvloop
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "--cov=nats --cov-report html" ""
+  '';
+
+  disabledTests = [
+    # RuntimeError: Event loop is closed
+    "test_subscribe_no_echo"
+    "test_publish"
+    "test_publish_verbose"
+    "test_fetch_max_waiting_fetch_one"
+    "test_fetch_n"
+    "test_consumer_management"
+    "test_ephemeral_subscribe"
+    "test_queue_subscribe_deliver_group"
+    "test_subscribe_push_bound"
+    "test_double_acking_subscribe"
+    "test_flow_control"
+    "test_ordered_consumer"
+    "test_ordered_consumer_single_loss"
+    "test_kv_simple"
+  ];
+
+  pythonImportsCheck = [
+    "nats"
+  ];
+
+  meta = with lib; {
+    description = "Python client for NATS.io";
+    homepage = "https://github.com/nats-io/nats.py";
+    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..5bf5b2a6d21c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nats-python/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, poetry-core
+, pythonOlder
+}:
+
+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";
+    })
+  ];
+
+  # 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..3b3682b335e9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/natsort/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fastnumbers
+, fetchPypi
+, glibcLocales
+, hypothesis
+, PyICU
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "natsort";
+  version = "8.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-x8Hz8nw3Vxmk38qzU5Cf458mwgMqBiqMgMyETqrKBEU=";
+  };
+
+  propagatedBuildInputs = [
+    fastnumbers
+    PyICU
+  ];
+
+  checkInputs = [
+    glibcLocales
+    hypothesis
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "natsort"
+  ];
+
+  meta = with lib; {
+    description = "Natural sorting for Python";
+    homepage = "https://github.com/SethMMorton/natsort";
+    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/nbclassic/default.nix b/nixpkgs/pkgs/development/python-modules/nbclassic/default.nix
new file mode 100644
index 000000000000..a1e16bc75219
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nbclassic/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, notebook
+, notebook-shim
+, pythonOlder
+, jupyter_server
+, pytestCheckHook
+, pytest-tornasync
+}:
+
+buildPythonPackage rec {
+  pname = "nbclassic";
+  version = "0.4.3";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-8DERss66ppuINwp7I7GbKzfJu3F2fxgozf16BH6ujt0=";
+  };
+
+  propagatedBuildInputs = [ jupyter_server notebook notebook-shim ];
+
+  checkInputs = [
+    pytestCheckHook
+    pytest-tornasync
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  meta = with lib; {
+    description = "Jupyter lab environment notebook server extension.";
+    license = with licenses; [ bsd3 ];
+    homepage = "https://github.com/jupyterlab/nbclassic";
+    maintainers = [ 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..59cbd65b48f3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nbclient/default.nix
@@ -0,0 +1,61 @@
+{ async_generator
+, buildPythonPackage
+, fetchFromGitHub
+, ipykernel
+, ipywidgets
+, jupyter-client
+, lib
+, nbconvert
+, nbformat
+, nest-asyncio
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, traitlets
+, xmltodict
+}:
+
+let nbclient = buildPythonPackage rec {
+  pname = "nbclient";
+  version = "0.6.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "jupyter";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-Rs4Jk4OtexB/NKM1Jo4cV87hBxXDlnX9X+4KO+pGb0E=";
+  };
+
+  propagatedBuildInputs = [ async_generator traitlets nbformat nest-asyncio jupyter-client ];
+
+  # circular dependencies if enabled by default
+  doCheck = false;
+
+  checkInputs = [
+    ipykernel
+    ipywidgets
+    nbconvert
+    pytest-asyncio
+    pytestCheckHook
+    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 = [ maintainers.erictapen ];
+  };
+};
+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..42d9ae3cf389
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nbconflux/default.nix
@@ -0,0 +1,39 @@
+{ 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 = version;
+    sha256 = "1708qkb275d6f7b4b5zmqx3i0jh56nrx2n9rwwp5nbaah5p2wwlh";
+  };
+
+  propagatedBuildInputs = [ nbconvert requests ];
+
+  checkInputs = [ pytestCheckHook responses ];
+
+  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/nbconvert/default.nix b/nixpkgs/pkgs/development/python-modules/nbconvert/default.nix
new file mode 100644
index 000000000000..df01318a6ea1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nbconvert/default.nix
@@ -0,0 +1,95 @@
+{ beautifulsoup4
+, bleach
+, buildPythonPackage
+, defusedxml
+, fetchPypi
+, fetchpatch
+, ipywidgets
+, jinja2
+, jupyterlab-pygments
+, lib
+, markupsafe
+, mistune
+, nbclient
+, pandocfilters
+, pyppeteer
+, pytestCheckHook
+, tinycss2
+}:
+
+buildPythonPackage rec {
+  pname = "nbconvert";
+  version = "6.5.0";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Ij5G4nq+hZa4rtVDAfrbukM7f/6oGWpo/Xsf9Qnu6Z0=";
+  };
+
+  # Add $out/share/jupyter to the list of paths that are used to search for
+  # various exporter templates
+  patches = [
+    ./templates.patch
+
+    # Use mistune 2.x
+    (fetchpatch {
+      name = "support-mistune-2.x.patch";
+      url = "https://github.com/jupyter/nbconvert/commit/e870d9a4a61432a65bee5466c5fa80c9ee28966e.patch";
+      hash = "sha256-kdOmE7BnkRy2lsNQ2OVrEXXZntJUPJ//b139kSsfKmI=";
+      excludes = [ "pyproject.toml" ];
+    })
+  ];
+
+  postPatch = ''
+    substituteAllInPlace ./nbconvert/exporters/templateexporter.py
+
+    # Use mistune 2.x
+    substituteInPlace setup.py \
+        --replace "mistune>=0.8.1,<2" "mistune>=2.0.3,<3"
+  '';
+
+  propagatedBuildInputs = [
+    beautifulsoup4
+    bleach
+    defusedxml
+    jinja2
+    jupyterlab-pygments
+    markupsafe
+    mistune
+    nbclient
+    pandocfilters
+    tinycss2
+  ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  checkInputs = [
+    ipywidgets
+    pyppeteer
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    # DeprecationWarning: Support for bleach <5 will be removed in a future version of nbconvert
+    "-W ignore::DeprecationWarning"
+  ];
+
+  disabledTests = [
+    # Attempts network access (Failed to establish a new connection: [Errno -3] Temporary failure in name resolution)
+    "test_export"
+    "test_webpdf_with_chromium"
+  ];
+
+  # Some of the tests use localhost networking.
+  __darwinAllowLocalNetworking = true;
+
+  meta = {
+    description = "Converting Jupyter Notebooks";
+    homepage = "https://jupyter.org/";
+    license = lib.licenses.bsd3;
+    maintainers = with lib.maintainers; [ fridh ];
+  };
+}
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/nbdime/default.nix b/nixpkgs/pkgs/development/python-modules/nbdime/default.nix
new file mode 100644
index 000000000000..da00ff3702dd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nbdime/default.nix
@@ -0,0 +1,87 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, hypothesis
+, setuptools-scm
+, six
+, attrs
+, py
+, setuptools
+, pytest-timeout
+, pytest-tornado
+, mock
+, tabulate
+, nbformat
+, jsonschema
+, pytestCheckHook
+, colorama
+, pygments
+, tornado
+, requests
+, GitPython
+, jupyter-server-mathjax
+, notebook
+, jinja2
+}:
+
+buildPythonPackage rec {
+  pname = "nbdime";
+  version = "3.1.1";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "67767320e971374f701a175aa59abd3a554723039d39fae908e72d16330d648b";
+  };
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  propagatedBuildInputs = [
+    attrs
+    py
+    setuptools
+    six
+    jupyter-server-mathjax
+    nbformat
+    colorama
+    pygments
+    tornado
+    requests
+    GitPython
+    notebook
+    jinja2
+  ];
+
+  checkInputs = [
+    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;
+
+  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/nbformat/default.nix b/nixpkgs/pkgs/development/python-modules/nbformat/default.nix
new file mode 100644
index 000000000000..e5185aa37f66
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nbformat/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fastjsonschema
+, pytestCheckHook
+, glibcLocales
+, ipython_genutils
+, traitlets
+, testpath
+, jsonschema
+, jupyter_core
+}:
+
+buildPythonPackage rec {
+  pname = "nbformat";
+  version = "5.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-RLpcpqy4DF1aUA8eW4Pt6MvjZNWklcTIz2Cq8bplZQE=";
+  };
+
+  LC_ALL="en_US.utf8";
+
+  checkInputs = [ pytestCheckHook glibcLocales ];
+  propagatedBuildInputs = [ ipython_genutils traitlets testpath jsonschema jupyter_core fastjsonschema ];
+
+  preCheck = ''
+    mkdir tmp
+    export HOME=tmp
+  '';
+
+  # 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..79900197133a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nbmerge/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, nbformat
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "nbmerge";
+  version = "unstable-2017-10-23";
+
+  src = fetchFromGitHub {
+    owner = "jbn";
+    repo = pname;
+    rev = "fc0ba95e8422340317358ffec4404235defbc06a";
+    sha256 = "1cn550kjadnxc1sx2xy814248fpzrj3lgvrmsbrwmk03vwaa2hmi";
+  };
+
+  propagatedBuildInputs = [ nbformat ];
+  checkInputs = [ nose ];
+
+  checkPhase = ''
+    patchShebangs .
+    nosetests -v
+    PATH=$PATH:$out/bin ./cli_tests.sh
+  '';
+
+  meta = {
+    description = "A tool to merge/concatenate Jupyter (IPython) notebooks";
+    inherit (src.meta) homepage;
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ ];
+  };
+}
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..7d1d827cc20f
--- /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 = [ maintainers.costrouc ];
+  };
+}
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..ebba5c7b3f87
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nbsphinx/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, docutils
+, jinja2
+, nbconvert
+, nbformat
+, sphinx
+, traitlets
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "nbsphinx";
+  version = "0.8.9";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-St6GsqQfj0Hv0+qZ2uhMM2j+i6P4N9UMiBXOlCTFmU8=";
+  };
+
+  propagatedBuildInputs = [
+    docutils
+    jinja2
+    nbconvert
+    nbformat
+    sphinx
+    traitlets
+  ];
+
+  # The package has not tests
+  doCheck = false;
+
+  JUPYTER_PATH = "${nbconvert}/share/jupyter";
+  pythonImportsCheck = [
+    "nbsphinx"
+  ];
+
+  disabled = !isPy3k;
+
+  meta = with lib; {
+    description = "Jupyter Notebook Tools for Sphinx";
+    homepage = "https://nbsphinx.readthedocs.io/";
+    license = licenses.mit;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..3db084665221
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nbval/default.nix
@@ -0,0 +1,69 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, coverage
+, ipykernel
+, jupyter-client
+, nbformat
+, pytestCheckHook
+, pytest
+, six
+, glibcLocales
+, matplotlib
+, sympy
+}:
+
+buildPythonPackage rec {
+  pname = "nbval";
+  version = "0.9.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "cfefcd2ef66ee2d337d0b252c6bcec4023384eb32e8b9e5fcc3ac80ab8cd7d40";
+  };
+
+  buildInputs = [
+    glibcLocales
+  ];
+
+  propagatedBuildInputs = [
+    coverage
+    ipykernel
+    jupyter-client
+    nbformat
+    pytest
+    six
+  ];
+
+  checkInputs = [
+    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"
+  ];
+
+  # 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; [ costrouc ];
+  };
+}
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..1c4cc473bf47
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nbxmpp/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitLab
+, gobject-introspection
+, idna
+, libsoup
+, precis-i18n
+, pygobject3
+, pyopenssl
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "nbxmpp";
+  version = "3.1.0";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitLab {
+    domain = "dev.gajim.org";
+    owner = "gajim";
+    repo = "python-nbxmpp";
+    rev = version;
+    sha256 = "sha256-QnvV/sAxdl8V5nV1hk8sRrL6nn015dAy6cXAiy2Tmbs=";
+  };
+
+  nativeBuildInputs = [
+    # required for pythonImportsCheck otherwise libsoup cannot be found
+    gobject-introspection
+  ];
+
+  buildInputs = [
+    precis-i18n
+  ];
+
+  propagatedBuildInputs = [
+    gobject-introspection
+    idna
+    libsoup
+    pygobject3
+    pyopenssl
+  ];
+
+  checkInputs = [
+    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/ncclient/default.nix b/nixpkgs/pkgs/development/python-modules/ncclient/default.nix
new file mode 100644
index 000000000000..3457c71af4ca
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ncclient/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, paramiko
+, selectors2
+, lxml
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "ncclient";
+  version = "0.6.13";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-NrilXB1NFcqNCGrwshhuLdhQoeHJ12PSp4MBScT9kYc=";
+  };
+
+  propagatedBuildInputs = [
+    paramiko
+    lxml
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "ncclient" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/ncclient/ncclient";
+    description = "Python library for NETCONF clients";
+    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..e11f1f8f23ab
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nclib/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "nclib";
+  version = "1.0.2";
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-rA8oeYvMhw8HURxPLBRqpMHnAez/xBjyPFoKXIIvBjg=";
+  };
+
+  # 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/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/ndjson/default.nix b/nixpkgs/pkgs/development/python-modules/ndjson/default.nix
new file mode 100644
index 000000000000..cd70025d6106
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ndjson/default.nix
@@ -0,0 +1,22 @@
+{ lib, buildPythonPackage, fetchPypi, watchdog, flake8
+, pytest, pytest-runner, coverage, sphinx, twine }:
+
+buildPythonPackage rec {
+  pname = "ndjson";
+  version = "0.3.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "v5dGy2uxy1PRcs2n8VTAfHhtZl/yg0Hk5om3lrIp5dY=";
+  };
+
+  checkInputs = [ pytest pytest-runner flake8 twine sphinx coverage watchdog ];
+
+  meta = with lib; {
+    homepage = "https://github.com/rhgrant10/ndjson";
+    description = "JsonDecoder";
+    platforms = platforms.unix;
+    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..d29946a5685f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ndms2-client/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "ndms2-client";
+  version = "0.1.1";
+
+  src = fetchFromGitHub {
+    owner = "foxel";
+    repo = "python_ndms2_client";
+    rev = version;
+    sha256 = "1sc39d10hm1y8xf3gdqzq1akrx94k590l106242j9bvfqyr8lrk9";
+  };
+
+  checkInputs = [
+    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..7408949649fa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ndspy/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, crcmod
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "ndspy";
+  version = "4.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "RoadrunnerWMC";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0x3sp10had1mq192m7kgjivvs8kpjagxjgj9d4z95dfjhzzbjh70";
+  };
+
+  propagatedBuildInputs = [
+    crcmod
+  ];
+
+  checkInputs = [
+    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..75fc5373b4c5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ndtypes/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, python
+, numpy
+, libndtypes
+, isPy27
+}:
+
+buildPythonPackage {
+  pname = "ndtypes";
+  disabled = isPy27;
+  inherit (libndtypes) version src meta;
+
+  propagatedBuildInputs = [ numpy ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace 'include_dirs = ["libndtypes"]' \
+                'include_dirs = ["${libndtypes}/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..d6be449eb1b1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/neo/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nose
+, numpy
+, quantities
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "neo";
+  version = "0.10.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-LUIYsIJtruqIDhVSJwYAKew4oAI4zrXwlxONlGfGOZs=";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    quantities
+  ];
+
+  checkInputs = [
+    nose
+  ];
+
+  checkPhase = ''
+    nosetests --exclude=iotest
+  '';
+
+  pythonImportsCheck = [
+    "neo"
+  ];
+
+  meta = with lib; {
+    description = "Package for representing electrophysiology data";
+    homepage = "https://neuralensemble.org/neo/";
+    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..325196cba96f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/neo4j/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytz
+}:
+
+buildPythonPackage rec {
+  pname = "neo4j";
+  version = "4.4.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "neo4j";
+    repo = "neo4j-python-driver";
+    rev = version;
+    hash = "sha256-BtftIpVKnIAwgLgdZUwHiVsKOpgy2bSb+9fC3ycpM4Y=";
+  };
+
+  propagatedBuildInputs = [
+    pytz
+  ];
+
+  # Missing dependencies
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "neo4j"
+  ];
+
+  meta = with lib; {
+    description = "Neo4j Bolt Driver for Python";
+    homepage = "https://github.com/neo4j/neo4j-python-driver";
+    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..591d74a95a54
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nessclient/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, asynctest
+, buildPythonPackage
+, click
+, fetchFromGitHub
+, justbackoff
+, pythonOlder
+, pytest-asyncio
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "nessclient";
+  version = "0.10.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "nickw444";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-zjUYdSHIMCB4cCAsOOQZ9YgmFTskzlTUs5z/xPFt01Q=";
+  };
+
+  propagatedBuildInputs = [
+    justbackoff
+    click
+  ];
+
+  checkInputs = [
+    asynctest
+    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";
+    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..faa015d85f31
--- /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.5";
+  pname = "nest_asyncio";
+  disabled = !(pythonAtLeast "3.5");
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-5EIpHNlCaYvmGYI6F6hqV1nqvh+GEwhHkN4Yn+nhbWU=";
+  };
+
+  # 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; [ costrouc ];
+  };
+}
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..7e56158ff145
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nested-lookup/default.nix
@@ -0,0 +1,36 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, lib
+, pytestCheckHook
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "nested-lookup";
+  version = "0.2.23";
+
+  src = fetchFromGitHub {
+    owner = "russellballestrini";
+    repo = "nested-lookup";
+    # https://github.com/russellballestrini/nested-lookup/issues/47
+    rev = "c1b0421479efa378545bc71efa3b72882e8fec17";
+    sha256 = "sha256-jgfYLSsFLQSsOH4NzbDPKFIG+tWWZ1zTWcZEaX2lthg=";
+  };
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  checkInputs = [
+    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..1fbfde7b26a6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nestedtext/default.nix
@@ -0,0 +1,43 @@
+{ lib, buildPythonPackage, fetchFromGitHub
+, inform
+, pytestCheckHook
+, docopt
+, natsort
+, voluptuous
+}:
+
+buildPythonPackage rec {
+  pname = "nestedtext";
+  version = "1.2";
+
+  src = fetchFromGitHub {
+    owner = "KenKundert";
+    repo = "nestedtext";
+    rev = "v${version}";
+    fetchSubmodules = true;
+    sha256 = "1dwks5apghg29aj90nc4qm0chk195jh881297zr1wk7mqd2n159y";
+  };
+
+  propagatedBuildInputs = [ inform ];
+
+  checkInputs = [ pytestCheckHook docopt natsort voluptuous ];
+  pytestFlagsArray = [ "--ignore=build" ]; # Avoids an ImportMismatchError.
+
+  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";
+    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..3f7f78a374cb
--- /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 ];
+
+  checkInputs = [ 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/netcdf4/default.nix b/nixpkgs/pkgs/development/python-modules/netcdf4/default.nix
new file mode 100644
index 000000000000..4908e1eb8aee
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/netcdf4/default.nix
@@ -0,0 +1,50 @@
+{ lib, buildPythonPackage, fetchPypi, isPyPy, pytest
+, numpy, zlib, netcdf, hdf5, curl, libjpeg, cython, cftime
+}:
+buildPythonPackage rec {
+  pname = "netCDF4";
+  version = "1.6.0";
+
+  disabled = isPyPy;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-le+jc9mj4c0N9xk+duZoDZ7KKOYAl8qBOa/qikNGumM=";
+  };
+
+  checkInputs = [ pytest ];
+
+  buildInputs = [
+    cython
+  ];
+
+  propagatedBuildInputs = [
+    cftime
+    numpy
+    zlib
+    netcdf
+    hdf5
+    curl
+    libjpeg
+  ];
+
+  checkPhase = ''
+    py.test test/tst_*.py
+  '';
+
+  # Tests need fixing.
+  doCheck = false;
+
+  # 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;
+
+  meta = with lib; {
+    description = "Interface to netCDF library (versions 3 and 4)";
+    homepage = "https://pypi.python.org/pypi/netCDF4";
+    license = licenses.free;  # Mix of license (all MIT* like)
+  };
+}
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..e3071ea437d3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/netdata/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, poetry-core
+, httpx
+, pytest-asyncio
+, pytest-httpx
+, pytestCheckHook
+, yarl
+}:
+
+buildPythonPackage rec {
+  pname = "netdata";
+  version = "1.0.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "home-assistant-ecosystem";
+    repo = "python-netdata";
+    rev = version;
+    sha256 = "sha256-D0W+zOpD2+iynhHMZh4obUSJJKmP3DnzA7blNWi6eHk=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    httpx
+    yarl
+  ];
+
+  checkInputs = [
+    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";
+    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..0017483eca27
--- /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;
+    sha256 = "sha256-TbtZBILzd8zEYeAXQnB8y+jx0tGyhXivkdybf+vNy9I=";
+  };
+
+  propagatedBuildInputs = [ requests zeroconf ];
+
+  checkInputs = [ 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..dbc988191846
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/netio/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, requests
+, pyopenssl
+}:
+
+buildPythonPackage rec {
+  pname = "netio";
+  version = "1.0.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "Netio";
+    inherit version;
+    hash = "sha256-G1NSCchoRjgX2K9URNXsxpp9jxrQo0RgZ00tzWdexGU=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    pyopenssl
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "import py2exe" ""
+  '';
+
+  pythonImportsCheck = [
+    "Netio"
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Module for interacting with NETIO devices";
+    homepage = "https://github.com/netioproducts/PyNetio";
+    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..97a6b7fac0d7
--- /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.1.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-9e3iooZw09/TRwBhRoZl+A+bSQbtIOaw+02eHJvmevw=";
+  };
+
+  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..81d80dcd7b2e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nettigo-air-monitor/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, aiohttp
+, aioresponses
+, buildPythonPackage
+, dacite
+, fetchFromGitHub
+, pytest-asyncio
+, pytest-error-for-skips
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "nettigo-air-monitor";
+  version = "1.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "bieniu";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-O/HJTqmNmnx85AVuhRRxNqS1W0dZyKFSPVFqaBXAuhU=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    dacite
+  ];
+
+  checkInputs = [
+    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";
+    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..4e01e3ed6e8d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/netutils/default.nix
@@ -0,0 +1,58 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchFromGitHub
+, jinja2
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, toml
+}:
+
+buildPythonPackage rec {
+  pname = "netutils";
+  version = "1.2.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "networktocode";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-6FoadV5QMZCJnF/eD3FXRsyP4MymO5nayJ/54PJXOB4=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  checkInputs = [
+    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"
+  ];
+
+  meta = with lib; {
+    description = "Library that is a collection of objects for common network automation tasks";
+    homepage = "https://github.com/networktocode/netutils";
+    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..3acf8cdf6385
--- /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 = "2.8.4";
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-XlPwJ8DVZ88fiE27KDIk31JWROQ6/RFF1kydiKNYR2I=";
+  };
+
+  propagatedBuildInputs = [ decorator setuptools ];
+  checkInputs = [ 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/neuronpy/default.nix b/nixpkgs/pkgs/development/python-modules/neuronpy/default.nix
new file mode 100644
index 000000000000..2d388dfa4c27
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/neuronpy/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, numpy
+, matplotlib
+, scipy
+, isPy27
+}:
+
+buildPythonPackage rec {
+  pname = "neuronpy";
+  version = "0.1.6";
+  disabled = !isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1clhc2b5fy2l8nfrji4dagmj9419nj6kam090yqxhq5c28sngk25";
+  };
+
+  propagatedBuildInputs = [ numpy matplotlib scipy ];
+
+  #No tests included
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Interfaces and utilities for the NEURON simulator and analysis of neural data";
+    maintainers = [ maintainers.nico202 ];
+    license = licenses.mit;
+  };
+
+}
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..37586ccfcb47
--- /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 ];
+
+  checkInputs = [ 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/newversion/default.nix b/nixpkgs/pkgs/development/python-modules/newversion/default.nix
new file mode 100644
index 000000000000..f340dc3a1b32
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/newversion/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, packaging
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "newversion";
+  version = "1.8.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "vemel";
+    repo = pname;
+    rev = version;
+    hash = "sha256-27HWMzSzyAbiOW7OUhlupRWIVJG6DrpXObXmxlCsmxU=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    packaging
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    typing-extensions
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "newversion"
+  ];
+
+  meta = with lib; {
+    description = "PEP 440 version manager";
+    homepage = "https://github.com/vemel/newversion";
+    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..8aaa833d2f0a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nexia/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, aioresponses
+, buildPythonPackage
+, orjson
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, requests
+, requests-mock
+}:
+
+buildPythonPackage rec {
+  pname = "nexia";
+  version = "2.0.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "bdraco";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-JbWKNM7fNhIuBnIHAvRegAxmE0OOwsTDQWaMtuDVQcc=";
+  };
+
+  propagatedBuildInputs = [
+    orjson
+    requests
+  ];
+
+  checkInputs = [
+    aioresponses
+    requests-mock
+    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..d8e05f8459eb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nextcloudmonitor/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "nextcloudmonitor";
+  version = "1.2.0";
+
+  src = fetchFromGitHub {
+    owner = "meichthys";
+    repo = "nextcloud_monitor";
+    rev = "v${version}";
+    sha256 = "0b0c7gzx1d5kgbsfj1lbrqsirc5g5br6v8w2njaj1ys03kj669cx";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  # no tests implemented
+  doCheck = false;
+
+  pythonImportsCheck = [ "nextcloudmonitor" ];
+
+  meta = with lib; {
+    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..8f303acd8fa4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nextcord/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, substituteAll
+, ffmpeg
+, libopus
+, aiohttp
+, aiodns
+, brotli
+, cchardet
+, orjson
+, pynacl
+}:
+
+buildPythonPackage rec {
+  pname = "nextcord";
+  version = "2.0.0";
+
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "nextcord";
+    repo = "nextcord";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-MjpWPirupXoSnvnRNePx4hUTbiWHcL2bwUOoZAvN7pU=";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./paths.patch;
+      ffmpeg = "${ffmpeg}/bin/ffmpeg";
+      libopus = "${libopus}/lib/libopus${stdenv.hostPlatform.extensions.sharedLibrary}";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    aiodns
+    aiohttp
+    brotli
+    cchardet
+    orjson
+    pynacl
+  ];
+
+  # upstream has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "nextcord"
+    "nextcord.ext.commands"
+    "nextcord.ext.tasks"
+  ];
+
+  meta = with lib; {
+    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..b5c9ce4f77a7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nextcord/paths.patch
@@ -0,0 +1,71 @@
+diff --git a/nextcord/opus.py b/nextcord/opus.py
+index 52e4ddbd..d8b8090b 100644
+--- a/nextcord/opus.py
++++ b/nextcord/opus.py
+@@ -255,7 +255,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 5d0674cc..fd1c20ef 100644
+--- a/nextcord/player.py
++++ b/nextcord/player.py
+@@ -148,7 +148,7 @@ class FFmpegAudio(AudioSource):
+         self,
+         source: Union[str, io.BufferedIOBase],
+         *,
+-        executable: str = "ffmpeg",
++        executable: str = "@ffmpeg@",
+         args: Any,
+         **subprocess_kwargs: Any,
+     ):
+@@ -275,7 +275,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,
+@@ -378,7 +378,7 @@ class FFmpegOpusAudio(FFmpegAudio):
+         *,
+         bitrate: int = 128,
+         codec: Optional[str] = None,
+-        executable: str = "ffmpeg",
++        executable: str = "@ffmpeg@",
+         pipe=False,
+         stderr=None,
+         before_options=None,
+@@ -532,7 +532,7 @@ class FFmpegOpusAudio(FFmpegAudio):
+         """
+ 
+         method = method or "native"
+-        executable = executable or "ffmpeg"
++        executable = executable or "@ffmpeg@"
+         probefunc = fallback = None
+ 
+         if isinstance(method, str):
+@@ -577,7 +577,7 @@ 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
+         args = [
+@@ -606,7 +606,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..c99e7c909cbb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nextdns/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, aiohttp
+, aioresponses
+, buildPythonPackage
+, fetchFromGitHub
+, orjson
+, pytest-asyncio
+, pytest-error-for-skips
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "nextdns";
+  version = "1.0.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "bieniu";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-joPg5XZ5qEDnON96XCy5j4/OC+EkFw09Db4TH+ThsTY=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    orjson
+  ];
+
+  checkInputs = [
+    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";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..b83091cc1dad
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/niapy/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, matplotlib
+, numpy
+, openpyxl
+, pandas
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "niapy";
+  version = "2.0.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "NiaOrg";
+    repo = "NiaPy";
+    rev = version;
+    hash = "sha256-b/0TEO27fPuoPzkNBCwgUqBG+8htOR2ipFikpqjYdnM=";
+  };
+
+  propagatedBuildInputs = [
+    matplotlib
+    numpy
+    openpyxl
+    pandas
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "niapy"
+  ];
+
+  meta = with lib; {
+    description = "Micro framework for building nature-inspired algorithms";
+    homepage = "https://niapy.org/";
+    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..af7564921695
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nibabel/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, packaging
+, pytestCheckHook
+, nose
+, numpy
+, h5py
+, pydicom
+, scipy
+}:
+
+buildPythonPackage rec {
+  pname = "nibabel";
+  version = "4.0.1";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-Ih83OjgAWpEcViOWBw1ngu3zTuNsVguWrj/m3Q7VxGI=";
+  };
+
+  propagatedBuildInputs = [ numpy scipy h5py packaging pydicom ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  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/nidaqmx/default.nix b/nixpkgs/pkgs/development/python-modules/nidaqmx/default.nix
new file mode 100644
index 000000000000..60c9f271011c
--- /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
+  ];
+
+  checkInputs = [
+    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..a7a696384dfb
--- /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.2.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "NoUseFreak";
+    repo = pname;
+    rev = version;
+    sha256 = "0ah02dfnnbk98grvd180fp9rak5gpi58xiql1yyzig5pcbjidvk3";
+  };
+
+  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/nilearn/default.nix b/nixpkgs/pkgs/development/python-modules/nilearn/default.nix
new file mode 100644
index 000000000000..121b204d5c32
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nilearn/default.nix
@@ -0,0 +1,34 @@
+{ lib, buildPythonPackage, fetchPypi, pytestCheckHook, matplotlib
+, nibabel, numpy, pandas, scikit-learn, scipy, joblib, requests }:
+
+buildPythonPackage rec {
+  pname = "nilearn";
+  version = "0.9.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-3YIbT/KzuH9eSwNOoPlfzkN1rOWG3o7Rfmpme94ZJdc=";
+  };
+
+  checkInputs = [ 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
+    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";
+    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..eb04e0c4d89d
--- /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 ];
+  checkInputs = [ 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/nipy/default.nix b/nixpkgs/pkgs/development/python-modules/nipy/default.nix
new file mode 100644
index 000000000000..5bdf6fdcd443
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nipy/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, 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";
+  };
+
+  buildInputs = lib.optional doCheck [ nose ];
+  propagatedBuildInputs = [ matplotlib nibabel numpy scipy sympy ];
+
+  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..42d05d24775b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nipype/default.nix
@@ -0,0 +1,115 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPy27
+# python dependencies
+, click
+, python-dateutil
+, etelemetry
+, filelock
+, funcsigs
+, future
+, mock
+, networkx
+, nibabel
+, numpy
+, packaging
+, prov
+, psutil
+, pybids
+, pydot
+, pytest
+, pytest-xdist
+, pytest-forked
+, rdflib
+, scipy
+, simplejson
+, traits
+, xvfbwrapper
+, pytest-cov
+, codecov
+, sphinx
+# 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
+}:
+
+let
+
+ # This is a temporary convenience package for changes waiting to be merged into the primary rdflib repo.
+ neurdflib = callPackage ./neurdflib.nix { };
+
+in
+
+buildPythonPackage rec {
+  pname = "nipype";
+  version = "1.8.3";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-Z/qa0NotxWFzweFHRm/MbJImivV8AZl68yiQ1jNvcAQ=";
+  };
+
+  postPatch = ''
+    substituteInPlace nipype/interfaces/base/tests/test_core.py \
+      --replace "/usr/bin/env bash" "${bash}/bin/bash"
+  '';
+
+  nativeBuildInputs = [
+    sphinx
+  ];
+
+  propagatedBuildInputs = [
+    click
+    python-dateutil
+    etelemetry
+    filelock
+    funcsigs
+    future
+    networkx
+    nibabel
+    numpy
+    packaging
+    prov
+    psutil
+    pydot
+    scipy
+    simplejson
+    traits
+    xvfbwrapper
+  ] ++ [ (if useNeurdflib then neurdflib else rdflib) ];
+
+  checkInputs = [
+    pybids
+    codecov
+    glibcLocales
+    mock
+    pytest
+    pytest-forked
+    pytest-xdist
+    pytest-cov
+    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'
+  '';
+  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/nipype/neurdflib.nix b/nixpkgs/pkgs/development/python-modules/nipype/neurdflib.nix
new file mode 100644
index 000000000000..8095b0fb0401
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nipype/neurdflib.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isodate
+, html5lib
+, sparqlwrapper
+, networkx
+, nose
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "neurdflib";
+  version = "5.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d34493cee15029ff5db16157429585ff863ba5542675a4d8a94a0da1bc6e3a50";
+  };
+
+  propagatedBuildInputs = [ isodate html5lib sparqlwrapper ];
+
+  checkInputs = [ networkx nose ];
+
+  # Python 2 syntax
+  # Failing doctest
+  doCheck = false;
+
+  checkPhase = ''
+    ${python.interpreter} run_tests.py
+  '';
+
+  meta = with lib; {
+    description = "A temporary convenience package for changes waiting to be merged into the primary rdflib repo";
+    homepage = "https://pypi.org/project/neurdflib";
+    license = licenses.bsd3;
+  };
+}
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..183e003d2860
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nitime/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, pytestCheckHook
+, cython
+, numpy
+, scipy
+, matplotlib
+, networkx
+, nibabel
+}:
+
+buildPythonPackage rec {
+  pname = "nitime";
+  version = "0.9";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-bn2QrbsfqUJim84vH5tt5T6h3YsGAlgu9GCMiNQ0OHQ=";
+  };
+
+  checkInputs = [ pytestCheckHook ];
+  buildInputs = [ cython ];
+  propagatedBuildInputs = [ numpy scipy matplotlib networkx nibabel ];
+
+  disabledTests = [
+    # https://github.com/nipy/nitime/issues/197
+    "test_FilterAnalyzer"
+  ];
+
+  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..695c674e0dce
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nitransforms/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, h5py
+, nibabel
+, numpy
+, setuptools-scm
+, toml
+}:
+
+buildPythonPackage rec {
+  pname = "nitransforms";
+  version = "22.0.0";
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-iV9TEIGogIfbj+fmOGftoQqEdtZiewbHEw3hYlMEP4c=";
+  };
+
+  buildInputs = [ setuptools-scm toml ];
+  propagatedBuildInputs = [ h5py nibabel numpy ];
+
+  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";
+    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..5758e60fa3fc
--- /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; [ costrouc ];
+  };
+}
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..6b5b42e368cf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nix-prefetch-github/default.nix
@@ -0,0 +1,36 @@
+{ fetchFromGitHub
+, lib
+, buildPythonPackage
+, git
+, which
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "nix-prefetch-github";
+  version = "5.2.1";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "seppeljordan";
+    repo = "nix-prefetch-github";
+    rev = "v${version}";
+    sha256 = "etmlRavPzJKLmyw3PYMgeMveFj4aVi38crHjdtDuaLg=";
+  };
+
+  checkInputs = [ git which ];
+
+  checkPhase = ''
+    python -m unittest discover
+  '';
+  # 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..401c48141160
--- /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 = [ maintainers.costrouc ];
+  };
+}
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..fa094404b8b1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nkdfu/default.nix
@@ -0,0 +1,31 @@
+{ lib, buildPythonPackage, fetchPypi, fire, tqdm, intelhex, libusb1 }:
+
+buildPythonPackage rec {
+  pname = "nkdfu";
+  version = "0.1";
+  format = "flit";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-Y8GonfCBi3BNMhZ99SN6/SDSa0+dbfPIMPoVzALwH5A=";
+  };
+
+  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/nltk/default.nix b/nixpkgs/pkgs/development/python-modules/nltk/default.nix
new file mode 100644
index 000000000000..9beeb4cb0a69
--- /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.7";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    hash = "sha256-1lB9ZGDOx21wr+pCQqImp1QvhcZpF3ucf1YrfPGwVQI=";
+  };
+
+  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..a19dd946b8fd
--- /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=";
+  };
+
+  checkInputs = [
+    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..bea2d9c2c2f0
--- /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 = "1.0.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-fBEdpM79JEQzy2M3ev8IGkD4S92unm83bGfwhsD4Bto=";
+  };
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  checkInputs = [
+    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..083174c824dc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nocaselist/default.nix
@@ -0,0 +1,28 @@
+{ lib, buildPythonPackage, fetchPypi
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "nocaselist";
+  version = "1.0.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-SPBn+MuEEkXzTQMSC8G6mQDxOxnLUbzGx77gF/fIdNo=";
+  };
+
+  checkInputs = [
+    pytest
+  ];
+
+  pythonImportsCheck = [
+    "nocaselist"
+  ];
+
+  meta = with lib; {
+    description = "A case-insensitive list for Python";
+    homepage = "https://github.com/pywbem/nocaselist";
+    license = licenses.lgpl21Plus;
+    maintainers = with maintainers; [ freezeboy ];
+  };
+}
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..276011e65ea6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/node-semver/default.nix
@@ -0,0 +1,20 @@
+{ lib, fetchPypi, buildPythonPackage, pytest }:
+
+buildPythonPackage rec {
+  version = "0.8.1";
+  pname = "node-semver";
+
+  checkInputs = [ pytest ];
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "281600d009606f4f63ddcbe148992e235b39a69937b9c20359e2f4a2adbb1e00";
+  };
+
+  meta = with lib; {
+    homepage = "https://github.com/podhmo/python-semver";
+    description = "A port of node-semver";
+    license = licenses.mit;
+    platforms = platforms.all;
+  };
+}
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..d08fcf4699ab
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nodeenv/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, mock
+, pytestCheckHook
+, python
+, pythonOlder
+, setuptools
+, which
+}:
+
+buildPythonPackage rec {
+  pname = "nodeenv";
+  version = "1.7.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "ekalinin";
+    repo = pname;
+    rev = version;
+    hash = "sha256-X30PUiOMT/vXqmdSJKHTNNA8aLWavCUaKa7LzqkdLrk=";
+  };
+
+  propagatedBuildInputs = [
+    setuptools
+  ];
+
+  checkInputs = [
+    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";
+    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..76ed1b1fc2a0
--- /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 ];
+
+  checkInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "noise" ];
+
+  meta = with lib; {
+    description = "Noise Protocol Framework";
+    homepage = "https://github.com/plizonczyk/noiseprotocol/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..33af46900375
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nomadnet/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, rns
+, fetchFromGitHub
+, lxmf
+, urwid
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "nomadnet";
+  version = "0.2.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "markqvist";
+    repo = "NomadNet";
+    rev = version;
+    hash = "sha256-VNfsuCN251C+6uvywosHmuz76f263wCeIisQldvFRVg=";
+  };
+
+  propagatedBuildInputs = [
+    rns
+    lxmf
+    urwid
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "nomadnet"
+  ];
+
+  meta = with lib; {
+    description = "Off-grid, resilient mesh communication";
+    homepage = "https://github.com/markqvist/NomadNet";
+    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..a91489f1aded
--- /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
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "normality"
+  ];
+
+  meta = with lib; {
+    description = "Micro-library to normalize text strings";
+    homepage = "https://github.com/pudo/normality";
+    license = licenses.mit;
+    maintainers = teams.determinatesystems.members;
+  };
+}
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..94f64028d669
--- /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";
+  };
+
+  checkInputs = [ 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 = [ maintainers.costrouc ];
+  };
+}
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..bbc164c85e2b
--- /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 ];
+
+  checkInputs = [
+    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..31fd824ee3da
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nose/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+, coverage
+}:
+
+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
+      ((python.isPy3k or false) && (python.pname != "pypy3"))
+  ''
+    2to3 -wn nose functional_tests unit_tests
+  '';
+
+  propagatedBuildInputs = [ coverage ];
+
+  doCheck = false;  # lot's of transient errors, too much hassle
+  checkPhase = if python.is_py3k or false then ''
+    ${python}/bin/${python.executable} setup.py build_tests
+  '' else "" + ''
+    rm functional_tests/test_multiprocessing/test_concurrent_shared.py* # see https://github.com/nose-devs/nose/commit/226bc671c73643887b36b8467b34ad485c2df062
+    ${python}/bin/${python.executable} selftest.py
+  '';
+
+  meta = with lib; {
+    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..b3dfdda218f3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nose2/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+, six
+, pythonOlder
+, coverage
+}:
+
+buildPythonPackage rec {
+  pname = "nose2";
+  version = "0.12.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-lW55ub1VjuCLYgDAWtLHZGW344YMDAU3aGCJKFwyARM=";
+  };
+
+  propagatedBuildInputs = [
+    coverage
+    six
+  ];
+
+  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/nose_progressive/default.nix b/nixpkgs/pkgs/development/python-modules/nose_progressive/default.nix
new file mode 100644
index 000000000000..fb9a8e61bdae
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nose_progressive/default.nix
@@ -0,0 +1,34 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchPypi
+, nose
+, pillow
+, blessings
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "nose-progressive";
+  version = "1.5.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1mzmgq0wnfizmg9m2wn0c9g9282rdgv1jnphp8ww5h8kwqrjhvis";
+  };
+
+  buildInputs = [ nose ];
+  propagatedBuildInputs = [ pillow blessings ];
+
+  # fails with obscure error
+  doCheck = !isPy3k;
+
+  meta = with lib; {
+    homepage = "https://github.com/erikrose/nose-progressive";
+    description = "A testrunner with a progress bar and smarter tracebacks";
+    license = licenses.mit;
+    maintainers = with maintainers; [ domenkozar ];
+    broken = true; # relies on 2to3 conversion, which was removed from setuptools>=58.0
+  };
+
+}
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..81e7de8815ee
--- /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 ];
+
+  checkInputs = [ 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..f80953bd2d71
--- /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";
+  };
+
+  checkInputs = [ 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..a37e0cb3c679
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/notebook-shim/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, jupyter_server
+, pytestCheckHook
+, pytest-tornasync
+}:
+
+buildPythonPackage rec {
+  pname = "notebook-shim";
+  version = "0.1.0";
+
+  src = fetchFromGitHub {
+    owner = "jupyter";
+    repo = "notebook_shim";
+    rev = "v${version}";
+    sha256 = "sha256-5oIYj8SdC4E0N/yFxsmD2p4VkStHvqrVqAwb/htyPm4=";
+  };
+
+  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;
+
+  checkInputs = [
+    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..4efaaf3f9ec9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/notebook/default.nix
@@ -0,0 +1,91 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchPypi
+, argon2-cffi
+, nose
+, nose_warnings_filters
+, glibcLocales
+, isPy3k
+, mock
+, jinja2
+, tornado
+, ipython_genutils
+, traitlets
+, jupyter_core
+, jupyter-client
+, nbformat
+, nbconvert
+, ipykernel
+, terminado
+, requests
+, send2trash
+, pexpect
+, prometheus-client
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "notebook";
+  version = "6.4.12";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-YmjJ7JBIz/ekVAXJkMKaycpAsLw+wpJj0hjF4B8rToY=";
+  };
+
+  LC_ALL = "en_US.utf8";
+
+  checkInputs = [ nose pytestCheckHook glibcLocales ]
+    ++ (if isPy3k then [ nose_warnings_filters ] else [ mock ]);
+
+  propagatedBuildInputs = [
+    jinja2 tornado ipython_genutils traitlets jupyter_core send2trash
+    jupyter-client nbformat nbconvert ipykernel terminado requests pexpect
+    prometheus-client argon2-cffi
+  ];
+
+  # disable warning_filters
+  preCheck = lib.optionalString (!isPy3k) ''
+    echo "" > setup.cfg
+  '';
+
+  postPatch = ''
+    # Remove selenium tests
+    rm -rf notebook/tests/selenium
+    export HOME=$TMPDIR
+  '';
+
+  disabledTests = [
+    # a "system_config" is generated, and fails many tests
+    "config"
+    "load_ordered"
+    # requires jupyter, but will cause circular imports
+    "test_run"
+    "TestInstallServerExtension"
+    "launch_socket"
+    "sock_server"
+    "test_list_formats" # tries to find python MIME type
+    "KernelCullingTest" # has a race condition failing on slower hardware
+  ] ++ lib.optional stdenv.isDarwin [
+    "test_delete"
+    "test_checkpoints_follow_file"
+  ];
+
+  disabledTestPaths = lib.optionals stdenv.isDarwin [
+    # requires local networking
+    "notebook/auth/tests/test_login.py"
+    "notebook/bundler/tests/test_bundler_api.py"
+  ];
+
+  # Some of the tests use localhost networking.
+  __darwinAllowLocalNetworking = true;
+
+  meta = {
+    description = "The Jupyter HTML notebook is a web-based notebook environment for interactive computing";
+    homepage = "https://jupyter.org/";
+    license = lib.licenses.bsd3;
+    maintainers = with lib.maintainers; [ fridh ];
+  };
+}
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-python-client/default.nix b/nixpkgs/pkgs/development/python-modules/notifications-python-client/default.nix
new file mode 100644
index 000000000000..1f59b808912f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/notifications-python-client/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, docopt
+, fetchFromGitHub
+, freezegun
+, mock
+, pyjwt
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+, requests
+, requests-mock
+}:
+
+buildPythonPackage rec {
+  pname = "notifications-python-client";
+  version = "6.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "alphagov";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-pfOTVgsfXJQ9GIGowra3RAwxCri76RgnA9iyWbjomCk=";
+  };
+
+  propagatedBuildInputs = [
+    docopt
+    pyjwt
+    requests
+  ];
+
+  checkInputs = [
+    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";
+    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..6d255424812e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/notify-py/default.nix
@@ -0,0 +1,78 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, isPy3k
+, fetchFromGitHub
+, substituteAll
+, alsa-utils
+, libnotify
+, which
+, jeepney
+, loguru
+, pytest
+, dbus
+, coreutils
+}:
+
+buildPythonPackage rec {
+  pname = "notify-py";
+  version = "0.3.3";
+
+  disabled = !isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "ms7m";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1n35adwsyhz304n4ifnsz6qzkymwhyqc8sg8d76qv5psv2xsnzlf";
+  };
+
+  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";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    loguru
+  ] ++ lib.optionals stdenv.isLinux [
+    jeepney
+  ];
+
+  checkInputs = [
+    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.daemon}/share/dbus-1/session.conf \
+      pytest
+  '' else ''
+    pytest
+  '';
+
+  pythonImportsCheck = [ "notifypy" ];
+
+  meta = with lib; {
+    description = "Cross-platform desktop notification library for Python";
+    homepage = "https://github.com/ms7m/notify-py";
+    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..f043ec14a467
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/notify-py/linux-paths.patch
@@ -0,0 +1,54 @@
+diff --git a/notifypy/os_notifiers/linux.py b/notifypy/os_notifiers/linux.py
+index ee89216..5201574 100644
+--- a/notifypy/os_notifiers/linux.py
++++ b/notifypy/os_notifiers/linux.py
+@@ -53,30 +53,12 @@ class LinuxNotifierLibNotify(BaseNotifier):
+     @staticmethod
+     def _find_installed_aplay():
+         """Function to find the path for notify-send"""
+-        try:
+-            run_which_for_aplay = subprocess.check_output(["which", "aplay"])
+-            return run_which_for_aplay.decode("utf-8")
+-        except subprocess.CalledProcessError:
+-            logger.exception("Unable to find aplay.")
+-            return False
+-        except Exception:
+-            logger.exception("Unhandled exception for finding aplay.")
+-            return False
++        return "@aplay@"
+ 
+     @staticmethod
+     def _find_installed_notify_send():
+         """Function to find the path for notify-send"""
+-        try:
+-            run_which_for_notify_send = subprocess.check_output(
+-                ["which", "notify-send"]
+-            )
+-            return run_which_for_notify_send.decode("utf-8")
+-        except subprocess.CalledProcessError:
+-            logger.exception("Unable to find notify-send.")
+-            return False
+-        except Exception:
+-            logger.exception("Unhandled exception for finding notify-send.")
+-            return False
++        return "@notifysend@"
+ 
+     def send_notification(
+         self,
+@@ -159,15 +141,7 @@ class LinuxNotifier(BaseNotifier):
+     @staticmethod
+     def _find_installed_aplay():
+         """Function to find the path for notify-send"""
+-        try:
+-            run_which_for_aplay = subprocess.check_output(["which", "aplay"])
+-            return run_which_for_aplay.decode("utf-8")
+-        except subprocess.CalledProcessError:
+-            logger.exception("Unable to find aplay.")
+-            return False
+-        except Exception:
+-            logger.exception("Unhandled exception for finding aplay.")
+-            return False
++        return "@aplay@"
+ 
+     def send_notification(
+         self,
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/notifymuch/default.nix b/nixpkgs/pkgs/development/python-modules/notifymuch/default.nix
new file mode 100644
index 000000000000..bc1610e2ca94
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/notifymuch/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonApplication
+, isPy3k
+, fetchFromGitHub
+, notmuch
+, pygobject3
+, gobject-introspection
+, libnotify
+, wrapGAppsHook
+, gtk3
+}:
+
+buildPythonApplication rec {
+  pname = "notifymuch";
+  version = "0.1";
+  disabled = !isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "kspi";
+    repo = "notifymuch";
+    # https://github.com/kspi/notifymuch/issues/11
+    rev = "9d4aaf54599282ce80643b38195ff501120807f0";
+    sha256 = "1lssr7iv43mp5v6nzrfbqlfzx8jcc7m636wlfyhhnd8ydd39n6k4";
+  };
+
+  propagatedBuildInputs = [
+    notmuch
+    pygobject3
+    libnotify
+    gtk3
+  ];
+
+  nativeBuildInputs = [
+    gobject-introspection
+    wrapGAppsHook
+  ];
+
+  dontWrapGApps = true;
+
+  preFixup = ''
+    makeWrapperArgs+=("''${gappsWrapperArgs[@]}")
+  '';
+
+  strictDeps = false;
+
+  meta = with lib; {
+    description = "Display desktop notifications for unread mail in a notmuch database";
+    homepage = "https://github.com/kspi/notifymuch";
+    maintainers = with maintainers; [ arjan-s ];
+    license = licenses.gpl3;
+  };
+}
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..70c422b08b27
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/notmuch2/default.nix
@@ -0,0 +1,35 @@
+{ stdenv
+, lib
+
+, buildPythonPackage
+, notmuch
+, python
+, cffi
+}:
+
+buildPythonPackage {
+  pname = "notmuch2";
+  inherit (notmuch) version src;
+
+  sourceRoot = "notmuch-${notmuch.version}/bindings/python-cffi";
+
+  buildInputs = [ python notmuch cffi ];
+
+  # since notmuch 0.35, this package expects _notmuch_config.py that is
+  # generated by notmuch's configure script
+  postPatch = ''
+    cp ${notmuch.bindingconfig}/_notmuch_config.py .
+  '';
+
+  # no tests
+  doCheck = false;
+  pythonImportsCheck = [ "notmuch2" ];
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    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..dbf01f3698d5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/notus-scanner/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, paho-mqtt
+, poetry-core
+, psutil
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "notus-scanner";
+  version = "unstable-2021-09-05";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "greenbone";
+    repo = pname;
+    rev = "049f9a5e6439e4e5113e3b8f30b25ead12d42a56";
+    sha256 = "1fjxyn8wg2kf6xy3pbh7d7yn20dk529p03xpqyz7s40n9nsxhnza";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    paho-mqtt
+    psutil
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  patches = [
+    # Switch to poetry-core, https://github.com/greenbone/notus-scanner/pull/31
+    (fetchpatch {
+      name = "switch-to-poetry-core.patch";
+      url = "https://github.com/greenbone/notus-scanner/commit/b52eea317faca30d411096044f9e5ea20b58da65.patch";
+      sha256 = "0q11aslhva47kkpsnpayra7spa849j894vqv34pjqhcnlyipqw6d";
+    })
+  ];
+
+  pythonImportsCheck = [ "notus.scanner" ];
+
+  meta = with lib; {
+    description = "Helper to create results from local security checks";
+    homepage = "https://github.com/greenbone/notus-scanner";
+    license = with licenses; [ agpl3Plus ];
+    maintainers = with maintainers; [ 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..13e0d28a3017
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nplusone/default.nix
@@ -0,0 +1,83 @@
+{ lib
+, blinker
+, buildPythonPackage
+, 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
+  ];
+
+  checkInputs = [
+    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;
+  };
+}
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/ntc-templates/default.nix b/nixpkgs/pkgs/development/python-modules/ntc-templates/default.nix
new file mode 100644
index 000000000000..a188daf6b428
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ntc-templates/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, poetry-core
+, textfsm
+, pytestCheckHook
+, ruamel-yaml
+, yamllint
+}:
+
+buildPythonPackage rec {
+  pname = "ntc-templates";
+  version = "3.0.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "networktocode";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0kijzmmvq2rw7ima19w7lyb2p26a5w52k70fzbkaqqw78qzw8178";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    textfsm
+  ];
+
+  checkInputs = [
+    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";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ntlm-auth/default.nix b/nixpkgs/pkgs/development/python-modules/ntlm-auth/default.nix
new file mode 100644
index 000000000000..d56fccde051d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ntlm-auth/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, cryptography
+, fetchFromGitHub
+, mock
+, pytestCheckHook
+, requests
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "ntlm-auth";
+  version = "1.5.0";
+
+  src = fetchFromGitHub {
+    owner = "jborean93";
+    repo = "ntlm-auth";
+    rev = "v${version}";
+    sha256 = "00dpf5bfsy07frsjihv1k10zmwcyq4bvkilbxha7h6nlwpcm2409";
+  };
+
+  propagatedBuildInputs = [
+    cryptography
+    six
+  ];
+
+  checkInputs = [
+    mock
+    pytestCheckHook
+    requests
+  ];
+
+  pythonImportsCheck = [ "ntlm_auth" ];
+
+  meta = with lib; {
+    description = "Calculates NTLM Authentication codes";
+    homepage = "https://github.com/jborean93/ntlm-auth";
+    license = licenses.mit;
+    maintainers = with maintainers; [ elasticdog ];
+    platforms = platforms.all;
+  };
+}
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/nuitka/default.nix b/nixpkgs/pkgs/development/python-modules/nuitka/default.nix
new file mode 100644
index 000000000000..127f1fcbedf6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nuitka/default.nix
@@ -0,0 +1,53 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, vmprof
+, pyqt4
+, isPyPy
+, pkgs
+, scons
+, chrpath
+}:
+
+buildPythonPackage rec {
+  version = "0.6.14.5";
+  pname = "Nuitka";
+
+  # Latest version is not yet on PyPi
+  src = fetchFromGitHub {
+    owner = "kayhayen";
+    repo = "Nuitka";
+    rev = version;
+    sha256 = "08kcp22zdgp25kk4bp56z196mn6bdi3z4x0q2y9vyz0ywfzp9zap";
+  };
+
+  checkInputs = [ vmprof pyqt4 ];
+  nativeBuildInputs = [ scons ];
+  propagatedBuildInputs = [ chrpath ];
+
+  postPatch = ''
+    patchShebangs tests/run-tests
+  '' + lib.optionalString stdenv.isLinux ''
+    substituteInPlace nuitka/plugins/standard/ImplicitImports.py --replace 'locateDLL("uuid")' '"${lib.getLib pkgs.util-linux}/lib/libuuid.so"'
+  '';
+
+  # We do not want any wrappers here.
+  postFixup = "";
+
+  checkPhase = ''
+    tests/run-tests
+  '';
+
+  # Problem with a subprocess (parts)
+  doCheck = false;
+
+  # 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..1f354e422488
--- /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";
+  };
+
+  checkInputs = [
+    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..8679da592cb6
--- /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.11";
+  pname = "num2words";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-bGhOIiDYrbNhLSyAepdyzDJplj+81395ebaJp39gQ9Q=";
+  };
+
+  propagatedBuildInputs = [ docopt ];
+
+  checkInputs = [ 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..cd01bce1d135
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/numba-scipy/default.nix
@@ -0,0 +1,50 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchPypi
+, scipy
+, numba
+, pytestCheckHook
+, pythonOlder
+}:
+
+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
+  ];
+
+  postPatch = ''
+    # https://github.com/numba/numba-scipy/pull/76
+    substituteInPlace setup.py \
+      --replace "scipy>=0.16,<=1.6.2" "scipy>=0.16"
+  '';
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  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..275eeb1ccab6
--- /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 b9988bc..a642680 100644
+--- a/numba/cuda/cuda_paths.py
++++ b/numba/cuda/cuda_paths.py
+@@ -24,10 +24,7 @@ def _find_valid_path(options):
+ 
+ def _get_libdevice_path_decision():
+     options = [
+-        ('Conda environment', get_conda_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
+@@ -35,18 +32,16 @@ def _get_libdevice_path_decision():
+ 
+ def _nvvm_lib_dir():
+     if IS_WIN32:
+-        return 'nvvm', 'bin'
++        return 'bin',
+     elif IS_OSX:
+-        return 'nvvm', 'lib'
++        return 'lib',
+     else:
+-        return 'nvvm', 'lib64'
++        return 'lib64',
+ 
+ 
+ def _get_nvvm_path_decision():
+     options = [
+-        ('Conda environment', get_conda_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
+@@ -74,14 +69,12 @@ def _cudalib_path():
+     elif IS_OSX:
+         return 'lib'
+     else:
+-        return 'lib64'
++        return 'lib'
+ 
+ 
+ def _get_cudalib_dir_path_decision():
+     options = [
+-        ('Conda environment', get_conda_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
+@@ -92,6 +85,22 @@ def _get_cudalib_dir():
+     return _env_path_tuple(by, libdir)
+ 
+ 
++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)
++
++
+ def get_system_ctk(*subdirs):
+     """Return path to system-wide cudatoolkit; or, None if it doesn't exist.
+     """
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..9953ddec3690
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/numba/default.nix
@@ -0,0 +1,91 @@
+{ lib
+, stdenv
+, pythonAtLeast
+, pythonOlder
+, fetchPypi
+, python
+, buildPythonPackage
+, numpy
+, llvmlite
+, setuptools
+, libcxx
+, substituteAll
+
+# CUDA-only dependencies:
+, addOpenGLRunpath ? null
+, cudaPackages ? {}
+
+# CUDA flags:
+, cudaSupport ? false
+}:
+
+let
+  inherit (cudaPackages) cudatoolkit;
+in buildPythonPackage rec {
+  version = "0.55.2";
+  pname = "numba";
+  disabled = pythonOlder "3.6" || pythonAtLeast "3.11";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-5CjZ4R2bpZKEnMyfegCQA+t9MGEgB+Nlr+dDznEYxvQ=";
+  };
+
+  postPatch = ''
+    # numpy
+    substituteInPlace setup.py \
+      --replace "1.23" "2"
+
+    substituteInPlace numba/__init__.py \
+      --replace "(1, 22)" "(2, 0)"
+  '';
+
+  NIX_CFLAGS_COMPILE = lib.optionalString stdenv.isDarwin "-I${lib.getDev libcxx}/include/c++/v1";
+
+  propagatedBuildInputs = [
+    numpy
+    llvmlite
+    setuptools
+  ] ++ lib.optionals cudaSupport [
+    cudatoolkit
+    cudatoolkit.lib
+  ];
+
+  nativeBuildInputs = lib.optional cudaSupport [
+    addOpenGLRunpath
+  ];
+
+  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
+  '';
+
+  # Copy test script into $out and run the test suite.
+  checkPhase = ''
+    ${python.interpreter} -m numba.runtests
+  '';
+
+  # ImportError: cannot import name '_typeconv'
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "numba"
+  ];
+
+  meta =  with lib; {
+    description = "Compiling Python code using LLVM";
+    homepage = "https://numba.pydata.org/";
+    license = licenses.bsd2;
+    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..438a54127a07
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/numcodecs/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, setuptools-scm
+, cython
+, numpy
+, msgpack
+, pytestCheckHook
+, python
+, gcc8
+}:
+
+buildPythonPackage rec {
+  pname = "numcodecs";
+  version = "0.10.0";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-LdQlZOd3KpOFkjsCo2Pjzt8FPOkwlKkGRIXn9ppvHJI=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+    cython
+    gcc8
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    msgpack
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "$out/${python.sitePackages}/numcodecs"
+  ];
+
+  disabledTests = [
+    "test_backwards_compatibility"
+
+    "test_encode_decode"
+    "test_legacy_codec_broken"
+    "test_bytes"
+  ];
+
+  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 = [ maintainers.costrouc ];
+  };
+}
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..bc5914be721c
--- /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.40";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "pbrod";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-YLi9cNHcZ/PlhrhvYOMfRTOt4kinQcfxvqInT8/0Qpg=";
+  };
+
+  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..8e2f630fdba6
--- /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 = [ maintainers.costrouc ];
+  };
+}
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..6c76a8fc88ee
--- /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.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-y2R8nZx4Xa4HWb9sh1zeK+xHK1w/emAVc0sWGudm0UE=";
+  };
+
+  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..c4877e839cd1
--- /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 = "2.17.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-NskgGS9EXdV/CRpjYpvdpaknTUdROjOsLvrRJzc5S3o=";
+  };
+
+  propagatedBuildInputs = [
+    cython
+    enum34
+    nine
+    numpy
+    python-utils
+  ];
+
+  checkInputs = [
+    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..68add2cdc26c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/numpy/default.nix
@@ -0,0 +1,115 @@
+{ lib
+, fetchPypi
+, fetchpatch
+, python
+, buildPythonPackage
+, gfortran
+, hypothesis
+, pytest
+, typing-extensions
+, blas
+, lapack
+, writeTextFile
+, cython
+, setuptoolsBuildHook
+, pythonOlder
+}:
+
+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";
+
+  # Attention! v1.22.0 breaks scipy and by extension scikit-learn, so
+  # build both to verify they don't break.
+  # https://github.com/scipy/scipy/issues/15414
+  version = "1.23.1";
+
+  format = "pyproject.toml";
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "tar.gz";
+    hash = "sha256-10jvNJv+8uEZS1naN+1aKcGeqNfmNCAZkhuiuk/YtiQ=";
+  };
+
+  patches = lib.optionals python.hasDistutilsCxxPatch [
+    # 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.
+    ./numpy-distutils-C++.patch
+  ];
+
+  nativeBuildInputs = [ gfortran cython setuptoolsBuildHook ];
+  buildInputs = [ blas lapack ];
+
+  # 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 NPY_NUM_BUILD_JOBS=$NIX_BUILD_CORES
+    export OMP_NUM_THREADS=$((NIX_BUILD_CORES > 64 ? 64 : NIX_BUILD_CORES))
+  '';
+
+  preBuild = ''
+    ln -s ${cfg} site.cfg
+  '';
+
+  enableParallelBuilding = true;
+
+  checkInputs = [
+    pytest
+    hypothesis
+    typing-extensions
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+    pushd dist
+    ${python.interpreter} -c 'import numpy; numpy.test("fast", verbose=10)'
+    popd
+    runHook postCheck
+  '';
+
+  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
+  NOSE_EXCLUDE="test_large_file_support";
+
+  meta = {
+    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/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..9eebc8c39a48
--- /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.4.0";
+  format = "setuptools";
+
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname;
+    inherit version;
+    sha256 = "sha256-lJTa8cdhL1mQX6CeZcm4qQu6yzgE2R96lOd4gx5vz6U=";
+  };
+
+  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
+  ];
+
+  checkInputs = [
+    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..5e2a8e2bb859
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/numpyro/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, jax
+, jaxlib
+, multipledispatch
+, numpy
+, pytestCheckHook
+, pythonOlder
+, tqdm
+}:
+
+buildPythonPackage rec {
+  pname = "numpyro";
+  version = "0.10.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit version pname;
+    hash = "sha256-UCgFGHNLQunZgXGgmLWiH9GPEpRMIoSCqJryGIDHTdo=";
+  };
+
+  propagatedBuildInputs = [
+    jax
+    jaxlib
+    numpy
+    multipledispatch
+    tqdm
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  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_univariate"
+    "test_mean_var"
+    # Tests want to download data
+    "data_load"
+    "test_jsb_chorales"
+  ];
+
+  meta = with lib; {
+    description = "Library for probabilistic programming with NumPy";
+    homepage = "https://num.pyro.ai/";
+    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..117d5cfdd14f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nunavut/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, importlib-resources
+, pydsdl
+, pyyaml
+}:
+
+ buildPythonPackage rec {
+  pname = "nunavut";
+  version = "1.8.3";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-JI+0IpQWikE6vXfpZHWsVjx3JPaVJ/f4oAjTSNs1Wuk=";
+  };
+
+  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/";
+    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..3089093d9cd1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nutils/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, numpy
+, treelog
+, stringly
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "nutils";
+  version = "7.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "evalf";
+    repo = "nutils";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-V7lSMhwzc9+36uXMCy5uF241XwJ62Pdf59RUulOt4i8=";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    treelog
+    stringly
+  ];
+
+  checkInputs = [
+    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";
+    homepage = "https://www.nutils.org/";
+    license = licenses.mit;
+    broken = stdenv.hostPlatform.isAarch64;
+    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..e9bbda328fdb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nvchecker/default.nix
@@ -0,0 +1,81 @@
+{ lib
+, aiohttp
+, appdirs
+, buildPythonPackage
+, docutils
+, fetchFromGitHub
+, flaky
+, installShellFiles
+, packaging
+, pycurl
+, pytest-asyncio
+, pytest-httpbin
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, structlog
+, tomli
+, tornado
+}:
+
+buildPythonPackage rec {
+  pname = "nvchecker";
+  version = "2.9";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "lilydjwg";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-BlprjNfw/oas4mnnGWPpuHmdJihEGjDdKPiAWuE7m8k=";
+  };
+
+  nativeBuildInputs = [
+    docutils
+    installShellFiles
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    appdirs
+    packaging
+    pycurl
+    setuptools
+    structlog
+    tomli
+    tornado
+  ];
+
+  checkInputs = [
+    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; {
+    homepage = "https://github.com/lilydjwg/nvchecker";
+    description = "New version checker for software";
+    license = licenses.mit;
+    maintainers = with maintainers; [ marsam ];
+  };
+}
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..4579be5c3c13
--- /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;
+    sha256 = "sha256-uKrdkXpL5YBr953sRsHknYg+2/WwrZmyDf8BMA2+0tU=";
+  };
+
+  propagatedBuildInputs = [
+    blockdiag
+    setuptools
+  ];
+
+  checkInputs = [
+    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..880111a4ed75
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nxt-python/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchgit
+, isPy3k
+, pyusb
+, pybluez
+, pytest
+, git
+}:
+
+buildPythonPackage rec {
+  version = "3.0.1";
+  pname = "nxt-python";
+  format = "setuptools";
+
+  src = fetchgit {
+    url = "https://github.com/schodet/nxt-python.git";
+    rev = version;
+    sha256 = "004c0dr6767bjiddvp0pchcx05falhjzj33rkk03rrl0ha2nhxvz";
+  };
+
+  propagatedBuildInputs = [ pyusb pybluez pytest git ];
+
+  meta = with lib; {
+    description = "Python driver/interface for Lego Mindstorms NXT robot";
+    homepage = "https://github.com/schodet/nxt-python";
+    license = licenses.gpl3;
+    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..a8740f685747
--- /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;
+    sha256 = "sha256-vWsg0g8sTj9TUj7pACEdynWu7KcvT1qf2NyswXX+HAs=";
+  };
+  checkInputs = [
+    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..08a34aed2155
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/oauthenticator/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, google-api-python-client
+, google-auth-oauthlib
+, jupyterhub
+, mwoauth
+, pyjwt
+, pytest-asyncio
+, pytestCheckHook
+, requests-mock
+}:
+
+buildPythonPackage rec {
+  pname = "oauthenticator";
+  version = "15.0.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-LjC/Ly3wQL55gjCyoWZikvK6ByiS1CEsZXK0/lmzmGA=";
+  };
+
+  propagatedBuildInputs = [
+    jupyterhub
+  ];
+
+  checkInputs = [
+    google-api-python-client
+    google-auth-oauthlib
+    mwoauth
+    pyjwt
+    pytest-asyncio
+    pytestCheckHook
+    requests-mock
+  ];
+
+  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, including GitHub, Bitbucket, and more.";
+    homepage =  "https://github.com/jupyterhub/oauthenticator";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ixxie ];
+  };
+}
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..3a2f5cb1bddc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/oauthlib/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, blinker
+, buildPythonPackage
+, cryptography
+, fetchFromGitHub
+, mock
+, pyjwt
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "oauthlib";
+  version = "3.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-41JFURG8G8BjlAlNu2+lbj84XR/trAk1U5OPYxPq+5M=";
+  };
+
+  propagatedBuildInputs = [
+    blinker
+    cryptography
+    pyjwt
+  ];
+
+  checkInputs = [
+    mock
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "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..84d56962cc4d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/objax/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, jax
+, jaxlib
+, numpy
+, parameterized
+, pillow
+, scipy
+, tensorboard
+}:
+
+buildPythonPackage rec {
+  pname = "objax";
+  version = "1.6.0";
+
+  src = fetchFromGitHub {
+    owner = "google";
+    repo = "objax";
+    rev = "v${version}";
+    sha256 = "sha256-/6tZxVDe/3C53Re14odU9VA3mKvSj9X3/xt6bHFLHwQ=";
+  };
+
+  # 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"
+  ];
+
+  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..0d2da52f015c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/objgraph/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPyPy
+, substituteAll
+, graphvizPkgs
+, graphviz
+, mock
+}:
+
+buildPythonPackage rec {
+  pname = "objgraph";
+  version = "3.5.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "4752ca5bcc0e0512e41b8cc4d2780ac2fd3b3eabd03b7e950a5594c06203dfc4";
+  };
+
+  # Tests fail with PyPy.
+  disabled = isPyPy;
+
+  patches = [
+    (substituteAll {
+      src = ./hardcode-graphviz-path.patch;
+      graphviz = graphvizPkgs;
+    })
+  ];
+
+  propagatedBuildInputs = [ graphviz ];
+
+  checkInputs = [ mock ];
+
+  meta = with lib; {
+    description = "Draws Python object reference graphs with graphviz";
+    homepage = "https://mg.pov.lt/objgraph/";
+    license = licenses.mit;
+  };
+
+}
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/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/oci/default.nix b/nixpkgs/pkgs/development/python-modules/oci/default.nix
new file mode 100644
index 000000000000..e136ed354e3f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/oci/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, certifi
+, circuitbreaker
+, cryptography
+, fetchFromGitHub
+, pyopenssl
+, python-dateutil
+, pythonOlder
+, pytz
+}:
+
+buildPythonPackage rec {
+  pname = "oci";
+  version = "2.78.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "oracle";
+    repo = "oci-python-sdk";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-24V9vfuNMxvC5iqluW4xz7WICXbQA89xmiAH6tIDRw0=";
+  };
+
+  propagatedBuildInputs = [
+    certifi
+    circuitbreaker
+    cryptography
+    pyopenssl
+    python-dateutil
+    pytz
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "configparser==4.0.2 ; python_version < '3'" "" \
+      --replace "cryptography>=3.2.1,<=37.0.2" "cryptography" \
+      --replace "pyOpenSSL>=17.5.0,<=22.0.0" "pyOpenSSL"
+  '';
+
+  # 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://oracle-cloud-infrastructure-python-sdk.readthedocs.io/";
+    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..a28ad0bbaa01
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ocifs/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fsspec
+, oci
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "ocifs";
+  version = "1.1.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "oracle";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-4Yf6f89btzLij0OxGYRrnRpYCs8edDcwJPFbPZUfx9w=";
+  };
+
+  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";
+    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..0acaf7842069
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ocrmypdf/default.nix
@@ -0,0 +1,101 @@
+{ lib
+, buildPythonPackage
+, coloredlogs
+, fetchFromGitHub
+, ghostscript
+, img2pdf
+, importlib-metadata
+, importlib-resources
+, jbig2enc
+, pdfminer-six
+, pikepdf
+, pillow
+, pluggy
+, pngquant
+, pytest-xdist
+, pytestCheckHook
+, pythonOlder
+, reportlab
+, setuptools-scm
+, setuptools-scm-git-archive
+, substituteAll
+, tesseract4
+, tqdm
+, unpaper
+, installShellFiles
+}:
+
+buildPythonPackage rec {
+  pname = "ocrmypdf";
+  version = "13.7.0";
+
+  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-cw2wZMPhWzxRpeM90g9NmuYBYpU13R2iDzs7a8SS/CY=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  patches = [
+    (substituteAll {
+      src = ./paths.patch;
+      gs = "${lib.getBin ghostscript}/bin/gs";
+      jbig2 = "${lib.getBin jbig2enc}/bin/jbig2";
+      pngquant = "${lib.getBin pngquant}/bin/pngquant";
+      tesseract = "${lib.getBin tesseract4}/bin/tesseract";
+      unpaper = "${lib.getBin unpaper}/bin/unpaper";
+    })
+  ];
+
+  nativeBuildInputs = [
+    setuptools-scm-git-archive
+    setuptools-scm
+    installShellFiles
+  ];
+
+  propagatedBuildInputs = [
+    coloredlogs
+    img2pdf
+    pdfminer-six
+    pikepdf
+    pillow
+    pluggy
+    reportlab
+    tqdm
+  ] ++ (lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ]) ++ (lib.optionals (pythonOlder "3.9") [
+    importlib-resources
+  ]);
+
+  checkInputs = [
+    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..71d96c9a98eb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ocrmypdf/paths.patch
@@ -0,0 +1,127 @@
+diff --git a/src/ocrmypdf/_exec/ghostscript.py b/src/ocrmypdf/_exec/ghostscript.py
+index 9e21c33c..21f134b3 100644
+--- a/src/ocrmypdf/_exec/ghostscript.py
++++ b/src/ocrmypdf/_exec/ghostscript.py
+@@ -32,15 +32,7 @@ log = logging.getLogger(__name__)
+ # Most reliable what to get the bitness of Python interpreter, according to Python docs
+ _IS_64BIT = sys.maxsize > 2**32
+ 
+-_GSWIN = None
+-if os.name == 'nt':
+-    if _IS_64BIT:
+-        _GSWIN = 'gswin64c'
+-    else:
+-        _GSWIN = 'gswin32c'
+-
+-GS = _GSWIN if _GSWIN else 'gs'
+-del _GSWIN
++GS = '@gs@'
+ 
+ 
+ def version():
+diff --git a/src/ocrmypdf/_exec/jbig2enc.py b/src/ocrmypdf/_exec/jbig2enc.py
+index 0f8f7392..db792b10 100644
+--- a/src/ocrmypdf/_exec/jbig2enc.py
++++ b/src/ocrmypdf/_exec/jbig2enc.py
+@@ -12,7 +12,7 @@ from ocrmypdf.subprocess import get_version, run
+ 
+ 
+ def version():
+-    return get_version('jbig2', regex=r'jbig2enc (\d+(\.\d+)*).*')
++    return get_version('@jbig2@', regex=r'jbig2enc (\d+(\.\d+)*).*')
+ 
+ 
+ def available():
+@@ -25,7 +25,7 @@ def available():
+ 
+ def convert_group(*, cwd, infiles, out_prefix):
+     args = [
+-        'jbig2',
++        '@jbig2@',
+         '-b',
+         out_prefix,
+         '-s',  # symbol mode (lossy)
+@@ -44,7 +44,7 @@ def convert_group_mp(args):
+ 
+ 
+ def convert_single(*, cwd, infile, outfile):
+-    args = ['jbig2', '-p', infile]
++    args = ['@jbig2@', '-p', 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 64e91139..ab5b9c49 100644
+--- a/src/ocrmypdf/_exec/pngquant.py
++++ b/src/ocrmypdf/_exec/pngquant.py
+@@ -17,7 +17,7 @@ from ocrmypdf.subprocess import get_version, run
+ 
+ 
+ def version():
+-    return get_version('pngquant', regex=r'(\d+(\.\d+)*).*')
++    return get_version('@pngquant@', regex=r'(\d+(\.\d+)*).*')
+ 
+ 
+ def available():
+@@ -44,7 +44,7 @@ def input_as_png(input_file: Path):
+ def quantize(input_file: Path, output_file: Path, quality_min: int, quality_max: int):
+     with input_as_png(input_file) 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 ad98836a..a12d3002 100644
+--- a/src/ocrmypdf/_exec/tesseract.py
++++ b/src/ocrmypdf/_exec/tesseract.py
+@@ -111,7 +111,7 @@ class TesseractVersion(Version):
+ 
+ 
+ def version() -> str:
+-    return get_version('tesseract', regex=r'tesseract\s(.+)')
++    return get_version('@tesseract@', regex=r'tesseract\s(.+)')
+ 
+ 
+ def has_user_words() -> bool:
+@@ -138,7 +138,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,
+@@ -160,7 +160,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 d7f24265..d14f85de 100644
+--- a/src/ocrmypdf/_exec/unpaper.py
++++ b/src/ocrmypdf/_exec/unpaper.py
+@@ -66,7 +66,7 @@ class UnpaperImageTooLargeError(Exception):
+ 
+ 
+ def version() -> str:
+-    return get_version('unpaper')
++    return get_version('@unpaper@')
+ 
+ 
+ SUPPORTED_MODES = {'1', 'L', 'RGB'}
+@@ -120,7 +120,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..de64e2f8fdc8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/od/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchPypi, unittest2 }:
+
+buildPythonPackage rec {
+  pname = "od";
+  version = "2.0.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-uGkj2Z8mLg51IV+FOqwZl1hT7zVyjmD1CcY/VbH4tKk=";
+  };
+
+  # repeated_test no longer exists in nixpkgs
+  # also see: https://github.com/epsy/od/issues/1
+  doCheck = false;
+  checkInputs = [
+    unittest2
+  ];
+
+  meta = with lib; {
+    description = "Shorthand syntax for building OrderedDicts";
+    homepage = "https://github.com/epsy/od";
+    license = licenses.mit;
+  };
+
+}
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..531a80759a06
--- /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 ];
+
+  checkInputs = [ 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/oemthermostat/default.nix b/nixpkgs/pkgs/development/python-modules/oemthermostat/default.nix
new file mode 100644
index 000000000000..7a2ecfc26c03
--- /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
+  ];
+
+  checkInputs = [
+    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..0f0dfb057695
--- /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.8.20";
+
+  disabled = pythonOlder "3.7";
+
+  # PyPI distribution does not include tests
+  src = fetchFromGitHub {
+    owner = "csingley";
+    repo = pname;
+    rev = version;
+    sha256 = "1s3fhhmj1acnmqglh39003db0bi451m4hcrkcpyrkqf5m32lslz8";
+  };
+
+  checkInputs = [ 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/olefile/default.nix b/nixpkgs/pkgs/development/python-modules/olefile/default.nix
new file mode 100644
index 000000000000..ff0dc7c1c93a
--- /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";
+  };
+
+  checkInputs = [
+    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..3ba66ac38edc
--- /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
+  ];
+
+  checkInputs = [
+    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/omegaconf/default.nix b/nixpkgs/pkgs/development/python-modules/omegaconf/default.nix
new file mode 100644
index 000000000000..7f34ff29fdbf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/omegaconf/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-mock
+, pytestCheckHook
+, pyyaml
+, pythonOlder
+, jre_minimal
+, antlr4_9-python3-runtime
+, pydevd }:
+
+buildPythonPackage rec {
+  pname = "omegaconf";
+  version = "2.2.2";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "omry";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-bUJ80sa2ot2JSkt29eFwSiKL6R1X1+VVeE9dFIy4Mg0=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py --replace 'setup_requires=["pytest-runner"]' 'setup_requires=[]'
+  '';
+
+  nativeBuildInputs = [
+    jre_minimal
+  ];
+
+  propagatedBuildInputs = [
+    antlr4_9-python3-runtime
+    pyyaml
+  ];
+
+  checkInputs = [
+    pydevd
+    pytestCheckHook
+    pytest-mock
+  ];
+
+  pythonImportsCheck = [ "omegaconf" ];
+
+  meta = with lib; {
+    description = "A framework for configuring complex applications";
+    homepage = "https://github.com/omry/omegaconf";
+    license = licenses.free;  # prior bsd license (1988)
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+}
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..914267ea86f7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/omnikinverter/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, aiohttp
+, aresponses
+, asynctest
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, yarl
+}:
+
+buildPythonPackage rec {
+  pname = "omnikinverter";
+  version = "0.8.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "klaasnicolaas";
+    repo = "python-omnikinverter";
+    rev = "v${version}";
+    hash = "sha256-OQWk+ae+hSLLdH0uLVPauoNeQpXgxkvflXFyaiFe108=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    yarl
+  ];
+
+  checkInputs = [
+    aresponses
+    asynctest
+    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";
+    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/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..220265fbc01d
--- /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
+  ];
+
+  checkInputs = [
+    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..81ca9bfaf42c
--- /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.0";
+
+  src = fetchFromGitHub {
+    owner = "online-judge-tools";
+    repo = "api-client";
+    rev = "v${version}";
+    sha256 = "0lmryqi0bv82v9k9kf1rzzq9zr83smpmy8ivzw4fk31hvpczp4fn";
+  };
+
+  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..b3f21afdaddf
--- /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;
+    sha256 = "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..d5db23bc2b0b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/onnx/default.nix
@@ -0,0 +1,81 @@
+{ lib
+, buildPythonPackage
+, bash
+, cmake
+, fetchPypi
+, isPy27
+, nbval
+, numpy
+, protobuf
+, pytestCheckHook
+, six
+, tabulate
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "onnx";
+  version = "1.12.0";
+  format = "setuptools";
+
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-E7PnfSdSO52/TzDfyclZRVhZ1eNOkhxE9xLWm4Np7/k=";
+  };
+
+  nativeBuildInputs = [
+    cmake
+  ];
+
+  propagatedBuildInputs = [
+    protobuf
+    numpy
+    six
+    typing-extensions
+  ];
+
+  checkInputs = [
+    nbval
+    pytestCheckHook
+    tabulate
+  ];
+
+  postPatch = ''
+    chmod +x tools/protoc-gen-mypy.sh.in
+    patchShebangs tools/protoc-gen-mypy.py
+    substituteInPlace tools/protoc-gen-mypy.sh.in \
+      --replace "/bin/bash" "${bash}/bin/bash"
+
+    sed -i '/pytest-runner/d' setup.py
+  '';
+
+  preBuild = ''
+    export MAX_JOBS=$NIX_BUILD_CORES
+  '';
+
+  disabledTestPaths = [
+    # Unexpected output fields from running code: {'stderr'}
+    "onnx/examples/np_array_tensorproto.ipynb"
+  ];
+
+  # 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;
+
+  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/onvif-zeep-async/default.nix b/nixpkgs/pkgs/development/python-modules/onvif-zeep-async/default.nix
new file mode 100644
index 000000000000..d895504186cb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/onvif-zeep-async/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, httpx
+, pythonOlder
+, zeep
+}:
+
+buildPythonPackage rec {
+  pname = "onvif-zeep-async";
+  version = "1.2.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-bRPqbuBrC4Q0gdQGb2KAy1pTHce42WvM7gjvAspH4WE=";
+  };
+
+  propagatedBuildInputs = [
+    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..c558ebcc1a6e
--- /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;
+    sha256 = "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/open-garage/default.nix b/nixpkgs/pkgs/development/python-modules/open-garage/default.nix
new file mode 100644
index 000000000000..0cb71a86fe57
--- /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;
+    sha256 = "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..520af3062eac
--- /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
+  ];
+
+  checkInputs = [
+    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/default.nix b/nixpkgs/pkgs/development/python-modules/openai/default.nix
new file mode 100644
index 000000000000..a95d63b830b3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/openai/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+
+# Python dependencies
+, numpy
+, openpyxl
+, pandas
+, pandas-stubs
+, requests
+, scikit-learn
+, tenacity
+, tqdm
+, wandb
+
+# Check dependencies
+, pytest-mock
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "openai";
+  version = "0.22.1";
+
+  disabled = pythonOlder "3.7.1";
+
+  # Use GitHub source since PyPi source does not include tests
+  src = fetchFromGitHub {
+    owner = "openai";
+    repo = "openai-python";
+    rev = "v${version}";
+    sha256 = "sha256-QUnsm0ui1BFlLqAlH1bp7uDbhiRigePrAPAkSRjftM4=";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    openpyxl
+    pandas
+    pandas-stubs
+    requests
+    scikit-learn
+    tenacity
+    tqdm
+    wandb
+  ];
+
+  pythonImportsCheck = [ "openai" ];
+  checkInputs = [ pytestCheckHook pytest-mock ];
+  pytestFlagsArray = [ "openai/tests" ];
+  OPENAI_API_KEY = "sk-foo";
+  disabledTestPaths = [
+    "openai/tests/test_endpoints.py" # requires a real API key
+    "openai/tests/test_file_cli.py"
+  ];
+
+  meta = with lib; {
+    description = "Python client library for the OpenAI API";
+    homepage = "https://github.com/openai/openai-python";
+    license = licenses.mit;
+    maintainers = [ maintainers.malo ];
+  };
+}
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..71f699e0552a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/openant/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pyusb
+}:
+
+buildPythonPackage {
+  pname = "openant-unstable";
+  version = "2017-02-11";
+
+  src = fetchFromGitHub {
+    owner = "Tigge";
+    repo = "openant";
+    rev = "ed89281e37f65d768641e87356cef38877952397";
+    sha256 = "1g81l9arqdy09ijswn3sp4d6i3z18d44lzyb78bwnvdb14q22k19";
+  };
+
+  # Removes some setup.py hacks intended to install udev rules.
+  # We do the job ourselves in postInstall below.
+  postPatch = ''
+    sed -i -e '/cmdclass=.*/d' setup.py
+  '';
+
+  postInstall = ''
+    install -dm755 "$out/etc/udev/rules.d"
+    install -m644 resources/ant-usb-sticks.rules "$out/etc/udev/rules.d/99-ant-usb-sticks.rules"
+  '';
+
+  propagatedBuildInputs = [ pyusb ];
+
+  meta = with lib; {
+    homepage = "https://github.com/Tigge/openant";
+    description = "ANT and ANT-FS Python Library";
+    license = licenses.mit;
+    platforms = platforms.unix;
+  };
+
+}
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..32989e7f9ce5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/openapi-core/default.nix
@@ -0,0 +1,96 @@
+{ lib
+, attrs
+, buildPythonPackage
+, dictpath
+, django
+, djangorestframework
+, falcon
+, fetchFromGitHub
+, flask
+, isodate
+, lazy-object-proxy
+, mock
+, more-itertools
+, openapi-schema-validator
+, openapi-spec-validator
+, parse
+, pytestCheckHook
+, pythonOlder
+, responses
+, six
+, webob
+, werkzeug
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "openapi-core";
+  version = "0.14.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "p1c2u";
+    repo = "openapi-core";
+    rev = version;
+    hash = "sha256-+VyNPSq7S1Oz4eGf+jaeRTx0lZ8pUA+G+KZ/5PyK+to=";
+  };
+
+  postPatch = ''
+    sed -i "/^addopts/d" setup.cfg
+  '';
+
+  propagatedBuildInputs = [
+    attrs
+    dictpath
+    isodate
+    lazy-object-proxy
+    more-itertools
+    openapi-schema-validator
+    openapi-spec-validator
+    parse
+    six
+    werkzeug
+  ];
+
+  checkInputs = [
+    django
+    djangorestframework
+    falcon
+    flask
+    mock
+    pytestCheckHook
+    responses
+    webob
+  ];
+
+  disabledTestPaths = [
+    # AttributeError: 'str' object has no attribute '__name__'
+    "tests/integration/validation"
+    # requires secrets and additional configuration
+    "tests/integration/contrib/test_django.py"
+    # Unable to detect SECRET_KEY and ROOT_URLCONF
+    "tests/integration/contrib/test_django.py"
+  ];
+
+  disabledTests = [
+    # TypeError: Unexpected keyword arguments passed to pytest.raises: message
+    "test_string_format_invalid_value"
+    # Needs a fix for new PyYAML
+    "test_django_rest_framework_apiview"
+  ];
+
+  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..2471df794fc0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/openapi-schema-validator/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytestCheckHook
+, isodate
+, jsonschema
+, pytest-cov
+, rfc3339-validator
+, six
+, strict-rfc3339
+}:
+
+buildPythonPackage rec {
+  pname = "openapi-schema-validator";
+  version = "0.3.0";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "p1c2u";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-Ms00nR3dpJ0hGtHvVa5B29dasYtBP8igxrgMm0NiArc=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [ isodate jsonschema six strict-rfc3339 rfc3339-validator ];
+
+  checkInputs = [ pytestCheckHook pytest-cov ];
+  pythonImportsCheck = [ "openapi_schema_validator" ];
+
+  meta = with lib; {
+    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..2edd46419654
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/openapi-spec-validator/default.nix
@@ -0,0 +1,77 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+
+# propagates
+, jsonschema
+, openapi-schema-validator
+, pyyaml
+
+# optional
+, requests
+
+# tests
+, mock
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "openapi-spec-validator";
+  version = "0.4.0";
+  format = "pyproject";
+
+  # no tests via pypi sdist
+  src = fetchFromGitHub {
+    owner = "p1c2u";
+    repo = pname;
+    rev = version;
+    hash = "sha256-mGgHlDZTUo72RNZ/448gkGdza4EntYU9YoBpSKDUCeA=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'openapi-schema-validator = "^0.2.0"' 'openapi-schema-validator = "*"'
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    jsonschema
+    openapi-schema-validator
+    pyyaml
+  ];
+
+  passthru.optional-dependencies.requests = [
+    requests
+  ];
+
+  preCheck = ''
+    sed -i '/--cov/d' pyproject.toml
+  '';
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # network access
+    "test_default_valid"
+    "test_urllib_valid"
+    "test_valid"
+  ];
+
+  pythonImportsCheck = [
+    "openapi_spec_validator"
+    "openapi_spec_validator.readers"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/p1c2u/openapi-spec-validator";
+    description = "Validates OpenAPI Specs against the OpenAPI 2.0 (aka Swagger) and OpenAPI 3.0.0 specification";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ rvl ];
+  };
+}
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/openerz-api/default.nix b/nixpkgs/pkgs/development/python-modules/openerz-api/default.nix
new file mode 100644
index 000000000000..9cbe89e26a34
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/openerz-api/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, requests
+, testfixtures
+}:
+
+buildPythonPackage rec {
+  pname = "openerz-api";
+  version = "0.1.0";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "misialq";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "10kxsmaz2rn26jijaxmdmhx8vjdz8hrhlrvd39gc8yvqbjwhi3nw";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    testfixtures
+  ];
+
+  pythonImportsCheck = [ "openerz_api" ];
+
+  meta = with lib; {
+    description = "Python module to interact with the OpenERZ API";
+    homepage = "https://github.com/misialq/openerz-api";
+    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..b42e9c86bbe1
--- /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.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "miniconfig";
+    repo = "python-openevse-wifi";
+    rev = "v${version}";
+    sha256 = "sha256-pNm+zupBGijCXIkdanMk7nE/+SFvSEFp9/Ht5OoxQrU=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    deprecated
+    requests
+  ];
+
+  checkInputs = [
+    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";
+      sha256 = "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..533a6f66f7f0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/openhomedevice/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, async-upnp-client
+, buildPythonPackage
+, fetchFromGitHub
+, lxml
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "openhomedevice";
+  version = "2.0.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "bazwilliams";
+    repo = pname;
+    rev = version;
+    hash = "sha256-D4n/fv+tgdKiU7CemI+12cqoox2hsqRYlCHY7daD5fM=";
+  };
+
+  propagatedBuildInputs = [
+    async-upnp-client
+    lxml
+  ];
+
+  # Tests are currently outdated
+  # https://github.com/bazwilliams/openhomedevice/issues/20
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "openhomedevice"
+  ];
+
+  meta = with lib; {
+    description = "Python module to access Linn Ds and Openhome devices";
+    homepage = "https://github.com/bazwilliams/openhomedevice";
+    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/openpyxl/default.nix b/nixpkgs/pkgs/development/python-modules/openpyxl/default.nix
new file mode 100644
index 000000000000..8afc16f86d43
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/openpyxl/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, pytest
+, jdcal
+, et_xmlfile
+, lxml
+}:
+
+buildPythonPackage rec {
+  pname = "openpyxl";
+  version = "3.0.10";
+  disabled = isPy27; # 2.6.4 was final python2 release
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-5HgFYnrrz4YO207feYexMJwbNjLzdQU47ZYrvMO9dEk=";
+  };
+
+  checkInputs = [ pytest ];
+  propagatedBuildInputs = [ jdcal et_xmlfile lxml ];
+
+  postPatch = ''
+    # LICENSE.rst is missing, and setup.cfg currently doesn't contain anything useful anyway
+    # This should likely be removed in the next update
+    rm setup.cfg
+  '';
+
+  # Tests are not included in archive.
+  # https://bitbucket.org/openpyxl/openpyxl/issues/610
+  doCheck = false;
+
+  meta = {
+    description = "A Python library to read/write Excel 2007 xlsx/xlsm files";
+    homepage = "https://openpyxl.readthedocs.org";
+    license = lib.licenses.mit;
+    maintainers = with lib.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..2f413a46d6c9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/openrazer/common.nix
@@ -0,0 +1,17 @@
+{ lib
+, fetchFromGitHub
+}: rec {
+  version = "3.3.0";
+  src = fetchFromGitHub {
+    owner = "openrazer";
+    repo = "openrazer";
+    rev = "v${version}";
+    sha256 = "1lw2cpj2xzwcsn5igrqj3f6m2v5n6zp1xa9vv3j9f9r2fbb48jcl";
+  };
+  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..616d69d389b8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/openrazer/daemon.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonApplication
+, isPy3k
+, daemonize
+, dbus-python
+, fetchFromGitHub
+, gobject-introspection
+, gtk3
+, makeWrapper
+, pygobject3
+, pyudev
+, setproctitle
+, wrapGAppsHook
+}:
+
+let
+  common = import ./common.nix { inherit lib fetchFromGitHub; };
+in
+buildPythonApplication (common // rec {
+  pname = "openrazer_daemon";
+
+  disabled = !isPy3k;
+
+  outputs = [ "out" "man" ];
+
+  nativeBuildInputs = [ makeWrapper wrapGAppsHook ];
+
+  propagatedBuildInputs = [
+    daemonize
+    dbus-python
+    gobject-introspection
+    gtk3
+    pygobject3
+    pyudev
+    setproctitle
+  ];
+
+  prePatch = ''
+    cd daemon
+  '';
+
+  postPatch = ''
+    substituteInPlace openrazer_daemon/daemon.py --replace "plugdev" "openrazer"
+  '';
+
+  postBuild = ''
+    DESTDIR="$out" PREFIX="" make install manpages
+  '';
+
+  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..fb83d64c5020
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/openrazer/pylib.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, dbus-python
+, fetchFromGitHub
+, numpy
+, openrazer-daemon
+}:
+
+let
+  common = import ./common.nix { inherit lib fetchFromGitHub; };
+in
+buildPythonPackage (common // rec {
+  pname = "openrazer";
+
+  sourceRoot = "source/pylib";
+
+  propagatedBuildInputs = [
+    dbus-python
+    numpy
+    openrazer-daemon
+  ];
+
+  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/openrouteservice/default.nix b/nixpkgs/pkgs/development/python-modules/openrouteservice/default.nix
new file mode 100644
index 000000000000..f5e1ab81fbf7
--- /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";
+  };
+
+  checkInputs = [ 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/opensensemap-api/default.nix b/nixpkgs/pkgs/development/python-modules/opensensemap-api/default.nix
new file mode 100644
index 000000000000..56edc136c44f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/opensensemap-api/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, aiohttp
+, async-timeout
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "opensensemap-api";
+  version = "0.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-KSukSPpSbfbEEqTq4zqqo8OT7ptdPrGy2QyQYjErQWI=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    async-timeout
+  ];
+
+  # no tests are present
+  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";
+    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..9e20d450973e
--- /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
+  ];
+  checkInputs = [ 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..497af2e735d1
--- /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.1";
+
+  src = fetchFromGitHub {
+    owner = "openshift";
+    repo = "openshift-restclient-python";
+    rev = "v${version}";
+    sha256 = "sha256-9mMHih2xuQve8hEnc5x4f9Pd4wX7IMy3vrxxGFCG+8o=";
+  };
+
+  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"];
+
+  checkInputs = [
+    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..a30933e806df
--- /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 ];
+
+  checkInputs = [ 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..0a04006704c1
--- /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 = "2.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-dFrZTObRDKB8aw1/i6febpttymbY3cPzA3ckNuhVt4c=";
+  };
+
+  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..edd5b0ec0ddd
--- /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 = "0.100.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-AT9WDdoxtW5sGiL0h9n4y/3xvClcDoh1N3TFVHjPB0c=";
+  };
+
+  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..7a379d3a019e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/openstacksdk/tests.nix
@@ -0,0 +1,65 @@
+{ buildPythonPackage
+, ddt
+, hacking
+, jsonschema
+, lib
+, openstacksdk
+, oslo-config
+, oslotest
+, prometheus-client
+, requests-mock
+, stdenv
+, stestr
+, testscenarios
+}:
+
+buildPythonPackage rec {
+  pname = "openstacksdk-tests";
+  inherit (openstacksdk) version;
+
+  src = openstacksdk.src;
+
+  dontBuild = true;
+  dontInstall = true;
+
+  checkInputs = [
+    ddt
+    hacking
+    jsonschema
+    openstacksdk
+    oslo-config
+    oslotest
+    prometheus-client
+    requests-mock
+    stestr
+    testscenarios
+  ];
+
+  checkPhase =
+    let aarch64TestsExcluded = lib.optionalString stdenv.hostPlatform.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
+    ''; in
+    ''
+      stestr run -e <(echo "${aarch64TestsExcluded}
+      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
+      ")
+    '';
+}
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..274294f59388
--- /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";
+
+  src = fetchPypi {
+    pname = "openstep_plist";
+    inherit version;
+    sha256 = "sha256-KO4sGKjod5BwUFQ1MU2S1dG0DyiJ06mdroMbRDsugBk=";
+    extension = "zip";
+  };
+
+  nativeBuildInputs = [ setuptools-scm cython ];
+  checkInputs = [ 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/opentimestamps/default.nix b/nixpkgs/pkgs/development/python-modules/opentimestamps/default.nix
new file mode 100644
index 000000000000..f132614d1ca0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/opentimestamps/default.nix
@@ -0,0 +1,40 @@
+{ lib, buildPythonPackage, fetchFromGitHub, fetchpatch, isPy3k
+, bitcoinlib, GitPython, pysha3, git }:
+
+buildPythonPackage rec {
+  pname = "opentimestamps";
+  version = "0.4.1";
+  disabled = (!isPy3k);
+
+  # We can't use the pypi source because it doesn't include README.md which is
+  # needed in setup.py
+  src = fetchFromGitHub {
+    owner = "opentimestamps";
+    repo = "python-opentimestamps";
+    rev = "python-opentimestamps-v${version}";
+    sha256 = "0c45ij8absfgwizq6dfgg81siq3y8605sgg184vazp292w8nqmqr";
+  };
+
+  patches = [
+    # build against bitcoinlib-0.11
+    (fetchpatch {
+      url = "https://patch-diff.githubusercontent.com/raw/opentimestamps/python-opentimestamps/pull/43.patch";
+      sha256 = "0bxzk4pzpqk7zrk2x7vn2bj2n3pc5whf8ijbd225s6674q450zbg";
+    })
+  ];
+
+  # 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
+  '';
+
+  checkInputs = [ git ];
+  propagatedBuildInputs = [ bitcoinlib GitPython pysha3 ];
+
+  meta = {
+    description = "Create and verify OpenTimestamps proofs";
+    homepage = "https://github.com/opentimestamps/python-opentimestamps";
+    license = lib.licenses.lgpl3;
+  };
+}
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..bf7ec6a938ff
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/opentracing/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, futures ? null
+, gevent
+, mock
+, pytestCheckHook
+, tornado
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "opentracing";
+  version = "2.4.0";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a173117e6ef580d55874734d1fa7ecb6f3655160b8b8974a2a1e98e5ec9c840d";
+  };
+
+  propagatedBuildInputs = lib.optional isPy27 futures;
+
+  checkInputs = [
+    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/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..7b806ecebe23
--- /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.11";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-DkitN+mwCZ14QEn2fTOqUrQTtoncR1ifP3WDSQ6qkkk=";
+  };
+
+  propagatedBuildInputs = [
+    click
+    requests
+    packaging
+  ];
+
+  checkInputs = [
+    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/opsdroid_get_image_size/default.nix b/nixpkgs/pkgs/development/python-modules/opsdroid_get_image_size/default.nix
new file mode 100644
index 000000000000..0f33da44145f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/opsdroid_get_image_size/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildPythonPackage, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "opsdroid_get_image_size";
+  version = "0.2.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "124j2xvfxv09q42qfb8nqlcn55y7f09iayrix3yfyrs2qyzav78a";
+  };
+
+  # 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..6e4eabeb68ab
--- /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
+  ];
+
+  checkInputs = [
+    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..b04c1549b4e1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/optax/default.nix
@@ -0,0 +1,57 @@
+{ absl-py
+, buildPythonPackage
+, chex
+, fetchFromGitHub
+, jaxlib
+, lib
+, numpy
+, callPackage
+}:
+
+buildPythonPackage rec {
+  pname = "optax";
+  version = "0.1.3";
+
+  src = fetchFromGitHub {
+    owner = "deepmind";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-XAYztMBQpLBHNuNED/iodbwIMJSN/0GxdmTGQ5jD9Ws=";
+  };
+
+  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 = "Optax is a gradient processing and optimization library for JAX.";
+    homepage = "https://github.com/deepmind/optax";
+    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..fedff61302d7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/optax/tests.nix
@@ -0,0 +1,35 @@
+{ stdenv
+, buildPythonPackage
+, dm-haiku
+, pytest-xdist
+, pytestCheckHook
+, tensorflow
+, tensorflow-datasets
+, flax
+, optax
+}:
+
+buildPythonPackage rec {
+  pname = "optax-tests";
+  inherit (optax) version;
+
+  src = optax.testsout;
+
+  dontBuild = true;
+  dontInstall = true;
+
+  checkInputs = [
+    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/optuna/default.nix b/nixpkgs/pkgs/development/python-modules/optuna/default.nix
new file mode 100644
index 000000000000..1236a24628ec
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/optuna/default.nix
@@ -0,0 +1,93 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytest
+, mock
+, bokeh
+, plotly
+, chainer
+, xgboost
+, mpi4py
+, lightgbm
+, keras
+, mxnet
+, scikit-optimize
+, tensorflow
+, cma
+, sqlalchemy
+, numpy
+, scipy
+, six
+, cliff
+, colorlog
+, pandas
+, alembic
+, tqdm
+, typing
+, pythonOlder
+, isPy27
+}:
+
+buildPythonPackage rec {
+  pname = "optuna";
+  version = "2.10.1";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "optuna";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-HHVEoLCZtEJEfc4xYobQrzRcDDxxeQjgL2Rw2KeVbi0=";
+  };
+
+  checkInputs = [
+    pytest
+    mock
+    bokeh
+    plotly
+    chainer
+    xgboost
+    mpi4py
+    lightgbm
+    keras
+    mxnet
+    scikit-optimize
+    tensorflow
+    cma
+  ];
+
+  propagatedBuildInputs = [
+    sqlalchemy
+    numpy
+    scipy
+    six
+    cliff
+    colorlog
+    pandas
+    alembic
+    tqdm
+  ] ++ lib.optionals (pythonOlder "3.5") [
+    typing
+  ];
+
+  configurePhase = if !(pythonOlder "3.5") then ''
+    substituteInPlace setup.py \
+      --replace "'typing'," ""
+  '' else "";
+
+  checkPhase = ''
+    pytest --ignore tests/test_cli.py \
+           --ignore tests/integration_tests/test_chainermn.py \
+           --ignore tests/integration_tests/test_pytorch_lightning.py \
+           --ignore tests/integration_tests/test_pytorch_ignite.py \
+           --ignore tests/integration_tests/test_fastai.py
+  '';
+
+  meta = with lib; {
+    broken = true;  # Dashboard broken, other build failures.
+    description = "A hyperparameter optimization framework";
+    homepage = "https://optuna.org/";
+    license = licenses.mit;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..7db467f26d50
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/opuslib/default.nix
@@ -0,0 +1,39 @@
+{ buildPythonPackage,
+  fetchFromGitHub,
+  isPy27,
+  libopus,
+  nose,
+  lib, stdenv,
+  substituteAll,
+}:
+
+buildPythonPackage rec {
+  pname = "opuslib";
+  version = "3.0.3";
+
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "orion-labs";
+    repo = "opuslib";
+    rev = "92109c528f9f6c550df5e5325ca0fcd4f86b0909";
+    sha256 = "0kd37wimwd1g6c0w5hq2hiiljgbi1zg3rk5prval086khkzq469p";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./opuslib-paths.patch;
+      opusLibPath = "${libopus}/lib/libopus${stdenv.hostPlatform.extensions.sharedLibrary}";
+    })
+  ];
+
+  checkInputs = [ 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/ordered-set/default.nix b/nixpkgs/pkgs/development/python-modules/ordered-set/default.nix
new file mode 100644
index 000000000000..8ea71fd2d901
--- /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;
+    sha256 = "sha256-aUqORMh2V8WSku3nKJHrkdNBMfZTFGOqswCRkcdzZKg=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  checkInputs = [
+    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..7c37cc7aa5aa
--- /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";
+  };
+
+  checkInputs = [ 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..9910aefe1cbe
--- /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 = [ maintainers.jtojnar ];
+    # 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..831d24fc73e0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/orjson/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, stdenv
+, pythonOlder
+, rustPlatform
+, fetchFromGitHub
+, buildPythonPackage
+, cffi
+, libiconv
+, numpy
+, psutil
+, pytestCheckHook
+, python-dateutil
+, pytz
+, xxhash
+}:
+
+buildPythonPackage rec {
+  pname = "orjson";
+  version = "3.7.8";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "ijl";
+    repo = pname;
+    rev = version;
+    hash = "sha256-K/hLNzwwEeGN6S33Xkfh+ocDHmTmh6yZYcN4vxaAvoQ=";
+  };
+
+  cargoDeps = rustPlatform.fetchCargoTarball {
+    inherit src;
+    name = "${pname}-${version}";
+    hash = "sha256-kwZg1bC1O6XBI5HBgzahph/0k/RUKEkFIQMMuA1xe4w=";
+  };
+
+  format = "pyproject";
+
+  nativeBuildInputs = [
+    cffi
+  ] ++ (with rustPlatform; [
+    cargoSetupHook
+    maturinBuildHook
+  ]);
+
+  buildInputs = lib.optionals stdenv.isDarwin [ libiconv ];
+
+  checkInputs = [
+    numpy
+    psutil
+    pytestCheckHook
+    python-dateutil
+    pytz
+    xxhash
+  ];
+
+  pythonImportsCheck = [ pname ];
+
+  meta = with lib; {
+    description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy";
+    homepage = "https://github.com/ijl/orjson";
+    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..a1d738890b30
--- /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; [ costrouc ];
+  };
+}
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..cc028df3233f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ormar/default.nix
@@ -0,0 +1,92 @@
+{ lib
+, aiomysql
+, aiopg
+, aiosqlite
+, asyncpg
+, buildPythonPackage
+, cryptography
+, databases
+, fastapi
+, fetchFromGitHub
+, importlib-metadata
+, mysqlclient
+, orjson
+, poetry-core
+, psycopg2
+, pydantic
+, pymysql
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, sqlalchemy
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "ormar";
+  version = "0.11.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "collerek";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-L0Tc/MmXDeNbUaHgWaxaY8lu+wUhq1ereqpya150SBg=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiomysql
+    aiosqlite
+    asyncpg
+    cryptography
+    databases
+    orjson
+    psycopg2
+    pydantic
+    sqlalchemy
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    typing-extensions
+    importlib-metadata
+  ];
+
+  checkInputs = [
+    aiomysql
+    aiopg
+    aiosqlite
+    asyncpg
+    fastapi
+    mysqlclient
+    psycopg2
+    pymysql
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'SQLAlchemy = ">=1.3.18,<1.4.39"' 'SQLAlchemy = ">=1.3.18"' \
+      --replace 'databases = ">=0.3.2,!=0.5.0,!=0.5.1,!=0.5.2,!=0.5.3,<0.6.1"' 'databases = ">=0.5.5"'
+  '';
+
+  disabledTests = [
+    # TypeError: Object of type bytes is not JSON serializable
+    "test_bulk_operations_with_json"
+  ];
+
+  pythonImportsCheck = [
+    "ormar"
+  ];
+
+  meta = with lib; {
+    description = "Async ORM with fastapi in mind and pydantic validation";
+    homepage = "https://github.com/collerek/ormar";
+    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..147685fb2b91
--- /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 sevice-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..4cb93d797476
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/os-service-types/tests.nix
@@ -0,0 +1,37 @@
+{ buildPythonPackage
+, keystoneauth1
+, os-service-types
+, oslotest
+, requests-mock
+, stestr
+, testscenarios
+}:
+
+buildPythonPackage rec {
+  pname = "os-service-types-tests";
+  inherit (os-service-types) version;
+
+  src = os-service-types.src;
+
+  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;
+
+  checkInputs = [
+    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..9d2a4929a6e7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/osc-lib/default.nix
@@ -0,0 +1,65 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchFromGitHub
+, cliff
+, oslo-i18n
+, oslo-utils
+, openstacksdk
+, pbr
+, requests-mock
+, simplejson
+, stestr
+}:
+
+buildPythonPackage rec {
+  pname = "osc-lib";
+  version = "unstable-2022-03-09";
+
+  src = fetchFromGitHub {
+    owner = "openstack";
+    repo = "osc-lib";
+    rev = "65c73fd5030276e34f3d52c03ddb9d27cd8ec6f5";
+    sha256 = "sha256-CLE9lrMMlvVrihe+N4wvIKe8t9IZ1TpHHVdn2dnvAOI=";
+  };
+
+  # fake version to make pbr.packaging happy and not reject it...
+  PBR_VERSION = "2.5.0";
+
+  nativeBuildInputs = [
+    pbr
+  ];
+
+  propagatedBuildInputs = [
+    cliff
+    openstacksdk
+    oslo-i18n
+    oslo-utils
+    simplejson
+  ];
+
+  checkInputs = [
+    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; {
+    broken = stdenv.isDarwin;
+    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..25d2d9caa316
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/osc/default.nix
@@ -0,0 +1,41 @@
+{ stdenv, lib, buildPythonPackage, fetchFromGitHub, bashInteractive, urlgrabber
+, m2crypto, rpm, chardet
+}:
+
+buildPythonPackage rec {
+  pname = "osc";
+  version = "0.170.0";
+
+  src = fetchFromGitHub {
+    owner = "openSUSE";
+    repo = "osc";
+    rev = version;
+    sha256 = "10dj9kscz59qm8rw5084gf0m8ail2rl7r8rg66ij92x88wvi9mbz";
+  };
+
+  buildInputs = [ bashInteractive ]; # needed for bash-completion helper
+  checkInputs = [ rpm ];
+  propagatedBuildInputs = [ urlgrabber m2crypto chardet ];
+
+  postInstall = ''
+    ln -s $out/bin/osc-wrapper.py $out/bin/osc
+    install -D -m444 osc.fish $out/etc/fish/completions/osc.fish
+    install -D -m555 dist/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
+  '';
+
+  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..7b2be6ab778c
--- /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=";
+    })
+  ];
+
+  checkInputs = [ 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..e4735aa4334d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/oscrypto/default.nix
@@ -0,0 +1,59 @@
+{ 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=";
+  };
+
+  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
+  ];
+
+  checkInputs = [
+    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/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..3706a4577bf5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/oslo-concurrency/default.nix
@@ -0,0 +1,72 @@
+{ 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.0.0";
+
+  src = fetchPypi {
+    pname = "oslo.concurrency";
+    inherit version;
+    sha256 = "sha256-n0aUbp+KcqBvFP49xBiaTT3TmGKDFSU5OjEZvbvniX4=";
+  };
+
+  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
+  ];
+
+  checkInputs = [
+    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
+  '';
+
+  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..abdafc4481b3
--- /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.0.0";
+
+  src = fetchPypi {
+    pname = "oslo.config";
+    inherit version;
+    sha256 = "sha256-O2tjxDzx4JNEuoULyxHW8rkgEIb76wqXqJUOfqw/JkU=";
+  };
+
+  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..c94eb2941b77
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/oslo-config/tests.nix
@@ -0,0 +1,41 @@
+{ buildPythonPackage
+, oslo-config
+, docutils
+, oslo-log
+, oslotest
+, requests-mock
+, sphinx
+, stestr
+, testscenarios
+}:
+
+buildPythonPackage rec {
+  pname = "oslo-config-tests";
+  inherit (oslo-config) version;
+
+  src = oslo-config.src;
+
+  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;
+
+  checkInputs = [
+    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..e558749b8489
--- /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.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-iMDG0HZoHGDVYPfWZWXkKsEWxaqKKKBNt8CsACUTMiQ=";
+  };
+
+  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
+  ];
+
+  checkInputs = [
+    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..7a393e69e741
--- /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 = "12.0.0";
+
+  src = fetchPypi {
+    pname = "oslo.db";
+    inherit version;
+    sha256 = "sha256-EFuxQWOk7GG85z+N8ZADLIdZiJuA8B1ZrsdwR+cN24c=";
+  };
+
+  nativeBuildInputs = [ pbr ];
+
+  propagatedBuildInputs = [
+    alembic
+    oslo-config
+    oslo-context
+    oslo-utils
+    sqlalchemy
+    sqlalchemy-migrate
+    testresources
+    testscenarios
+  ];
+
+  checkInputs = [
+    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..cdb6767c7a52
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/oslo-i18n/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, oslotest
+, pbr
+, testscenarios
+, stestr
+}:
+
+buildPythonPackage rec {
+  pname = "oslo-i18n";
+  version = "5.1.0";
+
+  src = fetchPypi {
+    pname = "oslo.i18n";
+    inherit version;
+    sha256 = "6bf111a6357d5449640852de4640eae4159b5562bbba4c90febb0034abc095d0";
+  };
+
+  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 ];
+
+  checkInputs = [
+    oslotest
+    stestr
+    testscenarios
+  ];
+
+  checkPhase = ''
+    stestr run
+  '';
+
+  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..4b9920c577d3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/oslo-log/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, oslo-config
+, oslo-context
+, oslo-serialization
+, oslo-utils
+, oslotest
+, pbr
+, pyinotify
+, python-dateutil
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "oslo-log";
+  version = "5.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    pname = "oslo.log";
+    inherit version;
+    hash = "sha256-c6tyNKii1QvfUmyHTfocsrEIO6+a2VvC64r1YkidTQE=";
+  };
+
+  propagatedBuildInputs = [
+    oslo-config
+    oslo-context
+    oslo-serialization
+    oslo-utils
+    pbr
+    python-dateutil
+  ] ++ lib.optionals stdenv.isLinux [
+    pyinotify
+  ];
+
+  checkInputs = [
+    oslotest
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # not compatible with sandbox
+    "test_logging_handle_error"
+  ];
+
+  pythonImportsCheck = [
+    "oslo_log"
+  ];
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    description = "oslo.log library";
+    homepage = "https://github.com/openstack/oslo.log";
+    license = licenses.asl20;
+    maintainers = teams.openstack.members;
+  };
+}
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..4b33bb06dc10
--- /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.0.0";
+
+  src = fetchPypi {
+    pname = "oslo.serialization";
+    inherit version;
+    sha256 = "sha256-KEUyjQ9H3Ioj/tKoIlPpCs/wqnMdvSTzec+OUObMZro=";
+  };
+
+  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 ];
+
+  checkInputs = [ 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..45e400856ba7
--- /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.0.0";
+
+  src = fetchPypi {
+    pname = "oslo.utils";
+    inherit version;
+    sha256 = "sha256-CpLiTESWht7CgAlXZr4+uOV/EyXNpMbyEpVBVk5ei6g=";
+  };
+
+  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
+  ];
+
+  checkInputs = [
+    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..aa646a08ee90
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/oslotest/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fixtures
+, pbr
+, subunit
+, callPackage
+}:
+
+buildPythonPackage rec {
+  pname = "oslotest";
+  version = "4.5.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "360ad2c41ba3ad6f059c7c6e7291450d082c2e5dbb0012e839a829978053dfe6";
+  };
+
+  nativeBuildInputs = [ pbr ];
+
+  propagatedBuildInputs = [
+    fixtures
+    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..542e9467d16f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/oslotest/tests.nix
@@ -0,0 +1,31 @@
+{ buildPythonPackage
+, oslo-config
+, oslotest
+, stestr
+}:
+
+buildPythonPackage rec {
+  pname = "oslotest-tests";
+  inherit (oslotest) version;
+
+  src = oslotest.src;
+
+  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;
+
+  checkInputs = [
+    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 100755
index 000000000000..4442d2ddee01
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/osmnx/default.nix
@@ -0,0 +1,29 @@
+{ lib, buildPythonPackage, fetchFromGitHub, pythonOlder, geopandas, matplotlib, networkx, numpy
+, pandas, requests, Rtree, shapely, folium, scikit-learn, scipy, gdal, rasterio}:
+
+buildPythonPackage rec {
+  pname = "osmnx";
+  version = "1.2.0";
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner  = "gboeing";
+    repo   = pname;
+    rev    = "v${version}";
+    sha256 = "sha256-HfgMmPEiKstMXV0rtul8QLxB1FY32Ws7IEonBB+qZOc=";
+  };
+
+  propagatedBuildInputs = [ geopandas matplotlib networkx numpy pandas requests Rtree shapely folium scikit-learn scipy gdal rasterio ];
+
+  # requires 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";
+    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..d273002ca2d9
--- /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}";
+    sha256 = "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 erictapen ];
+  };
+}
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..c4fe8be0b7ac
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ospd/default.nix
@@ -0,0 +1,50 @@
+{ 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 = "v${version}";
+    sha256 = "sha256-dZgs+G2vJQIKnN9xHcNeNViG7mOIdKb+Ms2AKE+FC4M=";
+  };
+
+  propagatedBuildInputs = [
+    defusedxml
+    deprecated
+    lxml
+    paramiko
+    psutil
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "ospd"
+  ];
+
+  meta = with lib; {
+    description = "Framework for vulnerability scanners which support OSP";
+    homepage = "https://github.com/greenbone/ospd";
+    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..865bd45c61b3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/osqp/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, cmake
+, future
+, numpy
+, qdldl
+, setuptools-scm
+, scipy
+# check inputs
+, pytestCheckHook
+, cvxopt
+}:
+
+buildPythonPackage rec {
+  pname = "osqp";
+  version = "0.6.2.post5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b2fa17aae42a7ed498ec261b33f262bb4b3605e7e8464062159d9fae817f0d61";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [ cmake setuptools-scm ];
+  dontUseCmakeConfigure = true;
+
+  propagatedBuildInputs = [
+    future
+    numpy
+    qdldl
+    scipy
+  ];
+
+  pythonImportsCheck = [ "osqp" ];
+  checkInputs = [ pytestCheckHook cvxopt ];
+  disabledTests = [
+    "mkl_"
+  ];
+
+  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..0ed3a0a3bdd7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/oss2/default.nix
@@ -0,0 +1,111 @@
+{ 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.16.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "aliyun";
+    repo = "aliyun-oss-python-sdk";
+    rev = version;
+    hash = "sha256-Q8U7zMlqpKSoW99MBm9p0AnrGZY7M9oRNImMNJaEjSw=";
+  };
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+  ];
+
+  propagatedBuildInputs = [
+    requests
+    crcmod
+    pycryptodome
+    aliyun-python-sdk-kms
+    aliyun-python-sdk-core
+    six
+  ];
+
+  checkInputs = [
+    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_cname.py"
+    "tests/test_bucket_inventory.py"
+    "tests/test_bucket_meta_query.py"
+    "tests/test_bucket_replication.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_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"
+  ];
+
+  meta = with lib; {
+    description = "Alibaba Cloud OSS SDK for Python";
+    homepage = "https://github.com/aliyun/aliyun-oss-python-sdk";
+    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..e6d8bf28a652
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ossfs/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fsspec
+, oss2
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "ossfs";
+  version = "2021.8.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "fsspec";
+    repo = pname;
+    rev = version;
+    hash = "sha256-bORiE3sIDNESjEizdzsJYZTSMbcqpbjostXo+0NQDfA=";
+  };
+
+  propagatedBuildInputs = [
+    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";
+    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..0150f1f5a2aa
--- /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;
+    sha256 = "sha256-b4K9PeRdowPPH3ceyvoWM3UKNYQ2qLtg4Goc63RdJnI=";
+  };
+
+  checkInputs = [ 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/ovh/default.nix b/nixpkgs/pkgs/development/python-modules/ovh/default.nix
new file mode 100644
index 000000000000..b9ab287260d6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ovh/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, mock
+, nose
+, requests
+, yanc
+}:
+
+buildPythonPackage rec {
+  pname = "ovh";
+  version = "1.0.0";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-IQzwu0gwfPNPOLQLCO99KL5Hu2094Y+acQBFXVGzHhU=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  checkInputs = [
+    mock
+    nose
+    yanc
+  ];
+
+  # requires network
+  checkPhase = ''
+    nosetests . \
+      -e test_config_get_conf \
+      -e test_config_get_custom_conf \
+      -e test_endpoints \
+      -e test_init_from_custom_config
+  '';
+
+  meta = {
+    description = "Thin wrapper around OVH's APIs";
+    homepage = "https://github.com/ovh/python-ovh";
+    license = lib.licenses.bsd2;
+    maintainers = [ lib.maintainers.makefu ];
+  };
+}
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..1e60872b2c1b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ovoenergy/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, click
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "ovoenergy";
+  version = "1.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "timmo001";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-OSK74uvpHuEtWgbLVFrz1NO7lvtHbt690smGQ+GlsOI=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    click
+  ];
+
+  # 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..10e7580af616
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/owslib/default.nix
@@ -0,0 +1,28 @@
+{ lib, buildPythonPackage, fetchPypi, python-dateutil, requests, pytz, pyproj , pytest, pyyaml } :
+buildPythonPackage rec {
+  pname = "OWSLib";
+  version = "0.26.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-jEywYzjrZAXCrs7QttCFaCqmHw8uUo8ceI1o3FDflBs=";
+  };
+
+  # as now upstream https://github.com/geopython/OWSLib/pull/824
+  postPatch = ''
+    substituteInPlace requirements.txt \
+      --replace 'pyproj ' 'pyproj #'
+  '';
+
+  buildInputs = [ pytest ];
+  propagatedBuildInputs = [ python-dateutil pyproj pytz requests pyyaml ];
+
+  # 'tests' dir not included in pypy distribution archive.
+  doCheck = false;
+
+  meta = with lib; {
+    description = "client for Open Geospatial Consortium web service interface standards";
+    license = licenses.bsd3;
+    homepage = "https://www.osgeo.org/projects/owslib/";
+  };
+}
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..e2519c0b9720
--- /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
+  ];
+
+  checkInputs = [
+    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..efa35f67ddf2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/p1monitor/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, aiohttp
+, aresponses
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, yarl
+}:
+
+buildPythonPackage rec {
+  pname = "p1monitor";
+  version = "2.1.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "klaasnicolaas";
+    repo = "python-p1monitor";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-3xvh/Ic2Mtczi5WREDXy+qQLpXhJQZf6fosT0h+fA0o=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    yarl
+  ];
+
+  checkInputs = [
+    aresponses
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace '"0.0.0"' '"${version}"' \
+      --replace 'addopts = "--cov"' ""
+  '';
+
+  pythonImportsCheck = [
+    "p1monitor"
+  ];
+
+  meta = with lib; {
+    description = "Module for interacting with the P1 Monitor";
+    homepage = "https://github.com/klaasnicolaas/python-p1monitor";
+    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..3caa8a5a5b68
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/packageurl-python/default.nix
@@ -0,0 +1,22 @@
+{ buildPythonPackage, fetchPypi, lib, pytestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "packageurl-python";
+  version = "0.10.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-86VSrHQxFs154lz7uMqPk4sG+RyipS3rqA8GoqcBB0k=";
+  };
+
+  checkInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "packageurl" ];
+
+  meta = with lib; {
+    description = "Python parser and builder for package URLs";
+    homepage = "https://github.com/package-url/packageurl-python";
+    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..c7587cb5c5dc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/packaging/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pyparsing
+, pytestCheckHook
+, pythonOlder
+, pretend
+, setuptools
+}:
+
+let
+  packaging = buildPythonPackage rec {
+    pname = "packaging";
+    version = "21.3";
+    format = "pyproject";
+
+    disabled = pythonOlder "3.6";
+
+    src = fetchPypi {
+      inherit pname version;
+      sha256 = "sha256-3UfEKSfYmrkR5gZRiQfMLTofOLvQJjhZcGQ/nFuOz+s=";
+    };
+
+    nativeBuildInputs = [
+      setuptools
+    ];
+
+    propagatedBuildInputs = [ pyparsing ];
+
+    checkInputs = [
+      pytestCheckHook
+      pretend
+    ];
+
+    # Prevent circular dependency
+    doCheck = false;
+
+    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..f27b0130a700
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/packet-python/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, requests
+, python
+
+# For tests/setup.py
+, pytest
+, pytest-runner
+, requests-mock
+}:
+
+buildPythonPackage rec {
+  pname = "packet-python";
+  version = "1.44.3";
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-WVfMELOoml7Hx78jy6TAwlFRLuSQu9dtsb6Khs6/cgI=";
+  };
+  nativeBuildInputs = [ pytest-runner ];
+  propagatedBuildInputs = [ requests ];
+  checkInputs = [
+    pytest
+    pytest-runner
+    requests-mock
+  ];
+
+  checkPhase = ''
+    ${python.interpreter} setup.py test
+  '';
+
+  meta = {
+    description = "A Python client for the Packet API.";
+    homepage    = "https://github.com/packethost/packet-python";
+    license     = lib.licenses.lgpl3;
+    maintainers = with lib.maintainers; [ dipinhora ];
+  };
+}
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..a0ac82a9f16e
--- /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;
+    sha256 = "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/pafy/default.nix b/nixpkgs/pkgs/development/python-modules/pafy/default.nix
new file mode 100644
index 000000000000..c657a2fa1b12
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pafy/default.nix
@@ -0,0 +1,23 @@
+{ lib, buildPythonPackage, youtube-dl, fetchPypi }:
+buildPythonPackage rec {
+  pname = "pafy";
+  version = "0.5.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "364f1d1312c89582d97dc7225cf6858cde27cb11dfd64a9c2bab1a2f32133b1e";
+  };
+
+  # No tests included in archive
+  doCheck = false;
+
+  propagatedBuildInputs = [ youtube-dl ];
+
+  meta = with lib; {
+    description = "A library to download YouTube content and retrieve metadata";
+    homepage = "https://github.com/mps-youtube/pafy";
+    license = licenses.lgpl3Plus;
+    maintainers = with maintainers; [ odi ];
+  };
+}
+
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..fb249acf6333
--- /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}";
+    sha256 = "sha256-9nH6xROVpmI+iTKXfwv2Ar1PAmWbEunI3HO0pZyK6Rg=";
+  };
+
+  checkInputs = [
+    pytestCheckHook
+    six
+  ] ++ lib.optional (!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..dce72bb74bb5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/palettable/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildPythonPackage, fetchPypi, pytest }:
+
+buildPythonPackage rec {
+  pname = "palettable";
+  version = "3.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "72feca71cf7d79830cd6d9181b02edf227b867d503bec953cf9fa91bf44896bd";
+  };
+
+  checkInputs = [ pytest ];
+
+  checkPhase = ''
+    pytest
+  '';
+
+  meta = with lib; {
+    description = "A library of color palettes";
+    homepage = "https://jiffyclub.github.io/palettable/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ psyanticy ];
+  };
+}
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..7fd62dae2cd9
--- /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.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "65c9389bef7d1bb0b168813b6be21964df32016923aac7515bdf05366acbab6c";
+  };
+
+  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..a367a180807d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pamqp/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  version = "3.1.0";
+  pname = "pamqp";
+
+  disabled = pythonOlder "3.7";
+
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "gmr";
+    repo = "pamqp";
+    rev = version;
+    hash = "sha256-qiYfQsyYvG6pyRFDt3pyYKNNWNP88maj+VAeGD68OmY=";
+  };
+
+  checkInputs = [
+    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..efaee8a42168
--- /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.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "u1f35c";
+    repo = "python-panacotta";
+    rev = "panacotta-${version}";
+    sha256 = "0v2fa18n50iy18n22klkgjral728iplj6yk3b6hjkzas5dk9wd9c";
+  };
+
+  # 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..c56847697769
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pandas-stubs/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, isPy27
+, fetchFromGitHub
+, typing-extensions
+, mypy
+}:
+
+buildPythonPackage rec {
+  pname = "pandas-stubs";
+  version = "1.2.0.39";
+
+  disabled = isPy27;
+
+  # Use GitHub source since PyPi source does not include tests
+  src = fetchFromGitHub {
+    owner = "VirtusLab";
+    repo = pname;
+    rev = "2bd932777d1050ea8f86c527266a4cd205aa15b1";
+    sha256 = "m2McU53NNvRwnWKN9GL8dW1eCGKbTi0471szRQwZu1Q=";
+  };
+
+  propagatedBuildInputs = [
+    typing-extensions
+  ];
+
+  pythonImportsCheck = [ "pandas" ];
+  checkInputs = [ mypy ];
+  checkPhase = ''
+    mypy --config-file mypy.ini third_party/3/pandas tests/snippets
+  '';
+
+  meta = with lib; {
+    description = "Type annotations for Pandas";
+    homepage = "https://github.com/VirtusLab/pandas-stubs";
+    license = licenses.mit;
+    maintainers = [ 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..2c4f20478339
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pandas/default.nix
@@ -0,0 +1,138 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, python
+, cython
+, numpy
+, python-dateutil
+, pytz
+, scipy
+, sqlalchemy
+, tables
+, xlrd
+, xlwt
+# Test inputs
+, glibcLocales
+, hypothesis
+, jinja2
+, pytestCheckHook
+, pytest-xdist
+, pytest-asyncio
+, XlsxWriter
+# Darwin inputs
+, runtimeShell
+, libcxx
+}:
+
+buildPythonPackage rec {
+  pname = "pandas";
+  version = "1.4.3";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-L/d4hGjnWRdXTwgM1GgbJ+GnvzZGH+lotJqHtaVNAHw=";
+  };
+
+  nativeBuildInputs = [ cython ];
+
+  buildInputs = lib.optional stdenv.isDarwin libcxx;
+
+  propagatedBuildInputs = [
+    numpy
+    python-dateutil
+    pytz
+  ];
+
+  checkInputs = [
+    glibcLocales
+    hypothesis
+    jinja2
+    pytest-asyncio
+    pytest-xdist
+    pytestCheckHook
+    XlsxWriter
+  ];
+
+  # Doesn't work with -Werror,-Wunused-command-line-argument
+  # https://github.com/NixOS/nixpkgs/issues/39687
+  hardeningDisable = lib.optional stdenv.cc.isClang "strictoverflow";
+
+  doCheck = !stdenv.isAarch32 && !stdenv.isAarch64; # upstream doesn't test this architecture
+
+  # don't max out build cores, it breaks tests
+  dontUsePytestXdist = true;
+
+  pytestFlagsArray = [
+    # https://github.com/pandas-dev/pandas/blob/main/test_fast.sh
+    "--skip-db"
+    "--skip-slow"
+    "--skip-network"
+    "-m" "'not single_cpu'"
+    "--numprocesses" "4"
+  ];
+
+  disabledTests = [
+    # Locale-related
+    "test_names"
+    "test_dt_accessor_datetime_name_accessors"
+    "test_datetime_name_accessors"
+    # Disable IO related tests because IO data is no longer distributed
+    "io"
+    # Tries to import from pandas.tests post install
+    "util_in_top_level"
+    # Tries to import compiled C extension locally
+    "test_missing_required_dependency"
+    # AssertionError with 1.2.3
+    "test_from_coo"
+    # AssertionError: No common DType exists for the given inputs
+    "test_comparison_invalid"
+    # AssertionError: Regex pattern '"quotechar" must be string, not int'
+    "python-kwargs2"
+    # Tests for rounding errors and fails if we have better precision
+    # than expected, e.g. on amd64 with FMA or on arm64
+    # https://github.com/pandas-dev/pandas/issues/38921
+    "test_rolling_var_numerical_issues"
+  ] ++ lib.optionals stdenv.isDarwin [
+    "test_locale"
+    "test_clipboard"
+    # ValueError: cannot reindex on an axis with duplicate labels
+    #
+    # Attempts to reproduce this problem outside of Hydra failed.
+    "test_reindex_timestamp_with_fold"
+  ];
+
+  # Tests have relative paths, and need to reference compiled C extensions
+  # so change directory where `import .test` is able to be resolved
+  preCheck = ''
+    cd $out/${python.sitePackages}/pandas
+    export LC_ALL="en_US.UTF-8"
+    PYTHONPATH=$out/${python.sitePackages}:$PYTHONPATH
+  ''
+  # 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
+  '';
+
+  enableParallelBuilding = true;
+
+  pythonImportsCheck = [ "pandas" ];
+
+  meta = with lib; {
+    # https://github.com/pandas-dev/pandas/issues/14866
+    # pandas devs are no longer testing i686 so safer to assume it's broken
+    broken = stdenv.isi686;
+    homepage = "https://pandas.pydata.org/";
+    changelog = "https://pandas.pydata.org/docs/whatsnew/index.html";
+    description = "Python Data Analysis Library";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ raskin fridh knedlsepp ];
+    platforms = platforms.unix;
+  };
+}
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..ce365708b35d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pandoc-xnos/default.nix
@@ -0,0 +1,30 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, lib
+, pandocfilters
+, psutil
+}:
+
+buildPythonPackage rec {
+  pname = "pandoc-xnos";
+  version = "2.5.0";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "tomduck";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-beiGvN0DS6s8wFjcDKozDuwAM2OApX3lTRaUDRUqLeU=";
+  };
+
+  propagatedBuildInputs = [ pandocfilters psutil ];
+
+  pythonImportsCheck = [ "pandocxnos" ];
+
+  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..466f3e1e6dfa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/panel/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, bleach
+, bokeh
+, param
+, pyviz-comms
+, markdown
+, pyct
+, testpath
+, tqdm
+, nodejs
+}:
+
+buildPythonPackage rec {
+  pname = "panel";
+  version = "0.13.1";
+
+  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-1GC119AUfmse3fhQQxSi9eDJJorYvt2NeE7UY1GrW3E=";
+  };
+
+  propagatedBuildInputs = [
+    bleach
+    bokeh
+    param
+    pyviz-comms
+    markdown
+    pyct
+    testpath
+    tqdm
+  ];
+
+  # infinite recursion in test dependencies (hvplot)
+  doCheck = false;
+
+  passthru = {
+    inherit nodejs; # For convenience
+  };
+
+  meta = with lib; {
+    description = "A high level dashboarding library for python visualization libraries";
+    homepage = "https://pyviz.org";
+    license = licenses.bsd3;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..a0c4930ab010
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/panflute/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, fetchPypi
+, click
+, pyyaml
+, buildPythonPackage
+, pythonOlder
+}:
+
+buildPythonPackage rec{
+  pname = "panflute";
+  version = "2.2.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-AJMz+gt8Wa45aFZSLm15RjiiJlJnkWC4Lobk8o8Pu8Y=";
+  };
+
+  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";
+    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..d9de15ad76ee
--- /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
+    ];
+  };
+
+  checkInputs = [
+    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; [ costrouc ];
+  };
+}
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..b33f65bad5c4
--- /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
+, fetchFromGitHub
+, filetype
+, habanero
+, isbnlib
+, lxml
+, prompt-toolkit
+, pygments
+, pyparsing
+, pytestCheckHook
+, python-doi
+, python-slugify
+, pythonAtLeast
+, pythonOlder
+, pyyaml
+, requests
+, stevedore
+, tqdm
+, typing-extensions
+, whoosh
+, xdg-utils
+}:
+
+buildPythonPackage rec {
+  pname = "papis";
+  version = "0.12";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "papis";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-WKsU/5LXqXiFpWyTZGpvZn4lyANPosbvuhYH3opbBRs=";
+  };
+
+  propagatedBuildInputs = [
+    arxiv2bib
+    beautifulsoup4
+    bibtexparser
+    chardet
+    click
+    colorama
+    configparser
+    filetype
+    habanero
+    isbnlib
+    lxml
+    prompt-toolkit
+    pygments
+    pyparsing
+    python-doi
+    python-slugify
+    pyyaml
+    requests
+    stevedore
+    tqdm
+    typing-extensions
+    whoosh
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "isbnlib>=3.9.1,<3.10" "isbnlib>=3.9"
+    substituteInPlace setup.cfg \
+      --replace "--cov=papis" ""
+  '';
+
+  # Tests are failing on Python > 3.9
+  doCheck = !stdenv.isDarwin && !(pythonAtLeast "3.10");
+
+  checkInputs = ([
+    pytestCheckHook
+  ]) ++ [
+    xdg-utils
+  ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d);
+  '';
+
+  pytestFlagsArray = [
+    "papis tests"
+  ];
+
+  disabledTestPaths = [
+    "tests/downloaders"
+  ];
+
+  disabledTests = [
+    "get_document_url"
+    "match"
+    "test_doi_to_data"
+    "test_downloader_getter"
+    "test_general"
+    "test_get_data"
+    "test_validate_arxivid"
+    "test_yaml"
+  ];
+
+  pythonImportsCheck = [
+    "papis"
+  ];
+
+  meta = with lib; {
+    description = "Powerful command-line document and bibliography manager";
+    homepage = "https://papis.readthedocs.io/";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ nico202 teto ];
+  };
+}
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..dc1e8c9ae517
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/param/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "param";
+  version = "1.12.2";
+
+  src = fetchFromGitHub {
+    owner = "holoviz";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-NrMsIDcpZc/R2j8VuXitbnIlhP3NtLxU/OkygXqYok8=";
+  };
+
+  checkInputs = [
+    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://github.com/pyviz/param";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ costrouc ];
+  };
+}
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..4f2c5eaf6094
--- /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
+  ];
+
+  checkInputs = [
+    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..5ec4421ec8be
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/parameterized/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, glibcLocales
+, isPy3k
+, mock
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "parameterized";
+  version = "0.8.1";
+  disable = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-Qbv/N9YYZDD3f5ANd35btqJJKKHEb7HeaS+LUriDO1w=";
+  };
+
+  checkInputs = [
+    nose
+    mock
+    glibcLocales
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+    LC_ALL="en_US.UTF-8" nosetests -v
+    runHook postCheck
+  '';
+
+  pythonImportsCheck = [ "parameterized" ];
+
+  meta = with lib; {
+    description = "Parameterized testing with any Python test framework";
+    homepage = "https://github.com/wolever/parameterized";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/parameterizedtestcase/default.nix b/nixpkgs/pkgs/development/python-modules/parameterizedtestcase/default.nix
new file mode 100644
index 000000000000..9d277af8d1a9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/parameterizedtestcase/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+, isPy27
+}:
+
+buildPythonPackage rec {
+  pname = "parameterizedtestcase";
+  version = "0.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "4ccc1d15d7e7ef153619a6a9cd45b170268cf82c67fdd336794c75139aae127e";
+  };
+
+  checkPhase = ''
+    runHook preCheck
+    ${python.interpreter} -m parameterizedtestcase.tests
+    runHook postCheck
+  '';
+
+  doCheck = isPy27;
+
+  meta = with lib; {
+    description = "Parameterized tests for Python's unittest module";
+    homepage = "https://github.com/msabramo/python_unittest_parameterized_test_case";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+    broken = python.isPy3k; # uses use_2to3
+  };
+}
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..9a0046940035
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/paramiko/default.nix
@@ -0,0 +1,82 @@
+{ lib
+, bcrypt
+, buildPythonPackage
+, cryptography
+, fetchpatch
+, fetchPypi
+, gssapi
+, invoke
+, mock
+, pyasn1
+, pynacl
+, pytest-relaxed
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "paramiko";
+  version = "2.11.0";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-AD5r7nwDTCH7sFG/g9wKnuQQYgTdPFMFTHFFLMTsOTg=";
+  };
+
+  patches = [
+    # Fix usage of dsa keys
+    # https://github.com/paramiko/paramiko/pull/1606/
+    (fetchpatch {
+      url = "https://github.com/paramiko/paramiko/commit/18e38b99f515056071fb27b9c1a4f472005c324a.patch";
+      sha256 = "sha256-bPDghPeLo3NiOg+JwD5CJRRLv2VEqmSx1rOF2Tf8ZDA=";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    cryptography
+    pyasn1
+  ] ++ passthru.optional-dependencies.ed25519; # remove on 3.0 update
+
+  checkInputs = [
+    invoke
+    mock
+    pytest-relaxed
+    pytestCheckHook
+  ];
+
+  # with python 3.9.6+, the deprecation warnings will fail the test suite
+  # see: https://github.com/pyinvoke/invoke/issues/829
+  # pytest-relaxed does not work with pytest 6
+  # see: https://github.com/bitprophet/pytest-relaxed/issues/12
+  doCheck = false;
+
+  disabledTestPaths = [
+    "tests/test_sftp.py"
+    "tests/test_config.py"
+  ];
+
+  pythonImportsCheck = [
+    "paramiko"
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  passthru.optional-dependencies = {
+    gssapi = [ pyasn1 gssapi ];
+    ed25519 = [ pynacl bcrypt ];
+    invoke = [ invoke ];
+  };
+
+  meta = with lib; {
+    homepage = "https://github.com/paramiko/paramiko/";
+    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; [ SuperSandro2000 ];
+  };
+}
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..99065aa19944
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/paramz/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchPypi, numpy, scipy, six, decorator, nose }:
+
+buildPythonPackage rec {
+  pname = "paramz";
+  version = "0.9.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0917211c0f083f344e7f1bc997e0d713dbc147b6380bc19f606119394f820b9a";
+  };
+
+  propagatedBuildInputs = [ numpy scipy six decorator ];
+  checkInputs = [ nose ];
+
+  # Ran 113 tests in 3.082s
+  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/parfive/default.nix b/nixpkgs/pkgs/development/python-modules/parfive/default.nix
new file mode 100644
index 000000000000..131d8de094fc
--- /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.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-/b4KrYg0mXoQJ/L+9ol7gD2myB0aLgDj0IWa8sxarKU=";
+  };
+
+  buildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    aioftp
+    aiohttp
+    tqdm
+  ];
+
+  checkInputs = [
+    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; [ costrouc ];
+  };
+}
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..3be0cce9fa4e
--- /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
+  ];
+
+  checkInputs = [
+    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..3356853e8ac4
--- /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.0";
+
+  src = fetchFromGitHub {
+    owner = "jenisys";
+    repo = "parse_type";
+    rev = "v${version}";
+    sha256 = "sha256-v79zzAAwXYoK2N8ZPl1L90qOwMRexAV2wCTMvo4vrSc=";
+  };
+
+  propagatedBuildInputs = [
+    parse
+    six
+  ];
+
+  checkInputs = [
+    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..1ce34bfaab68
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/parse/default.nix
@@ -0,0 +1,23 @@
+{ lib, fetchPypi
+, buildPythonPackage, python
+}:
+buildPythonPackage rec {
+  pname = "parse";
+  version = "1.19.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9ff82852bcb65d139813e2a5197627a94966245c897796760a3a2a8eb66f020b";
+  };
+
+  checkPhase = ''
+    ${python.interpreter} test_parse.py
+  '';
+
+  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..4b42071f01fb
--- /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 ];
+
+  checkInputs = [ 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..c07a773eee17
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/parsedmarc/default.nix
@@ -0,0 +1,99 @@
+{ buildPythonPackage
+, fetchPypi
+, fetchurl
+, lib
+, nixosTests
+, python
+, pythonOlder
+
+# pythonPackages
+, dnspython
+, expiringdict
+, publicsuffix2
+, xmltodict
+, geoip2
+, urllib3
+, requests
+, imapclient
+, dateparser
+, mailsuite
+, elasticsearch
+, elasticsearch-dsl
+, kafka-python
+, tqdm
+, lxml
+, boto3
+, msgraph-core
+, azure-identity
+, google-api-core
+, google-api-python-client
+, google-auth
+, google-auth-httplib2
+, google-auth-oauthlib
+}:
+
+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.2.0";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "eb82328dffb4a62ddaefbcc22efd5a2694350504a56d41ba1e161f2d998dcbff";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "elasticsearch<7.14.0" "elasticsearch"
+  '';
+
+  propagatedBuildInputs = [
+    dnspython
+    expiringdict
+    publicsuffix2
+    xmltodict
+    geoip2
+    urllib3
+    requests
+    imapclient
+    dateparser
+    mailsuite
+    elasticsearch
+    elasticsearch-dsl
+    kafka-python
+    tqdm
+    lxml
+    boto3
+    msgraph-core
+    azure-identity
+    google-api-core
+    google-api-python-client
+    google-auth
+    google-auth-httplib2
+    google-auth-oauthlib
+  ];
+
+  # no tests on PyPI, no tags on GitHub
+  doCheck = false;
+
+  pythonImportsCheck = [ "parsedmarc" ];
+
+  passthru = {
+    inherit dashboard;
+    tests = nixosTests.parsedmarc;
+  };
+
+  meta = {
+    description = "Python module and CLI utility for parsing DMARC reports";
+    homepage = "https://domainaware.github.io/parsedmarc/";
+    maintainers = with lib.maintainers; [ talyz ];
+    license = lib.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..423f4eb0293b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/parsel/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, buildPythonPackage
+, cssselect
+, fetchPypi
+, functools32
+, isPy27
+, lxml
+, pytestCheckHook
+, six
+, w3lib
+}:
+
+buildPythonPackage rec {
+  pname = "parsel";
+  version = "1.6.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0yawf9r3r863lwxj0n89i7h3n8xjbsl5b7n6xg76r68scl5yzvvh";
+  };
+
+  propagatedBuildInputs = [
+    cssselect
+    lxml
+    six
+    w3lib
+  ] ++ lib.optionals isPy27 [
+    functools32
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "'pytest-runner'," ""
+  '';
+
+  disabledTests = [
+    # Test are out-dated and are failing (AssertionError: Lists differ: ...)
+    # https://github.com/scrapy/parsel/pull/174
+    "test_differences_parsing_xml_vs_html"
+    "test_nested_selectors"
+    "test_re"
+    "test_replacement_null_char_from_body"
+    "test_select_on_text_nodes"
+    "test_selector_get_alias"
+    "test_selector_getall_alias"
+    "test_selector_over_text"
+    "test_selectorlist_get_alias"
+    "test_selectorlist_getall_alias"
+    "test_slicing"
+    "test_text_pseudo_element"
+  ];
+
+  pythonImportsCheck = [ "parsel" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/scrapy/parsel";
+    description = "Python library to extract data from HTML and XML using XPath and CSS selectors";
+    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..d517e9433e41
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/parsimonious/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, regex
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "parsimonious";
+  version = "0.9.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-sq0a5jovZb149eCorFEKmPNgekPx2yqNRmNqXZ5KMME=";
+  };
+
+  propagatedBuildInputs = [
+    regex
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  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..16313ab16ee8
--- /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;
+    sha256 = "sha256-jAe+KQu1nwNYiRWSHinopQACrK8s3F+g4BFPkXCfr6A=";
+  };
+
+  checkInputs = [ 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..9083953009ad
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/parsy/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "parsy";
+  version = "1.4.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    repo = "parsy";
+    owner = "python-parsy";
+    rev = "v${version}";
+    sha256 = "sha256-FislrLb+u4T5m/eEER7kazZHJKEwPHe+Vg/YDJp4PyM=";
+  };
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "parsy"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/python-parsy/parsy";
+    description = "Easy-to-use parser combinators, for parsing in pure Python";
+    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..9b5a94fa9107
--- /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.2.0";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "aa67897b84d522dcbc86a98b942afab8c6aa2f7f677d904a616b74ef5ddbc3eb";
+  };
+
+  checkInputs = [ 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..d1207fe84983
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/particle/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchPypi
+, setuptools-scm
+, attrs
+, deprecated
+, hepunits
+, pytestCheckHook
+, tabulate
+, pandas
+}:
+
+buildPythonPackage rec {
+  pname = "particle";
+  version = "0.20.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-HoWWwoGMrkRqlYzrF2apGsxsZAHwHbHSO5TCSCelxUc=";
+  };
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    attrs
+    deprecated
+    hepunits
+  ];
+
+  pythonImportsCheck = [
+    "particle"
+  ];
+
+  preCheck = ''
+    # Disable benchmark tests, so we won't need pytest-benchmark and pytest-cov
+    # as dependencies
+    substituteInPlace pyproject.toml \
+      --replace '"--benchmark-disable", ' ""
+    rm tests/particle/test_performance.py
+  '';
+
+  checkInputs = [
+    pytestCheckHook
+    tabulate
+    pandas
+  ];
+
+  meta = {
+    description = "Package to deal with particles, the PDG particle data table, PDGIDs, etc.";
+    homepage = "https://github.com/scikit-hep/particle";
+    license = lib.licenses.bsd3;
+    maintainers = with lib.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..ba54ce2e70a6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/parts/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "parts";
+  version = "1.5.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-gOPDqXF05bQcG0Kv0+akBrikRr/CfHB9/tM/TJDPHdM=";
+  };
+
+  # 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..878b2746758c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/parver/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, six
+, attrs
+, pytestCheckHook
+, hypothesis
+, pretend
+, arpeggio
+}:
+
+buildPythonPackage rec {
+  pname = "parver";
+  version = "0.3.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c902e0653bcce927cc156a7fd9b3a51924cbce3bf3d0bfd49fc282bfd0c5dfd3";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "arpeggio ~= 1.7" "arpeggio"
+  '';
+
+  propagatedBuildInputs = [
+    six
+    attrs
+    arpeggio
+  ];
+
+  checkInputs = [
+    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; [ SuperSandro2000 ];
+  };
+}
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..3a39f7ac7d58
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/passlib/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, argon2-cffi
+, bcrypt
+, cryptography
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "passlib";
+  version = "1.7.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "defd50f72b65c5402ab2c573830a6978e5f202ad0d984793c8dde2c4152ebe04";
+  };
+
+  passthru.optional-dependencies = {
+    argon2 = [ argon2-cffi ];
+    bcrypt = [ bcrypt ];
+    totp = [ cryptography ];
+  };
+
+  checkInputs = [
+    pytestCheckHook
+  ] ++ passthru.optional-dependencies.argon2
+    ++ passthru.optional-dependencies.bcrypt
+    ++ passthru.optional-dependencies.totp;
+
+  meta = with lib; {
+    description = "A password hashing library for Python";
+    homepage = "https://foss.heptapod.net/python-libs/passlib";
+    license = licenses.bsdOriginal;
+  };
+}
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..9186cef3efc6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/paste/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "paste";
+  version = "3.5.0";
+
+  src = fetchFromGitHub {
+    owner = "cdent";
+    repo = "paste";
+    rev = version;
+    sha256 = "sha256-yaOxbfQ8rdViepxhdF0UzlelC/ozdsP1lOdU5w4OPEQ=";
+  };
+
+  postPatch = ''
+    patchShebangs tests/cgiapp_data/
+  '';
+
+  propagatedBuildInputs = [ six ];
+
+  checkInputs = [ pytestCheckHook ];
+
+  disabledTests = [
+    # broken test
+    "test_file_cache"
+    # requires network connection
+    "test_proxy_to_website"
+  ];
+
+  pythonNamespaces = [ "paste" ];
+
+  meta = with lib; {
+    description = "Tools for using a Web Server Gateway Interface stack";
+    homepage = "http://pythonpaste.org/";
+    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..07705d62b32b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pastedeploy/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pastedeploy";
+  version = "2.1.1";
+
+  src = fetchFromGitHub {
+    owner = "Pylons";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-9/8aM/G/EdapCZJlx0ZPzNbmw2uYjA1zGbNWJAWoeCU=";
+  };
+
+  checkInputs = [ pytestCheckHook ];
+
+  meta = with lib; {
+    description = "Load, configure, and compose WSGI applications and servers";
+    homepage = "https://github.com/Pylons/pastedeploy";
+    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..39953306fbb1
--- /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";
+  };
+
+  checkInputs = [ 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..244b51f3f844
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pastescript/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nose
+, python
+, pytestCheckHook
+, six
+, paste
+, pastedeploy
+}:
+
+buildPythonPackage rec {
+  pname = "pastescript";
+  version = "3.2.1";
+
+  src = fetchPypi {
+    pname = "PasteScript";
+    inherit version;
+    sha256 = "f3ef819785e1b284e6fc108a131bce7e740b18255d96cd2e99ee3f00fd452468";
+  };
+
+  propagatedBuildInputs = [
+    paste
+    pastedeploy
+    six
+  ];
+
+  # test suite seems to unset PYTHONPATH
+  doCheck = false;
+  checkInputs = [ 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..2f0a9b9b62b7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/patator/default.nix
@@ -0,0 +1,47 @@
+{ lib, buildPythonPackage, isPy27, fetchPypi
+, paramiko, pycurl, ajpy, impacket, pyopenssl, cx_oracle, mysqlclient
+, psycopg2, pycrypto, dnspython, ipy, pysnmp, pyasn1, pysqlcipher3 }:
+
+
+buildPythonPackage rec {
+  pname = "patator";
+  version = "0.9";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "68cb24bdc3042ee0d47a288b19a8b99a6c54bdbd4ddf0c5817d9b9ac0a0d8a15";
+  };
+
+  postPatch = ''
+    substituteInPlace requirements.txt \
+      --replace psycopg2-binary psycopg2
+  '';
+
+  propagatedBuildInputs = [
+    paramiko
+    pycurl
+    ajpy
+    impacket
+    pyopenssl
+    cx_oracle
+    mysqlclient
+    psycopg2
+    pycrypto
+    dnspython
+    ipy
+    pysnmp
+    pyasn1
+    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.gpl2;
+    maintainers = with maintainers; [ y0no SuperSandro2000 ];
+  };
+}
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..bd71ffad0f2c
--- /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";
+  };
+
+  checkInputs = [ 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..a22aa64e8b1e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/path/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+
+# build time
+, setuptools-scm
+
+# tests
+, pytestCheckHook
+, appdirs
+, packaging
+}:
+
+buildPythonPackage rec {
+  pname = "path";
+  version = "16.4.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-uvLnV8Sxm+ggj55n5I+0dbSld9VhNZDORmk7298IL1I=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  checkInputs = [
+    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";
+    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..39679fb1f575
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pathable/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, poetry-core
+}:
+
+buildPythonPackage rec {
+  pname = "pathable";
+  version = "0.4.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "p1c2u";
+    repo = pname;
+    rev = version;
+    hash = "sha256-3qekweG+o7f6nm1cnCEHrWYn/fQ42GZrZkPwGbZcU38=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  checkInputs = [
+    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";
+    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..cf4dd0999d4a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pathlib/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+, 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";
+  };
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest discover
+  '';
+
+  meta = {
+    description = "Object-oriented filesystem paths";
+    homepage = "https://pathlib.readthedocs.org/";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ costrouc ];
+  };
+}
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..f0f0163652ca
--- /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;
+    sha256 = "sha256-n+DtrYmLg8DD4ZnIQrJ+0hZkXS4Xd1ey3Wc4TUETxkE=";
+  };
+
+  propagatedBuildInputs = [ six ]
+    ++ lib.optionals (pythonOlder "3.5") [ scandir typing ];
+  checkInputs = [ 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; [ SuperSandro2000 ];
+  };
+}
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..9c6dd6256606
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pathos/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, dill
+, pox
+, ppft
+, multiprocess
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pathos";
+  version = "0.2.9";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "uqfoundation";
+    repo = pname;
+    rev = "refs/tags/pathos-${version}";
+    sha256 = "sha256-39D+itH0nkOzmh3Rpg/HXLRj2F1UPsys+iU0ZiodkM0=";
+  };
+
+  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/";
+    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..6a0281b756ec
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pathspec/default.nix
@@ -0,0 +1,21 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname   = "pathspec";
+  version = "0.9.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1";
+  };
+
+  meta = {
+    description = "Utility library for gitignore-style pattern matching of file paths";
+    homepage = "https://github.com/cpburnz/python-path-specification";
+    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..f2465284593f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pathvalidate/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildPythonPackage, fetchPypi, pythonOlder }:
+
+buildPythonPackage rec {
+  pname = "pathvalidate";
+  version = "2.5.1";
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-u8J+ZTM1q6eTWireIpliLnapSHvJAEzc8UQc6NL/SlQ=";
+  };
+
+  # Requires `pytest-md-report`, causing infinite recursion.
+  doCheck = false;
+
+  pythonImportsCheck = [ "pathvalidate" ];
+
+  meta = with lib; {
+    description = "A Python library to sanitize/validate a string such as filenames/file-paths/etc";
+    homepage = "https://github.com/thombashi/pathvalidate";
+    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..30cdd782df2e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pathy/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, buildPythonPackage
+, dataclasses
+, fetchPypi
+, fetchpatch
+, google-cloud-storage
+, mock
+, pytestCheckHook
+, pythonOlder
+, smart-open
+, typer
+}:
+
+buildPythonPackage rec {
+  pname = "pathy";
+  version = "0.6.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "838624441f799a06b446a657e4ecc9ebc3fdd05234397e044a7c87e8f6e76b1c";
+  };
+
+  propagatedBuildInputs = [
+    smart-open
+    typer
+    google-cloud-storage
+  ] ++ lib.optionals (pythonOlder "3.7") [
+    dataclasses
+  ];
+
+  checkInputs = [
+    mock
+    pytestCheckHook
+  ];
+
+  patches = [
+    # Support for smart-open >= 6.0.0, https://github.com/justindujardin/pathy/pull/71
+    (fetchpatch {
+      name = "support-later-smart-open.patch";
+      url = "https://github.com/justindujardin/pathy/commit/ba1c23df6ee5d1e57bdfe845ff6a9315cba3df6a.patch";
+      sha256 = "sha256-V1i4tx73Xkdqb/wZhQIv4p6FVpF9SEfDhlBkwaaRE3w=";
+    })
+  ];
+
+  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..0d4e7d513483
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/patiencediff/default.nix
@@ -0,0 +1,18 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "patiencediff";
+  version = "0.2.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "456d9fc47fe43f9aea863059ea2c6df5b997285590e4b7f9ee8fbb6c3419b5a7";
+  };
+
+  meta = with lib; {
+    description = "C implementation of patiencediff algorithm for Python";
+    homepage = "https://github.com/breezy-team/patiencediff";
+    license = licenses.gpl2Plus;
+    maintainers = [ 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..cbc3a05044ee
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/patool/default.nix
@@ -0,0 +1,56 @@
+{ lib, buildPythonPackage, fetchFromGitHub, pytestCheckHook, p7zip,
+  cabextract, zip, lzip, zpaq, gnutar, gnugrep, diffutils, file,
+  gzip, bzip2, xz}:
+
+# unrar is unfree, as well as 7z with unrar support, not including it (patool doesn't support unar)
+# it will still use unrar if present in the path
+
+let
+  compression-utilities = [
+    p7zip
+    gnutar
+    cabextract
+    zip
+    lzip
+    zpaq
+    gzip
+    gnugrep
+    diffutils
+    bzip2
+    file
+    xz
+  ];
+in
+buildPythonPackage rec {
+  pname = "patool";
+  version = "1.12";
+
+  #pypi doesn't have test data
+  src = fetchFromGitHub {
+    owner = "wummel";
+    repo = pname;
+    rev = "upstream/${version}";
+    sha256 = "0v4r77sm3yzh7y1whfwxmp01cchd82jbhvbg9zsyd2yb944imzjy";
+  };
+
+  postPatch = ''
+    substituteInPlace patoolib/util.py \
+      --replace "path = None" 'path = os.environ["PATH"] + ":${lib.makeBinPath compression-utilities}"'
+  '';
+
+  checkInputs = [ 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..22de8feb0e74
--- /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;
+    sha256 = "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..71bf10bb3c00
--- /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.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5053de7804676aba62783dbb0f23a2b3d74e35e5bfa238b88b7cbf148a38b69d";
+  };
+
+  propagatedBuildInputs = [
+    six
+    numpy
+    scipy
+  ];
+
+  checkInputs = [
+    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..8721ef3dd601
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/paver/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nose
+, cogapp
+, mock
+, virtualenv
+}:
+
+buildPythonPackage rec {
+  version = "1.3.4";
+  pname   = "Paver";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d3e6498881485ab750efe40c5278982a9343bc627e137b11adced627719308c7";
+  };
+
+  buildInputs = [ cogapp mock virtualenv ];
+
+  propagatedBuildInputs = [ nose ];
+
+  # the tests do not pass
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A Python-based build/distribution/deployment scripting tool";
+    homepage    = "https://github.com/paver/paver";
+    maintainers = with maintainers; [ lovek323 ];
+    platforms   = platforms.unix;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/paypalrestsdk/default.nix b/nixpkgs/pkgs/development/python-modules/paypalrestsdk/default.nix
new file mode 100644
index 000000000000..26c44f0b070b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/paypalrestsdk/default.nix
@@ -0,0 +1,20 @@
+{ buildPythonPackage, fetchPypi
+, requests, six, pyopenssl }:
+
+buildPythonPackage rec {
+  pname = "paypalrestsdk";
+  version = "1.13.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "238713208031e8981bf70b3350b3d7f85ed64d34e0f21e4c1184444a546fee7f";
+  };
+
+  propagatedBuildInputs = [ requests six pyopenssl ];
+
+  meta = {
+    homepage = "https://developer.paypal.com/";
+    description = "Python APIs to create, process and manage payment";
+    license = "PayPal SDK License";
+  };
+}
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..7fb0574f75a0
--- /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.9.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-6Nyi9LQ1YO3vWIE5afUqVs7wIxRsu4kxYm24DmwcQwg=";
+  };
+
+  # 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..aacb726d6a1d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pbr/tests.nix
@@ -0,0 +1,48 @@
+{ buildPythonPackage
+, build
+, git
+, gnupg
+, pbr
+, sphinx
+, stestr
+, testresources
+, testscenarios
+, virtualenv
+}:
+
+buildPythonPackage rec {
+  pname = "pbr";
+  inherit (pbr) version;
+
+  src = pbr.src;
+
+  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;
+
+  checkInputs = [
+    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..b9f8486aa5d6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pc-ble-driver-py/default.nix
@@ -0,0 +1,64 @@
+{ 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 = "v${version}";
+    sha256 = "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";
+    license = licenses.unfreeRedistributable;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ gebner ];
+  };
+}
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..7fec65bfb52f
--- /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
+  ];
+
+  checkInputs = [
+    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/pcodedmp/default.nix b/nixpkgs/pkgs/development/python-modules/pcodedmp/default.nix
new file mode 100644
index 000000000000..84f230f5852f
--- /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;
+    sha256 = "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..704e979c2caa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pcpp/default.nix
@@ -0,0 +1,24 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, lib
+}:
+
+buildPythonPackage rec {
+  pname = "pcpp";
+  version = "1.21";
+
+  src = fetchFromGitHub {
+    owner = "ned14";
+    repo = "pcpp";
+    rev = "v${version}";
+    sha256 = "0k52qyxzdngdhyn4sya2qn1w1a4ll0mcla4h4gb1v91fk4lw25dm";
+    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/pdf2image/default.nix b/nixpkgs/pkgs/development/python-modules/pdf2image/default.nix
new file mode 100644
index 000000000000..f2ed6e7a297c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pdf2image/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchPypi, pillow, poppler_utils }:
+
+buildPythonPackage rec {
+  pname = "pdf2image";
+  version = "1.16.0";
+
+  propagatedBuildInputs = [ pillow ];
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d58ed94d978a70c73c2bb7fdf8acbaf2a7089c29ff8141be5f45433c0c4293bb";
+  };
+
+  postPatch = ''
+    # Only replace first match in file
+    sed -i '0,/poppler_path=None/s||poppler_path="${poppler_utils}/bin"|' pdf2image/pdf2image.py
+  '';
+
+  meta = with lib; {
+    description = "A python module that wraps the pdftoppm utility to convert PDF to PIL Image object";
+    homepage = "https://github.com/Belval/pdf2image";
+    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..3911794b89cb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pdfminer-six/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, isPy3k
+, cryptography
+, charset-normalizer
+, pytestCheckHook
+, ocrmypdf
+}:
+
+buildPythonPackage rec {
+  pname = "pdfminer-six";
+  version = "20220524";
+
+  disabled = !isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "pdfminer";
+    repo = "pdfminer.six";
+    rev = version;
+    sha256 = "sha256-XO9sdHeS/8MgVW0mxbTe2AY5BDfnBSDNzZwLsSKmQh0=";
+  };
+
+  propagatedBuildInputs = [ charset-normalizer cryptography ];
+
+  postInstall = ''
+    for file in $out/bin/*.py; do
+      ln $file ''${file//.py/}
+    done
+  '';
+
+  postPatch = ''
+    # Verion 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" ];
+
+  checkInputs = [ 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/pdfposter/default.nix b/nixpkgs/pkgs/development/python-modules/pdfposter/default.nix
new file mode 100644
index 000000000000..d1a663dc87d9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pdfposter/default.nix
@@ -0,0 +1,20 @@
+{ lib, buildPythonPackage, fetchPypi, pypdf2 }:
+
+buildPythonPackage rec {
+  pname = "pdftools.pdfposter";
+  version = "0.8";
+
+  propagatedBuildInputs = [ pypdf2 ];
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-SYEn54kpO6KQ8ywpgu0+3uL+Ilr1hsfSornWrs2EBqQ=";
+  };
+
+  meta = with lib; {
+    description = "Split large pages of a PDF into smaller ones for poster printing";
+    homepage = "https://pdfposter.readthedocs.io";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ wamserma ];
+  };
+}
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..aaffa0f93818
--- /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}";
+    sha256 = "sha256-POpP6XwcqwvImrtIiDjpnHoNE0MKapuPjxojo+ocBK0=";
+  };
+
+  postPatch = ''
+    substituteInPlace requirements.txt \
+      --replace "chardet==4.0.0" "chardet" \
+      --replace "pdfminer.six==20201018" "pdfminer.six"
+  '';
+
+  propagatedBuildInputs = [ pdfminer-six chardet ];
+
+  checkInputs = [ 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-pep517/default.nix b/nixpkgs/pkgs/development/python-modules/pdm-pep517/default.nix
new file mode 100644
index 000000000000..9cfe5a5e9244
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pdm-pep517/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, git
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pdm-pep517";
+  version = "1.0.2";
+  format = "pyproject";
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-nVoqpYlvNzN1UJeUXsKnUc0Z7jOZMG4JlRQBSx5JrfE=";
+  };
+
+  preCheck = ''
+    HOME=$TMPDIR
+
+    git config --global user.name nobody
+    git config --global user.email nobody@example.com
+  '';
+
+  checkInputs = [
+    pytestCheckHook
+    git
+  ];
+
+  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/pdoc3/default.nix b/nixpkgs/pkgs/development/python-modules/pdoc3/default.nix
new file mode 100644
index 000000000000..ea0f20f5a4af
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pdoc3/default.nix
@@ -0,0 +1,49 @@
+{ 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;
+    sha256 = "5f22e7bcb969006738e1aa4219c75a32f34c2d62d46dc9d2fb2d3e0b0287e4b7";
+  };
+
+  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";
+      sha256 = "07sbf7bh09vgd5z1lbay604rz7rhg88414whs6iy60wwbvkz5c2v";
+    })
+  ];
+
+  nativeBuildInputs = [
+    setuptools-git
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    Mako
+    markdown
+  ];
+
+  meta = with lib; {
+    broken = (stdenv.isLinux && stdenv.isAarch64) || stdenv.isDarwin;
+    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..63eca0dab825
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pdunehd/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "pdunehd";
+  version = "1.3.2";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "valentinalexeev";
+    repo = "pdunehd";
+    rev = version;
+    sha256 = "06p0k82nf89rsakr8d2hdb19dp1wqp9bsf54lwb0qma47iakljjh";
+  };
+
+  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";
+    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..1662366eb188
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/peaqevcore/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "peaqevcore";
+  version = "5.4.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-WeAYa1Iggog5VX1oiANZCeVpuEF5JdabdUjQ+fkAwxE=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "pytest" ""
+  '';
+
+  # 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";
+    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..c96955d860c7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pebble/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv, buildPythonPackage, isPy27, fetchPypi, pytestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "pebble";
+  version = "4.6.3";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    pname = "Pebble";
+    inherit version;
+    sha256 = "694e1105db888f3576b8f00662f90b057cf3780e6f8b7f57955a568008d0f497";
+  };
+
+  doCheck = !stdenv.isDarwin;
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "API to manage threads and processes within an application";
+    homepage = "https://github.com/noxdafox/pebble";
+    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..c35b53cd25d2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pecan/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, logutils
+, Mako
+, webtest
+, pythonOlder
+, pytestCheckHook
+, genshi
+, gunicorn
+, jinja2
+, six
+, sqlalchemy
+, virtualenv
+}:
+
+buildPythonPackage rec {
+  pname = "pecan";
+  version = "1.4.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-SbJV5wHD8UYWBfWw6PVPDCGSLXhF1BTCTdZAn+aV1VA=";
+  };
+
+  propagatedBuildInputs = [
+    logutils
+    Mako
+    webtest
+    six
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    genshi
+    gunicorn
+    jinja2
+    sqlalchemy
+    virtualenv
+  ];
+
+  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..72450237a542
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/peco/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchPypi
+, pydantic
+, pythonOlder
+}:
+
+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=";
+  };
+
+  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/default.nix b/nixpkgs/pkgs/development/python-modules/peewee/default.nix
new file mode 100644
index 000000000000..86fcd3948a6c
--- /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.15.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "coleifer";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-2rxGOUCITEHuM83qhaKQGK4jSf4r8hcBAGxRImT/rhE=";
+  };
+
+  buildInputs = [
+    sqlite
+    cython
+  ];
+
+  propagatedBuildInputs = [
+    apsw
+  ] ++ lib.optional withPostgres [
+    psycopg2
+  ] ++ lib.optional withMysql [
+    mysql-connector
+  ];
+
+  checkInputs = [
+    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..b1707670e768
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pefile/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, future
+, fetchFromGitHub
+, setuptools-scm
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pefile";
+  version = "2022.5.30";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "erocarrera";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-Cv20hJsErHFSuS5Q1kqLNp4DAsPXv/eFhaU9oYECSeI=";
+  };
+
+  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";
+    license = licenses.mit;
+    maintainers = with maintainers; [ pamplemousse ];
+  };
+}
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..f6268953fde3
--- /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
+  ];
+
+  checkInputs = [
+    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 = "http://getpelican.com/";
+    license = licenses.agpl3;
+    maintainers = with maintainers; [ offline prikhi ];
+  };
+}
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..83187327af17
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pep440/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pep440";
+  version = "0.1.0";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "m1H/yqqDiFrj6tmD9jo8nDakCBZxkBPq/HtSOXMH4ZQ=";
+  };
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  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..ad58cdb72d4d
--- /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.12.0";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "931378d93d11b298cf511dd634cf5ea4cb249a28ef84160b3247ee9afb4e8ab0";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    tomli
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata zipp
+  ];
+
+  checkInputs = [
+    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..248961d7f040
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pep8-naming/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, flake8
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "pep8-naming";
+  version = "0.13.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-Ovd82qnHll98haVs1Xk1RVPJu9P98weKd28S21TdaUQ=";
+  };
+
+  propagatedBuildInputs = [
+    flake8
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+    ${python.interpreter} run_tests.py
+    runHook postCheck
+  '';
+
+  pythonImportsCheck = [
+    "pep8ext_naming"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/PyCQA/pep8-naming";
+    description = "Check PEP-8 naming conventions, plugin for flake8";
+    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..1c8cdf4421bf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/perfplot/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, flit-core
+, dufte
+, matplotlib
+, numpy
+, pipdate
+, tqdm
+, 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}";
+    sha256 = "sha256-bu6eYQukhLE8sLkS3PbqTgXOqJFXJYXTcXAhmjaq48g=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    dufte
+    matplotlib
+    numpy
+    pipdate
+    rich
+    tqdm
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "perfplot" ];
+
+  meta = with lib; {
+    description = "Performance plots for Python code snippets";
+    homepage = "https://github.com/nschloe/perfplot";
+    license = licenses.mit;
+    maintainers = with maintainers; [ costrouc ];
+    broken = true; # missing matplotx dependency
+  };
+}
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..89a293b75f40
--- /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
+  ];
+
+  checkInputs = [
+    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/persim/default.nix b/nixpkgs/pkgs/development/python-modules/persim/default.nix
new file mode 100644
index 000000000000..3b2331871fb8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/persim/default.nix
@@ -0,0 +1,73 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchPypi
+, deprecated
+, hopcroftkarp
+, joblib
+, matplotlib
+, numpy
+, scikit-learn
+, scipy
+, pytestCheckHook
+, pythonAtLeast
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "persim";
+  version = "0.3.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-7w8KJHrc9hBOysFBF9sLJFgXEOqKjZZIFoBTlXALSXU=";
+  };
+
+  propagatedBuildInputs = [
+    deprecated
+    hopcroftkarp
+    joblib
+    matplotlib
+    numpy
+    scikit-learn
+    scipy
+  ];
+
+  checkInputs = [
+    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"
+  ];
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    description = "Distances and representations of persistence diagrams";
+    homepage = "https://persim.scikit-tda.org";
+    license = licenses.mit;
+    maintainers = with maintainers; [ costrouc ];
+  };
+}
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..5b5462cf4757
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/persistent/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, cffi
+, fetchPypi
+, zope_interface
+, sphinx
+, manuel
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "persistent";
+  version = "4.9.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-RwGzHYHBBCJlclrzkEUOnZFq10ucF4twEAU4U1keDGo=";
+  };
+
+  nativeBuildInputs = [
+    sphinx
+    manuel
+  ];
+
+  propagatedBuildInputs = [
+    zope_interface
+    cffi
+  ];
+
+  pythonImportsCheck = [
+    "persistent"
+  ];
+
+  meta = with lib; {
+    description = "Automatic persistence for Python objects";
+    homepage = "https://github.com/zopefoundation/persistent/";
+    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..17d210f4006d
--- /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;
+    sha256 = "sha256-D4QPoiJHvKpRQJTafzsmxgI1lCmrEtLNiL4GtJozYpA=";
+  };
+
+  checkInputs = [
+    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..b80f5058cae8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pescea/default.nix
@@ -0,0 +1,60 @@
+{ stdenv
+, lib
+, async-timeout
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-asyncio
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pescea";
+  version = "1.0.11";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "lazdavila";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-yiBtvD7kCqR/F4yoJa5rIOekYy8+zlJh849Jv+HkA4M=";
+  };
+
+  propagatedBuildInputs = [
+    async-timeout
+  ];
+
+  checkInputs = [
+    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.isLinux && stdenv.isAarch64) || 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..1a1fa63ff486
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pex/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, flit-core
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pex";
+  version = "2.1.103";
+  format = "flit";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-B7zWM2Jrf9bRjrDWMDrP0KT7yzFpLnN7FXlGJtqJa/A=";
+  };
+
+  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";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ copumpkin ];
+  };
+}
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/pg8000/default.nix b/nixpkgs/pkgs/development/python-modules/pg8000/default.nix
new file mode 100644
index 000000000000..4ae1daa17951
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pg8000/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, importlib-metadata
+, passlib
+, pythonOlder
+, scramp
+}:
+
+buildPythonPackage rec {
+  pname = "pg8000";
+  version = "1.29.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-gLT03ksCVIMreUhRHg3UY0LRwERszU/diStj0C5PvHs=";
+  };
+
+  propagatedBuildInputs = [
+    passlib
+    scramp
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  postPatch = ''
+    sed '/^\[metadata\]/a version = ${version}' setup.cfg
+  '';
+
+  # Tests require a running PostgreSQL instance
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pg8000"
+  ];
+
+  meta = with lib; {
+    description = "Python driver for PostgreSQL";
+    homepage = "https://github.com/tlocke/pg8000";
+    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..bb369ffdc9d2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pgcli/default.nix
@@ -0,0 +1,66 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, cli-helpers
+, click
+, configobj
+, prompt-toolkit
+, psycopg2
+, 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 = "3.4.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-8DkwGH4n1g32WMqKBPtgHsXXR2xzXysVQsat7Fysj+I=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "pgspecial>=1.13.1,<2.0.0" "pgspecial>=1.13.1"
+  '';
+
+  propagatedBuildInputs = [
+    cli-helpers
+    click
+    configobj
+    prompt-toolkit
+    psycopg2
+    pygments
+    sqlparse
+    pgspecial
+    setproctitle
+    keyring
+    pendulum
+    sshtunnel
+  ];
+
+  checkInputs = [ 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..012eeb20ebfb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pglast/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, setuptools
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "pglast";
+  version = "3.14";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-geDH0Q5xp3Xz84f3ff4AeDMaDghrO8P504wwwi4jjhA=";
+  };
+
+  propagatedBuildInputs = [
+    setuptools
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "--cov=pglast --cov-report term-missing" ""
+  '';
+
+  checkInputs = [
+    pytest
+  ];
+
+  # pytestCheckHook doesn't work
+  # ImportError: cannot import name 'parse_sql' from 'pglast'
+  checkPhase = ''
+    pytest
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/lelit/pglast";
+    description = "PostgreSQL Languages AST and statements prettifier";
+    changelog = "https://github.com/lelit/pglast/raw/v${version}/CHANGES.rst";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ marsam ];
+  };
+}
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..a53711a4de62
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pgpy/default.nix
@@ -0,0 +1,44 @@
+{ lib, pythonOlder, fetchFromGitHub, buildPythonPackage
+, six, enum34, pyasn1, cryptography
+, pytestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "pgpy";
+  version = "0.5.4";
+
+  src = fetchFromGitHub {
+    owner = "SecurityInnovation";
+    repo = "PGPy";
+    rev = "v${version}";
+    sha256 = "03pch39y3hi4ici6y6lvz0j0zram8dw2wvnmq1zyjy3vyvm1ms4a";
+  };
+
+  propagatedBuildInputs = [
+    six
+    pyasn1
+    cryptography
+  ] ++ lib.optionals (pythonOlder "3.4") [
+    enum34
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # assertions contains extra: IDEA has been deprecated
+    "test_encrypt_bad_cipher"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/SecurityInnovation/PGPy";
+    description = "Pretty Good Privacy for Python 2 and 3";
+    longDescription = ''
+      PGPy is a Python (2 and 3) 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..26e5eb2bd6ac
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pgsanity/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, python
+, fetchPypi
+, buildPythonPackage
+, postgresql }:
+
+buildPythonPackage rec {
+  pname = "pgsanity";
+  version = "0.2.9";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "de0bbd6fe4f98bf5139cb5f466eac2e2abaf5a7b050b9e4867b87bf360873173";
+  };
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest discover -s test
+  '';
+
+  checkInputs = [ 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..b2f28a189e12
--- /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.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-ZEQ7vJrQm1fQ9Ny7OO/0TVKFO3QYyepS9YV6vhu1NOw=";
+  };
+
+  propagatedBuildInputs = [
+    click
+    sqlparse
+    psycopg
+  ];
+
+  checkInputs = [
+    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/phe/default.nix b/nixpkgs/pkgs/development/python-modules/phe/default.nix
new file mode 100644
index 000000000000..0e589a04dbf9
--- /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;
+    sha256 = "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..a6dc63b8e3fe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/phik/default.nix
@@ -0,0 +1,79 @@
+{ lib
+, buildPythonPackage
+, cmake
+, fetchFromGitHub
+, isPy3k
+, pytestCheckHook
+, nbconvert
+, joblib
+, jupyter
+, jupyter-client
+, numpy
+, scipy
+, pandas
+, matplotlib
+, ninja
+, numba
+, pybind11
+, scikit-build
+}:
+
+buildPythonPackage rec {
+  pname = "phik";
+  version = "0.12.2";
+  disabled = !isPy3k;
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "KaveIO";
+    repo = "PhiK";
+    rev = "v${version}";
+    hash = "sha256-nr3804MLIBPFw/PlJ9B8xKFFGI5LDp8m2gLtJB7YcEE=";
+  };
+
+  checkInputs = [
+    pytestCheckHook
+    nbconvert
+    jupyter
+    jupyter-client
+  ];
+
+  propagatedBuildInputs = [
+    joblib
+    numpy
+    scipy
+    pandas
+    matplotlib
+    numba
+    pybind11
+  ];
+
+  # uses setuptools to drive build process
+  dontUseCmakeConfigure = true;
+
+  nativeBuildInputs = [
+    cmake
+    ninja
+    scikit-build
+  ];
+
+  pythonImportsCheck = [ "phik" ];
+
+  postInstall = ''
+    rm -r $out/bin
+  '';
+
+  preCheck = ''
+    # import from $out
+    rm -r phik
+  '';
+
+  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/en/latest/";
+    changelog = "https://github.com/KaveIO/PhiK/blob/${src.rev}/CHANGES.rst";
+    maintainers = with maintainers; [ melsigl ];
+    license = licenses.asl20;
+  };
+}
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..969978b4884e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/phone-modem/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, aioserial
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "phone-modem";
+  version = "0.1.1";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    pname = "phone_modem";
+    inherit version;
+    sha256 = "0kqa1ky5hjs9zdp3dnd8s9mz5p6z0al3hxxlgqdq9vnnpnv0lafy";
+  };
+
+  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..550a4fefd25a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/phonemizer/default.nix
@@ -0,0 +1,74 @@
+{ lib
+, stdenv
+, substituteAll
+, buildPythonApplication
+, fetchPypi
+, joblib
+, segments
+, attrs
+, dlinfo
+, typing-extensions
+, espeak-ng
+, pytestCheckHook
+, pytest-cov
+}:
+
+buildPythonApplication rec {
+  pname = "phonemizer";
+  version = "3.2.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-Bo+F+FqKmtxjijeHrqyvcaU+R1eLEtdzwJdDNQDNiSs=";
+  };
+
+  postPatch = ''
+    sed -i -e '/\'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
+    })
+    ./remove-intertwined-festival-test.patch
+  ];
+
+  propagatedBuildInputs = [
+    joblib
+    segments
+    attrs
+    dlinfo
+    typing-extensions
+  ];
+
+  preCheck = ''
+    export HOME=$TMPDIR
+  '';
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  # We tried to package festvial, but were unable to get the backend running,
+  # so let's disable related tests.
+  disabledTestPaths = [
+    "test/test_festival.py"
+  ];
+
+  disabledTests = [
+    "test_festival"
+    "test_festival_path"
+    "test_readme_festival_syll"
+    "test_unicode"
+  ];
+
+  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/phonemizer/remove-intertwined-festival-test.patch b/nixpkgs/pkgs/development/python-modules/phonemizer/remove-intertwined-festival-test.patch
new file mode 100644
index 000000000000..a0e0817bb72a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/phonemizer/remove-intertwined-festival-test.patch
@@ -0,0 +1,103 @@
+diff --git a/test/test_main.py b/test/test_main.py
+index b8c53e9..8f8c6d2 100644
+--- a/test/test_main.py
++++ b/test/test_main.py
+@@ -68,16 +68,11 @@ def test_readme():
+     _test('hello world', 'həloʊ wɜːld ', '--verbose')
+     _test('hello world', 'həloʊ wɜːld ', '--quiet')
+     _test('hello world', 'hello world | həloʊ wɜːld ', '--prepend-text')
+-    _test('hello world', 'hhaxlow werld', '-b festival --strip')
+     _test('bonjour le monde', 'bɔ̃ʒuʁ lə mɔ̃d ', '-l fr-fr')
+     _test('bonjour le monde', 'b ɔ̃ ʒ u ʁ ;eword l ə ;eword m ɔ̃ d ;eword ',
+           '-l fr-fr -p " " -w ";eword "')
+ 
+ 
+-@pytest.mark.skipif(
+-    '2.1' in backend.FestivalBackend.version(),
+-    reason='festival-2.1 gives different results than further versions '
+-    'for syllable boundaries')
+ def test_readme_festival_syll():
+     _test('hello world',
+           'hh ax ;esyll l ow ;esyll ;eword w er l d ;esyll ;eword ',
+diff --git a/test/test_phonemize.py b/test/test_phonemize.py
+index d156c9e..2bbe371 100644
+--- a/test/test_phonemize.py
++++ b/test/test_phonemize.py
+@@ -213,18 +213,6 @@ def test_segments(njobs):
+         ('segments', True, True, False,
+             ['achi acho?', '', 'achi acho'],
+             [u'ʌtʃɪ ʌtʃʊ?', '', u'ʌtʃɪ ʌtʃʊ ']),
+-        ('festival', False, False, False,
+-            ['hello world!', '', 'goodbye'],
+-            ['hhaxlow werld ', 'guhdbay ']),
+-        ('festival', False, True, False,
+-            ['hello world!', '', 'goodbye'],
+-            ['hhaxlow werld!', 'guhdbay ']),
+-        ('festival', True, False, False,
+-            ['hello world!', '', 'goodbye'],
+-            ['hhaxlow werld ', '', 'guhdbay ']),
+-        ('festival', True, True, False,
+-            ['hello world!', '', 'goodbye'],
+-            ['hhaxlow werld!', '', 'guhdbay ']),
+         ('espeak', False, False, True,
+             ['hello world!', '', 'goodbye'],
+             [('hello world!', 'həloʊ wɜːld '), ('goodbye', 'ɡʊdbaɪ ')]),
+@@ -248,19 +236,7 @@ def test_segments(njobs):
+             [('achi acho?', u'ʌtʃɪ ʌtʃʊ '), ('', ''), ('achi acho', u'ʌtʃɪ ʌtʃʊ ')]),
+         ('segments', True, True, True,
+             ['achi acho?', '', 'achi acho'],
+-            [('achi acho?', u'ʌtʃɪ ʌtʃʊ?'), ('', ''), ('achi acho', u'ʌtʃɪ ʌtʃʊ ')]),
+-        ('festival', False, False, True,
+-            ['hello world!', '', 'goodbye'],
+-            [('hello world!', 'hhaxlow werld '), ('goodbye', 'guhdbay ')]),
+-        ('festival', False, True, True,
+-            ['hello world!', '', 'goodbye'],
+-            [('hello world!', 'hhaxlow werld!'), ('goodbye', 'guhdbay ')]),
+-        ('festival', True, False, True,
+-            ['hello world!', '', 'goodbye'],
+-            [('hello world!', 'hhaxlow werld '), ('', ''), ('goodbye', 'guhdbay ')]),
+-        ('festival', True, True, True,
+-            ['hello world!', '', 'goodbye'],
+-            [('hello world!', 'hhaxlow werld!'), ('', ''), ('goodbye', 'guhdbay ')])])
++            [('achi acho?', u'ʌtʃɪ ʌtʃʊ?'), ('', ''), ('achi acho', u'ʌtʃɪ ʌtʃʊ ')])])
+ def test_preserve_empty_lines(backend, empty_lines, punctuation, prepend_text, text, expected):
+     language = 'cree' if backend == 'segments' else 'en-us'
+ 
+@@ -278,11 +254,7 @@ def test_preserve_empty_lines(backend, empty_lines, punctuation, prepend_text, t
+         ('segments', False, False, [''], []),
+         ('segments', False, True, [''], []),
+         ('segments', True, False, [''], ['']),
+-        ('segments', True, True, [''], ['']),
+-        ('festival', False, False, [''], []),
+-        ('festival', False, True, [''], []),
+-        ('festival', True, False, [''], ['']),
+-        ('festival', True, True, [''], [''])])
++        ('segments', True, True, [''], [''])])
+ def test_empty_input(backend, empty_lines, punctuation, text, expected):
+     language = 'cree' if backend == 'segments' else 'en-us'
+ 
+diff --git a/test/test_punctuation.py b/test/test_punctuation.py
+index b2206ac..62e31c1 100644
+--- a/test/test_punctuation.py
++++ b/test/test_punctuation.py
+@@ -28,9 +28,6 @@ ESPEAK_150 = (EspeakBackend.version() >= (1, 50))
+ # True if we are using espeak>=1.49.3
+ ESPEAK_143 = (EspeakBackend.version() >= (1, 49, 3))
+ 
+-# True if we are using festival>=2.5
+-FESTIVAL_25 = (FestivalBackend.version() >= (2, 5))
+-
+ 
+ @pytest.mark.parametrize(
+     'inp, out', [
+@@ -179,9 +176,7 @@ def test_issue_54(text):
+         ('espeak', 'default', ['! ?', 'hey!'], ['! ?', 'heɪ!']),
+         ('espeak', '!', ['! ?', 'hey!'], ['! ', 'heɪ!']),
+         ('segments', 'default', ['! ?', 'hey!'], ['! ?', 'heːj!']),
+-        ('segments', '!', ['! ?', 'hey!'], ValueError),
+-        ('festival', 'default', ['! ?', 'hey!'], ['! ?', 'hhey!']),
+-        ('festival', '!', ['! ?', 'hey!'], ['! ', 'hhey!'])])
++        ('segments', '!', ['! ?', 'hey!'], ValueError)])
+ def test_issue55(backend, marks, text, expected):
+     if marks == 'default':
+         marks = Punctuation.default_marks()
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..f0538c25d376
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/phonenumbers/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "phonenumbers";
+  version = "8.12.51";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-nUqUYBJ//SiK4HHdH3lC4jKdpbXF1X2Kq+cQNCfKfL8=";
+  };
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "tests/*.py"
+  ];
+
+  pythonImportsCheck = [
+    "phonenumbers"
+  ];
+
+  meta = with lib; {
+    description = "Python module for handling international phone numbers";
+    homepage = "https://github.com/daviddrysdale/python-phonenumbers";
+    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..06399b0b6616
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/phonopy/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, numpy
+, pyyaml
+, matplotlib
+, h5py
+, scipy
+, spglib
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "phonopy";
+  version = "2.15.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-iXvAXFtN1wKfasJAGt4FC04Q9Ntr4U2euA61YIdwLz0=";
+  };
+
+  propagatedBuildInputs = [
+    h5py
+    matplotlib
+    numpy
+    pyyaml
+    scipy
+    spglib
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  # prevent pytest from importing local directory
+  preCheck = ''
+    rm -r phonopy
+  '';
+
+  meta = with lib; {
+    description = "A package for phonon calculations at harmonic and quasi-harmonic levels";
+    homepage = "https://atztogo.github.io/phonopy/";
+    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..0cb94be921db
--- /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 = "3.0.5";
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "todofixthis";
+    repo = pname;
+    rev = version;
+    sha256 = "0gpvq4a6qrr2iki6b4vxarjr1jrsw560m2qzm5bb43ix8c8b7y3q";
+  };
+
+  checkInputs = [
+    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 SuperSandro2000 ];
+  };
+}
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..993c715999b2
--- /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.2.0";
+
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "ushiboy";
+    repo = "pi1wire";
+    rev = "v${version}";
+    hash = "sha256-70w71heHWR5yArl+HuNAlzL2Yq/CL0iMNMiQw5qovls=";
+  };
+
+  checkInputs = [
+    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/piccata/default.nix b/nixpkgs/pkgs/development/python-modules/piccata/default.nix
new file mode 100644
index 000000000000..d041ecc3ec70
--- /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.0";
+
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "NordicSemiconductor";
+    repo = pname;
+    rev = version;
+    sha256 = "0pn842jcf2czjks5dphivgp1s7wiifqiv93s0a89h0wxafd6pbsr";
+  };
+
+  checkInputs = [
+    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/pick/default.nix b/nixpkgs/pkgs/development/python-modules/pick/default.nix
new file mode 100644
index 000000000000..c173e1480459
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pick/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pick";
+  version = "1.4.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "wong2";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-y4wlYYDyhwnRjz9ItiDi2iCa/0F2RTB6Rstl8lmQ/3w=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pick"
+  ];
+
+  meta = with lib; {
+    description = "Module to create curses-based interactive selection list in the terminal";
+    homepage = "https://github.com/wong2/pick";
+    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/picos/default.nix b/nixpkgs/pkgs/development/python-modules/picos/default.nix
new file mode 100644
index 000000000000..a6f1aa1a141d
--- /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
+  checkInputs = [
+    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/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..c99f408db62f
--- /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.9.2";
+  pname = "piep";
+  disabled = isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0b5anpsq16xkiisws95jif5s5mplkl1kdnhy0w0i6m0zcy50jnxq";
+  };
+
+  propagatedBuildInputs = [ pygments ];
+  checkInputs = [ 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..440df36384c9
--- /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
+  checkInputs = [ 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..a9791de65195
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pika/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, gevent
+, nose2
+, mock
+, twisted
+, tornado
+}:
+
+buildPythonPackage rec {
+  pname = "pika";
+  version = "1.3.0";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "pika";
+    repo = "pika";
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-iWGqnDj8qhXUOTw8UNC7VHVBNyvMr4Kdk6NubX92KRI=";
+  };
+
+  propagatedBuildInputs = [ gevent tornado twisted ];
+
+  checkInputs = [ 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; {
+    description = "Pure-Python implementation of the AMQP 0-9-1 protocol";
+    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..886b1ffb82ae
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pikepdf/default.nix
@@ -0,0 +1,99 @@
+{ lib
+, attrs
+, buildPythonPackage
+, fetchFromGitHub
+, hypothesis
+, pythonOlder
+, importlib-metadata
+, jbig2dec
+, deprecation
+, lxml
+, mupdf
+, packaging
+, pillow
+, psutil
+, pybind11
+, pytest-xdist
+, pytestCheckHook
+, python-dateutil
+, python-xmp-toolkit
+, qpdf
+, setuptools-scm
+, substituteAll
+}:
+
+buildPythonPackage rec {
+  pname = "pikepdf";
+  version = "5.4.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  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-b4QUn+wfkk6Yx74ViBg6yaE1+bXtxidoyXYgBaJ9iiM=";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./paths.patch;
+      jbig2dec = "${lib.getBin jbig2dec}/bin/jbig2dec";
+      mudraw = "${lib.getBin mupdf}/bin/mudraw";
+    })
+  ];
+
+  postPatch = ''
+    sed -i 's|\S*/opt/homebrew.*|pass|' setup.py
+
+    substituteInPlace setup.py \
+      --replace setuptools_scm_git_archive ""
+  '';
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  buildInputs = [
+    pybind11
+    qpdf
+  ];
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  checkInputs = [
+    attrs
+    hypothesis
+    pytest-xdist
+    psutil
+    pytestCheckHook
+    python-dateutil
+    python-xmp-toolkit
+  ];
+
+  propagatedBuildInputs = [
+    deprecation
+    lxml
+    packaging
+    pillow
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  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..5f21da38fae3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pikepdf/paths.patch
@@ -0,0 +1,44 @@
+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 be390a1..3818ec3 100644
+--- a/src/pikepdf/jbig2.py
++++ b/src/pikepdf/jbig2.py
+@@ -31,7 +31,7 @@ def extract_jbig2(
+         output_path = Path(tmpdir) / "outfile"
+ 
+         args = [
+-            "jbig2dec",
++            "@jbig2dec@",
+             "--embedded",
+             "--format",
+             "png",
+@@ -64,7 +64,7 @@ def _extract_jbig2_bytes(jbig2: bytes, jbig2_globals: bytes) -> bytes:
+         output_path = Path(tmpdir) / "outfile"
+ 
+         args = [
+-            "jbig2dec",
++            "@jbig2dec@",
+             "--embedded",
+             "--format",
+             "png",
+@@ -100,7 +100,7 @@ def extract_jbig2_bytes(
+ 
+ def _check_jbig2dec_available() -> None:  # pragma: no cover
+     try:
+-        proc = run(['jbig2dec', '--version'], stdout=PIPE, check=True, encoding='ascii')
++        proc = run(['@jbig2dec@', '--version'], stdout=PIPE, check=True, encoding='ascii')
+     except (CalledProcessError, FileNotFoundError) as e:
+         raise DependencyError("jbig2dec - not installed or not found") from e
+     else:
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..49a070006671
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pilkit/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, mock
+, pillow
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pilkit";
+  version = "unstable-2022-02-17";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "matthewwithanm";
+    repo = pname;
+    rev = "09ffa2ad33318ae5fd3464655c14c7f01ffc2097";
+    hash = "sha256-jtnFffKr0yhSv2jBmXzPa6iP2r41MbmGukfmnvgABhk=";
+  };
+
+  buildInputs = [
+    pillow
+  ];
+
+  checkInputs = [
+    mock
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace tox.ini \
+      --replace " --cov --cov-report term-missing:skip-covered" ""
+  '';
+
+  pythonImportsCheck = [
+    "pilkit"
+  ];
+
+  meta = with lib; {
+    description = "A collection of utilities and processors for the Python Imaging Libary";
+    homepage = "https://github.com/matthewwithanm/pilkit/";
+    license = licenses.bsd0;
+    maintainers = with maintainers; [ domenkozar ];
+  };
+}
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..e856c2f57852
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pillow-simd/default.nix
@@ -0,0 +1,35 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub, isPyPy, isPy3k
+, olefile, freetype, libjpeg, zlib, libtiff, libwebp, tcl, lcms2
+, libxcb, tk, libX11, openjpeg, libimagequant, pyroma, numpy, defusedxml
+, pytestCheckHook
+}@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";
+  disabled = !isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "uploadcare";
+    repo = "pillow-simd";
+    rev = "v${version}";
+    sha256 = "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 = "http://www.pythonware.com/products/pil/license.htm";
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+} // 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..017069a7dd2d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pillow/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, isPyPy
+, defusedxml, olefile, freetype, libjpeg, zlib, libtiff, libwebp, tcl, lcms2, tk, libX11
+, libxcb, openjpeg, libimagequant, pyroma, numpy, pytestCheckHook
+# for passthru.tests
+, imageio, matplotlib, pilkit, pydicom, reportlab
+}@args:
+
+import ./generic.nix (rec {
+  pname = "pillow";
+  version = "9.2.0";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "Pillow";
+    inherit version;
+    sha256 = "sha256-deY2/T4PuHJpPyPMuKX/LNV4gBJR86T2hUxqXUN9PAQ=";
+  };
+
+  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 SuperSandro2000 ];
+  };
+} // 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..ec4f05263820
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pillow/generic.nix
@@ -0,0 +1,79 @@
+{ pname
+, version
+, disabled
+, src
+, patches ? []
+, meta
+, passthru ? {}
+, ...
+}@args:
+
+with args;
+
+buildPythonPackage rec {
+  inherit pname version 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
+  '';
+
+  # Disable darwin tests which require executables: `iconutil` and `screencapture`
+  disabledTests = lib.optionals stdenv.isDarwin [
+    "test_grab"
+    "test_grabclipboard"
+    "test_save"
+
+    # pillow-simd
+    "test_roundtrip"
+    "test_basic"
+  ] ++ lib.optionals (lib.versions.major version == "6") [
+    # RuntimeError: Error setting from dictionary
+    "test_custom_metadata"
+  ];
+
+  propagatedBuildInputs = [ olefile ]
+    ++ lib.optionals (lib.versionAtLeast version "8.2.0") [ defusedxml ];
+
+  checkInputs = [ pytestCheckHook pyroma numpy ];
+
+  buildInputs = [ freetype libjpeg openjpeg libimagequant zlib libtiff libwebp 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..879e25f77418
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pims/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, imageio
+, numpy
+, pytestCheckHook
+, pythonOlder
+, scikitimage
+, 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
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    scikitimage
+  ];
+
+  pythonImportsCheck = [
+    "pims"
+  ];
+
+  pytestFlagsArray = [
+    "-W"
+    "ignore::DeprecationWarning"
+  ];
+
+  disabledTests = [
+    # NotImplementedError: Do not know how to deal with infinite readers
+    "TestVideo_ImageIO"
+  ];
+
+  meta = with lib; {
+    description = "Python Image Sequence: Load video and sequential images in many formats with a simple, consistent interface";
+    homepage = "https://github.com/soft-matter/pims";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ costrouc ];
+  };
+}
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/pint-pandas/default.nix b/nixpkgs/pkgs/development/python-modules/pint-pandas/default.nix
new file mode 100644
index 000000000000..fafe0b11173e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pint-pandas/default.nix
@@ -0,0 +1,50 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, setuptools-scm
+, pint
+, pandas
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pint-pandas";
+  version = "0.2";
+
+  src = fetchPypi {
+    pname = "Pint-Pandas";
+    inherit version;
+    sha256 = "sha256-b2DS6ArBAuD5St25IG4PbMpe5C8Lf4kw2MeYAC5B+oc=";
+  };
+
+  patches = [
+    # Fixes a failing test, see: https://github.com/hgrecco/pint-pandas/issues/107
+    (fetchpatch{
+      url = "https://github.com/hgrecco/pint-pandas/commit/4c31e25609af968665ee60d019b9b5366f328680.patch";
+      sha256 = "vIT0LI4S73D4MBfGI8vtCZAM+Zb4PZ4E3xfpGKNyA4I=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    pint
+    pandas
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    broken = (stdenv.isLinux && stdenv.isAarch64) || 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..b4e68c190946
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pint/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, setuptools-scm
+, importlib-metadata
+, packaging
+# Check Inputs
+, pytestCheckHook
+, pytest-subtests
+, numpy
+, matplotlib
+, uncertainties
+}:
+
+buildPythonPackage rec {
+  pname = "pint";
+  version = "0.19.2";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "Pint";
+    sha256 = "sha256-4dSYn/UQs3ja1k+RcR572r5cp411sGoYVprEVGeMS68=";
+  };
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  propagatedBuildInputs = [ packaging ]
+    ++ lib.optionals (pythonOlder "3.8") [ importlib-metadata ];
+
+  checkInputs = [
+    pytestCheckHook
+    pytest-subtests
+    numpy
+    matplotlib
+    uncertainties
+  ];
+
+  dontUseSetuptoolsCheck = true;
+
+  preCheck = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  meta = with lib; {
+    description = "Physical quantities module";
+    license = licenses.bsd3;
+    homepage = "https://github.com/hgrecco/pint/";
+    maintainers = with maintainers; [ costrouc 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..fe7cc3ef7163
--- /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
+  ];
+
+  checkInputs = [
+    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..0693fbf4fde8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pip-requirements-parser/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, packaging
+, pytestCheckHook
+, pythonOlder
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "pip-requirements-parser";
+  version = "31.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "nexB";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-i4hw3tS4i2ek2JzcDiGo5aFFJ9J2JJ9MB5vxDhOilb0=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  dontConfigure = true;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    packaging
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pip_requirements_parser"
+  ];
+
+  meta = with lib; {
+    description = "Module to parse pip requirements";
+    homepage = "https://github.com/nexB/pip-requirements-parser";
+    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..84521397a707
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pip-tools/default.nix
@@ -0,0 +1,71 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, build
+, click
+, fetchPypi
+, pep517
+, pip
+, pytest-xdist
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, setuptools-scm
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "pip-tools";
+  version = "6.8.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Oeiu5GVEbgInjYDb69QyXR3YYzJI9DITxzol9Y59ilU=";
+  };
+
+  patches = [ ./fix-setup-py-bad-syntax-detection.patch ];
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    build
+    click
+    pep517
+    pip
+    setuptools
+    wheel
+  ];
+
+  checkInputs = [
+    pytest-xdist
+    pytestCheckHook
+  ];
+
+  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"
+  ];
+
+  pythonImportsCheck = [
+    "piptools"
+  ];
+
+  meta = with lib; {
+    description = "Keeps your pinned dependencies fresh";
+    homepage = "https://github.com/jazzband/pip-tools/";
+    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..9956b6038d14
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pip/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, bootstrapped-pip
+, fetchFromGitHub
+, mock
+, scripttest
+, virtualenv
+, pretend
+, pytest
+
+# coupled downsteam dependencies
+, pip-tools
+}:
+
+buildPythonPackage rec {
+  pname = "pip";
+  version = "22.1.2";
+  format = "other";
+
+  src = fetchFromGitHub {
+    owner = "pypa";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-Id/oz0e59WWpafR1cIYIogvOgxKGKVqrwNON32BU9zU=";
+    name = "${pname}-${version}-source";
+  };
+
+  nativeBuildInputs = [ bootstrapped-pip ];
+
+  # pip detects that we already have bootstrapped_pip "installed", so we need
+  # to force it a little.
+  pipInstallFlags = [ "--ignore-installed" ];
+
+  checkInputs = [ mock scripttest virtualenv pretend pytest ];
+  # Pip wants pytest, but tests are not distributed
+  doCheck = false;
+
+  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/";
+    priority = 10;
+  };
+}
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..4d241e87e1c0
--- /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; [ costrouc ];
+  };
+}
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..b6dbfe53d8d9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pipdeptree/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, tox
+, pip
+}:
+
+buildPythonPackage rec {
+  pname = "pipdeptree";
+  version = "2.2.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.4";
+
+  src = fetchFromGitHub {
+    owner = "naiquevin";
+    repo = "pipdeptree";
+    rev = "${version}";
+    sha256 = "sha256-CL0li/79qptOtOGLwder5s0+6zv7+PUnl+bD6p+XBtA=";
+  };
+
+  propagatedBuildInputs = [
+    pip
+  ];
+
+  checkInputs = [
+    tox
+  ];
+
+  pythonImportsCheck = [
+    "pipdeptree"
+  ];
+
+  meta = with lib; {
+    description = "Command line utility to show dependency tree of packages";
+    homepage = "https://github.com/naiquevin/pipdeptree";
+    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..6f359d3bc9a7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pipenv-poetry-migrate/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, poetry
+, rich
+, setuptools
+}:
+
+buildPythonPackage rec {
+  version = "0.2.0";
+  pname = "pipenv-poetry-migrate";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "yhino";
+    repo = "pipenv-poetry-migrate";
+    rev = "v${version}";
+    hash = "sha256-2/e6uGwpUvzxXlz+51gUriE054bgNeJNyLDCIyiGflM=";
+  };
+
+  propagatedBuildInputs = [
+    poetry
+    rich
+    setuptools
+  ];
+
+  postPatch = ''
+  substituteInPlace pyproject.toml --replace 'rich = "^9.6.1"' 'rich = ">9"'
+  '';
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "This is simple migration script, migrate pipenv to poetry";
+    homepage = "https://github.com/yhino/pipenv-poetry-migrate";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ gador ];
+  };
+}
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..955b2d8a7d65
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pipx/default.nix
@@ -0,0 +1,83 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, hatchling
+, userpath
+, argcomplete
+, packaging
+, importlib-metadata
+, pip
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pipx";
+  version = "1.1.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  # no tests in the pypi tarball, so we directly fetch from github
+  src = fetchFromGitHub {
+    owner = "pipxproject";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-6cKKVOgHIoKNfGqvDWK5cwBGBDkgfyRuBRDV6fruBoA=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    userpath
+    argcomplete
+    packaging
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  checkInputs = [
+    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";
+    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..44d6094f461a
--- /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.7";
+
+  src = fetchFromGitHub {
+    owner = "coin3d";
+    repo = "pivy";
+    rev = "refs/tags/${version}";
+    hash = "sha256-mU3QRDJd56gGDWqwcxAN3yUCkAkABP/I9gIBMH2MOXA=";
+  };
+
+  dontUseCmakeConfigure = true;
+
+  nativeBuildInputs = with pkgs; [
+    swig qmake cmake
+  ];
+
+  buildInputs = with pkgs; with xorg; [
+    coin3d soqt qtbase
+    libGLU libGL
+    libXi libXext libSM libICE libX11
+  ];
+
+  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..026685cd6341
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pixcat/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, blessed
+, docopt
+, pillow
+, requests
+, dataclasses
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pixcat";
+  version = "0.1.4";
+
+  disabled = pythonOlder "3.6";
+
+  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/pixelmatch/default.nix b/nixpkgs/pkgs/development/python-modules/pixelmatch/default.nix
new file mode 100644
index 000000000000..e09f0b32ff20
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pixelmatch/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchgit
+, pillow
+, poetry-core
+, pytest-benchmark
+, pytest-mypy
+, 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
+  ];
+
+  checkInputs = [
+    pillow
+    pytest-benchmark
+    pytest-mypy
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    # Incompatible types in assignment
+    #"--mypy"
+    "--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..5dc77a2661ba
--- /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;
+    sha256 = "sha256-dOHCu0pDXk9LM4Yobaz8GAfVpBd8rXlty+Wfhx+WPME=";
+  };
+
+  checkInputs = [ 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/pkgconfig/default.nix b/nixpkgs/pkgs/development/python-modules/pkgconfig/default.nix
new file mode 100644
index 000000000000..6721390d7abb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pkgconfig/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, 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}";
+    sha256 = "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 ];
+
+  checkInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "pkgconfig" ];
+
+  meta = with lib; {
+    description = "Interface Python with pkg-config";
+    homepage = "https://github.com/matze/pkgconfig";
+    license = licenses.mit;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..b3f4f1d450bf
--- /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.8.3";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-qE2kMY3Yb4cKlEeoyYNAqgYha/xvK3vcS4dmmErhhnw=";
+  };
+
+  checkInputs = [
+    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..25b9b053748a
--- /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=";
+  };
+
+  checkInputs = [
+    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/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..c4baa649cf94
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pkutils/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, nose
+, pythonOlder
+, semver
+}:
+
+buildPythonPackage rec {
+  pname = "pkutils";
+  version = "3.0.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "reubano";
+    repo = "pkutils";
+    rev = "v${version}";
+    hash = "sha256-AK+xX+LPz6IVLZedsqMUm7G28ue0s3pXgIzxS4EHHLE=";
+  };
+
+  propagatedBuildInputs = [
+    semver
+  ];
+
+  checkInputs = [
+    nose
+  ];
+
+  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..4c353ab7a4e7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/plac/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "plac";
+  version = "1.3.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-OL3YZNBFD7dIGTqoF7nEWKj1MZ+/l7ImEVHPwKWBIJA=";
+  };
+
+  checkPhase = ''
+    cd doc
+    ${python.interpreter} -m unittest discover -p "*test_plac*"
+  '';
+
+  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..0f450360301f
--- /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 = "9.9.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-uvozG1l+aGDs4nzOOjKUPScLLMNVop5u2Y89se8GvtY=";
+  };
+
+  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..b33f43ef9357
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/plantuml-markdown/default.nix
@@ -0,0 +1,65 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, lib
+, plantuml
+, markdown
+, requests
+, six
+, runCommand
+, writeText
+, plantuml-markdown
+}:
+let
+  pname = "plantuml-markdown";
+  version = "3.6.2";
+in
+buildPythonPackage {
+  inherit pname version;
+
+  src = fetchFromGitHub {
+    owner = "mikitex70";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-IADKU4EQHLLH5uD5iBAUiumFp5nyTNGt1LWoWdfbvJM=";
+  };
+
+  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";
+    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..f887453bd681
--- /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";
+    sha256 = "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..84a85de82057
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/plaster-pastedeploy/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, plaster
+, pastedeploy
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "plaster-pastedeploy";
+  version = "0.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c231130cb86ae414084008fe1d1797db7e61dc5eaafb5e755de21387c27c6fae";
+  };
+
+  patches = [
+    # Fix tests compatibility with pastedeploy 2+
+    # https://github.com/Pylons/plaster_pastedeploy/pull/17
+    (fetchpatch {
+      url = "https://github.com/Pylons/plaster_pastedeploy/commit/d77d81a57e917c67a20332beca8f418651172905.patch";
+      sha256 = "0n5vnqn8kad41kn9grcwiic6c6rhvy1ji3w81s2v9xyk0bd9yryf";
+    })
+  ];
+
+  propagatedBuildInputs = [ plaster pastedeploy ];
+
+  checkInputs = [ 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..749ffdb7f321
--- /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.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "8351c7c7efdf33084c1de88dd0f422cbe7342534537b553c49b857b12d98c8c3";
+  };
+
+  checkPhase = ''
+    py.test
+  '';
+
+  checkInputs = [ 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..e04b40bc1e44
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/platformdirs/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, appdirs
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+, hatchling
+, hatch-vcs
+}:
+
+buildPythonPackage rec {
+  pname = "platformdirs";
+  version = "2.5.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-c7gGgqOUVYA6wYU4+nQsYYw4Gn+DpMoIq2nP8nEdPcg=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    hatchling
+    hatch-vcs
+  ];
+
+  checkInputs = [
+    appdirs
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "platformdirs"
+  ];
+
+  meta = with lib; {
+    description = "Python module for determining appropriate platform-specific directories";
+    homepage = "https://platformdirs.readthedocs.io/";
+    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/pleroma-bot/default.nix b/nixpkgs/pkgs/development/python-modules/pleroma-bot/default.nix
new file mode 100644
index 000000000000..ed586a4474b8
--- /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
+  ];
+
+  checkInputs = [
+    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..45fd001dd9a3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/plexapi/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, requests
+, tqdm
+, websocket-client
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "plexapi";
+  version = "4.12.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "pkkid";
+    repo = "python-plexapi";
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-OzHykLpcy+ZA3jfzrDwmCoNb4JhvdHYJErzfWn+zjqo=";
+  };
+
+  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";
+    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..86bd3c0bdb0e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/plexwebsocket/default.nix
@@ -0,0 +1,31 @@
+{ lib, buildPythonPackage, fetchFromGitHub, aiohttp, isPy27 }:
+
+buildPythonPackage rec {
+  pname = "plexwebsocket";
+  version = "0.0.13";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "jjlawren";
+    repo = "python-plexwebsocket";
+    rev = "v${version}";
+    sha256 = "sha256-u9zO3d0d4Qg+u4ezVRGkNDpJqHkYIMrEMJzBK5WKk8Y=";
+  };
+
+  propagatedBuildInputs = [ aiohttp ];
+
+  # package does not include tests
+  doCheck = false;
+
+  # at least guarantee the module can be imported
+  pythonImportsCheck = [
+    "plexwebsocket"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/jjlawren/python-plexwebsocket/";
+    description = "Async library to react to events issued over Plex websockets";
+    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/plotly/default.nix b/nixpkgs/pkgs/development/python-modules/plotly/default.nix
new file mode 100644
index 000000000000..79c7784e23bb
--- /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.9.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-sFNucrvAs88WmsH9AHWdd6rnuxKuN4zcdcXcNi9d5XY=";
+  };
+
+  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..9e0b1c817613
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/plotnine/default.nix
@@ -0,0 +1,76 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, matplotlib
+, scipy
+, patsy
+, pandas
+, statsmodels
+, pytestCheckHook
+, geopandas
+, scikit-misc
+, adjusttext
+, mizani }:
+
+buildPythonPackage rec {
+  pname = "plotnine";
+  version = "0.9.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-DompMBXzxx1oRKx6qfsNoJuQj199+n3V1opcoysuvOo=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace " --cov=plotnine --cov-report=xml" ""
+  '';
+
+  buildInputs = [
+    matplotlib
+    mizani
+    pandas
+    patsy
+    scipy
+    statsmodels
+  ];
+
+  checkInputs = [
+    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/en/stable";
+    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..8d1fcbed3a7f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pluggy/default.nix
@@ -0,0 +1,37 @@
+{ buildPythonPackage
+, lib
+, fetchPypi
+, setuptools-scm
+, pythonOlder
+, importlib-metadata
+}:
+
+buildPythonPackage rec {
+  pname = "pluggy";
+  version = "1.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159";
+  };
+
+  checkPhase = ''
+    py.test
+  '';
+
+  # To prevent infinite recursion with pytest
+  doCheck = false;
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  propagatedBuildInputs = lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  meta = {
+    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/pluginbase/default.nix b/nixpkgs/pkgs/development/python-modules/pluginbase/default.nix
new file mode 100644
index 000000000000..b8df04a1b32f
--- /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";
+  };
+
+  checkInputs = [ 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..2e54d5604e19
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/plugincode/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, setuptools-scm
+, click
+, commoncode
+, pluggy
+, pytestCheckHook
+, pytest-xdist
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "plugincode";
+  version = "30.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-QjcQCvhlaBzcbBB8MIhbsx4cRy7XkdvUcmG7rM48Sos=";
+  };
+
+  dontConfigure = true;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    click
+    commoncode
+    pluggy
+  ];
+
+  checkInputs = [
+    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";
+    license = licenses.asl20;
+    maintainers = teams.determinatesystems.members;
+  };
+}
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..259fe96028a9
--- /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 = teams.determinatesystems.members;
+  };
+}
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..e09182db18c8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/plugwise/default.nix
@@ -0,0 +1,69 @@
+ { lib
+, aiohttp
+, async-timeout
+, buildPythonPackage
+, crcmod
+, defusedxml
+, fetchFromGitHub
+, freezegun
+, jsonpickle
+, munch
+, mypy
+, pyserial
+, pytest-aiohttp
+, pytest-asyncio
+, pytestCheckHook
+, python-dateutil
+, pythonOlder
+, pytz
+, semver
+}:
+
+buildPythonPackage rec {
+  pname = "plugwise";
+  version = "0.21.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = "python-plugwise";
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-z/HSvk8fXPZmmx7lWaUMPfgT8EAmRn5sjRI+F4JKryw=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    async-timeout
+    crcmod
+    defusedxml
+    munch
+    pyserial
+    python-dateutil
+    pytz
+    semver
+  ];
+
+  checkInputs = [
+    freezegun
+    jsonpickle
+    mypy
+    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";
+    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..50a33266c8fa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/plum-py/default.nix
@@ -0,0 +1,29 @@
+{ lib, buildPythonPackage, fetchFromGitLab, isPy3k, pytest, baseline }:
+
+buildPythonPackage rec {
+  pname = "plum-py";
+  version = "0.4.0";
+  disabled = !isPy3k;
+
+  src = fetchFromGitLab {
+    owner = "dangass";
+    repo = "plum";
+    rev = "6a9ff863c0e9fa21f7b2230d25402155a5522e4b";
+    sha256 = "1iv62yb704c61b0dvsmyp3j6xpbmay532g9ny4pw4zbg3l69vd5j";
+  };
+
+  postPatch = ''
+    substituteInPlace src/plum/int/flag/_flag.py \
+      --replace 'if sys.version_info < (3, 7):' 'if True:'
+  '';
+
+  checkInputs = [ pytest baseline ];
+  checkPhase = "pytest tests";
+
+  meta = with lib; {
+    description = "Classes and utilities for packing/unpacking bytes";
+    homepage = "https://plum-py.readthedocs.io/en/latest/index.html";
+    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..70b4421778f3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/plumbum/default.nix
@@ -0,0 +1,69 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, openssh
+, ps
+, psutil
+, pytest-mock
+, pytest-timeout
+, pytestCheckHook
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "plumbum";
+  version = "1.7.2";
+
+  src = fetchFromGitHub {
+    owner = "tomerfiliba";
+    repo = "plumbum";
+    rev = "v${version}";
+    sha256 = "sha256-bCCcNFz+ZsbKSF7aCfy47lBHb873tDYN0qFuSCxJp1w=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "--cov-config=setup.cfg" ""
+  '';
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  checkInputs = [
+    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; {
+    description = " Plumbum: Shell Combinators ";
+    homepage = " https://github.com/tomerfiliba/plumbum ";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
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..c39595c5bd0b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/plyer/default.nix
@@ -0,0 +1,64 @@
+{ stdenv, lib, buildPythonPackage, fetchFromGitHub, fetchpatch, keyring, mock, pytestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "plyer";
+  version = "2.0.0";
+
+  src = fetchFromGitHub {
+    owner = "kivy";
+    repo = pname;
+    rev = version;
+    sha256 = "15z1wpq6s69s76r6akzgg340bpc21l2r1j8270gp7i1rpnffcjwm";
+  };
+
+  patches = [
+    # fix naming of the DOCUMENTS dir
+    (fetchpatch {
+      url = "https://github.com/rski/plyer/commit/99dabb2d62248fc3ea5705c2720abf71c9fc378b.patch";
+      sha256 = "sha256-bbnw0TxH4FGTso5dopzquDCjrjZAy+6CJauqi/nfstA=";
+    })
+    # fix handling of the ~/.config/user-dirs.dir file
+    (fetchpatch {
+      url = "https://github.com/rski/plyer/commit/f803697a1fe4fb5e9c729ee6ef1997b8d64f3ccd.patch";
+      sha256 = "sha256-akuh//P5puz2PwcBRXZQ4KoGk+fxi4jn2H3pTIT5M78=";
+    })
+  ];
+
+  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 ];
+
+  checkInputs = [ 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..130fba959ea3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/plyfile/default.nix
@@ -0,0 +1,21 @@
+{ lib, fetchPypi, buildPythonPackage, numpy
+}:
+
+buildPythonPackage rec {
+  pname = "plyfile";
+  version = "0.7.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9e9a18d22a3158fcd74df38761d43a7facc6df75126f2ab9f4e9a5d4d2188652";
+  };
+
+  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..d47805bb643f
--- /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.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "4ea98bea04ebf0f44747bacdfafefc8827787106fbb787f0aedc46482b2dfd53";
+  };
+
+  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/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/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..c65a37a99b9d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/podcastparser/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchFromGitHub, nose }:
+
+buildPythonPackage rec {
+  pname = "podcastparser";
+  version = "0.6.5";
+
+  src = fetchFromGitHub {
+    owner = "gpodder";
+    repo = "podcastparser";
+    rev = version;
+    sha256 = "1s83iq0mxcikxv6gi003iyavl1ai3siw1d7arijh0g28l0fff23a";
+  };
+
+  checkInputs = [ nose ];
+
+  checkPhase = ''
+    nosetests test_*.py
+  '';
+
+  meta = {
+    description = "podcastparser is a simple, fast and efficient podcast parser written in Python.";
+    homepage = "http://gpodder.org/podcastparser/";
+    license = lib.licenses.bsd2;
+    maintainers = with lib.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/poetry-core/default.nix b/nixpkgs/pkgs/development/python-modules/poetry-core/default.nix
new file mode 100644
index 000000000000..5922d67fc8b7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/poetry-core/default.nix
@@ -0,0 +1,67 @@
+{ lib, buildPythonPackage, fetchFromGitHub, pythonOlder, isPy27
+, git
+, importlib-metadata
+, intreehooks
+, pathlib2
+, pep517
+, pytest-mock
+, pytestCheckHook
+, tomlkit
+, typing ? null
+, virtualenv
+}:
+
+buildPythonPackage rec {
+  pname = "poetry-core";
+  version = "1.0.8";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "python-poetry";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-cs9SMGD9RdW8Wx/IAMq6gkOUBsney5r19hyGva98grk=";
+  };
+
+  postPatch = lib.optionalString (pythonOlder "3.8") ''
+    # remove >1.0.3
+    substituteInPlace pyproject.toml \
+      --replace 'importlib-metadata = {version = "^1.7.0", python = "~2.7 || >=3.5, <3.8"}' \
+        'importlib-metadata = {version = ">=1.7.0", python = "~2.7 || >=3.5, <3.8"}'
+  '';
+
+  nativeBuildInputs = [
+    intreehooks
+  ];
+
+  propagatedBuildInputs = lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ] ++ lib.optionals isPy27 [
+    pathlib2
+    typing
+  ];
+
+  checkInputs = [
+    git
+    pep517
+    pytest-mock
+    pytestCheckHook
+    tomlkit
+    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" ];
+
+  meta = with lib; {
+    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..7c0ba362f52d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/poetry-dynamic-versioning/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, dunamai
+, fetchFromGitHub
+, jinja2
+, markupsafe
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+, tomlkit
+}:
+
+buildPythonPackage rec {
+  pname = "poetry-dynamic-versioning";
+  version = "0.17.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "mtkennerly";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-okOooz0Z2d3EBm+lp68il2tXmbG5nRmDQmUdOXaHjpc=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    dunamai
+    jinja2
+    markupsafe
+    tomlkit
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # these require .git, but leaveDotGit = true doesn't help
+    "test__get_version__defaults"
+    "test__get_version__format_jinja"
+  ];
+
+  pythonImportsCheck = [
+    "poetry_dynamic_versioning"
+  ];
+
+  meta = with lib; {
+    description = "Plugin for Poetry to enable dynamic versioning based on VCS tags";
+    homepage = "https://github.com/mtkennerly/poetry-dynamic-versioning";
+    license = licenses.mit;
+    maintainers = with maintainers; [ cpcloud ];
+  };
+}
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..2318a2cf60be
--- /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;
+    sha256 = "sha256-2Am2Eqons5vy0PydMbT0gJsOlyZGxfGc+kbHJbdjiBA=";
+  };
+
+  checkInputs = [ 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/poetry/default.nix b/nixpkgs/pkgs/development/python-modules/poetry/default.nix
new file mode 100644
index 000000000000..22de7d71bcc8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/poetry/default.nix
@@ -0,0 +1,143 @@
+{ lib
+, buildPythonPackage
+, cachecontrol
+, cachy
+, cleo
+, clikit
+, crashtest
+, dataclasses
+, entrypoints
+, fetchFromGitHub
+, fetchpatch
+, html5lib
+, httpretty
+, importlib-metadata
+, intreehooks
+, keyring
+, lockfile
+, packaging
+, pexpect
+, pkginfo
+, poetry-core
+, pytest-mock
+, pytestCheckHook
+, pythonAtLeast
+, pythonOlder
+, requests
+, requests-toolbelt
+, shellingham
+, tomlkit
+, virtualenv
+}:
+
+buildPythonPackage rec {
+  pname = "poetry";
+  version = "1.1.14";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "python-poetry";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-n/GZOUoIMxWlULDqOe59Gt7Hz/+Mc4QcZT+1+HtQovs=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'importlib-metadata = {version = "^1.6.0", python = "<3.8"}' \
+       'importlib-metadata = {version = ">=1.6", python = "<3.8"}' \
+      --replace 'version = "^21.2.0"' 'version = ">=21.2"' \
+      --replace 'packaging = "^20.4"' 'packaging = "*"'
+  '';
+
+  nativeBuildInputs = [
+    intreehooks
+  ];
+
+  propagatedBuildInputs = [
+    cachecontrol
+    cachy
+    cleo
+    clikit
+    crashtest
+    entrypoints
+    html5lib
+    keyring
+    lockfile
+    packaging
+    pexpect
+    pkginfo
+    poetry-core
+    requests
+    requests-toolbelt
+    shellingham
+    tomlkit
+    virtualenv
+  ] ++ lib.optionals (pythonOlder "3.7") [
+    dataclasses
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  postInstall = ''
+    mkdir -p "$out/share/bash-completion/completions"
+    "$out/bin/poetry" completions bash > "$out/share/bash-completion/completions/poetry"
+    mkdir -p "$out/share/zsh/vendor-completions"
+    "$out/bin/poetry" completions zsh > "$out/share/zsh/vendor-completions/_poetry"
+    mkdir -p "$out/share/fish/vendor_completions.d"
+    "$out/bin/poetry" completions fish > "$out/share/fish/vendor_completions.d/poetry.fish"
+  '';
+
+  checkInputs = [
+    pytestCheckHook
+    httpretty
+    pytest-mock
+  ];
+
+  preCheck = ''
+    export HOME=$TMPDIR
+  '';
+
+  disabledTests = [
+    # touches network
+    "git"
+    "solver"
+    "load"
+    "vcs"
+    "prereleases_if_they_are_compatible"
+    "test_executor"
+    # requires git history to work correctly
+    "default_with_excluded_data"
+    # toml ordering has changed
+    "lock"
+    # fs permission errors
+    "test_builder_should_execute_build_scripts"
+  ] ++ lib.optionals (pythonAtLeast "3.10") [
+    # RuntimeError: 'auto_spec' might be a typo; use unsafe=True if this is intended
+    "test_info_setup_complex_pep517_error"
+  ];
+
+  patches = [
+    # The following patch addresses a minor incompatibility with
+    # pytest-mock. This is addressed upstream in
+    # https://github.com/python-poetry/poetry/pull/3457
+    (fetchpatch {
+      url = "https://github.com/python-poetry/poetry/commit/8ddceb7c52b3b1f35412479707fa790e5d60e691.diff";
+      sha256 = "yHjFb9xJBLFOqkOZaJolKviTdtST9PMFwH9n8ud2Y+U=";
+    })
+  ];
+
+  # Allow for package to use pep420's native namespaces
+  pythonNamespaces = [
+    "poetry"
+  ];
+
+  meta = with lib; {
+    homepage = "https://python-poetry.org/";
+    description = "Python dependency management and packaging made easy";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jakewaksbaum ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/poetry2conda/default.nix b/nixpkgs/pkgs/development/python-modules/poetry2conda/default.nix
new file mode 100644
index 000000000000..7f5268a23dc4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/poetry2conda/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonApplication
+, fetchFromGitHub
+, pytest-mock
+, pytestCheckHook
+, toml
+, poetry
+, poetry-semver
+, pyyaml
+}:
+
+buildPythonApplication rec {
+  pname = "poetry2conda";
+  version = "0.3.0";
+
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "dojeda";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-UqNoEGgStvqtxhYwExk7wO4SvATaM2kGaFbB5ViJa7U=";
+  };
+
+  nativeBuildInputs = [ poetry ];
+
+  propagatedBuildInputs = [
+    poetry-semver
+    toml
+  ];
+
+  checkInputs = [
+    pytest-mock
+    pytestCheckHook
+    pyyaml
+  ];
+
+  meta = with lib; {
+    description = "A script to convert a Python project declared on a pyproject.toml to a conda environment";
+    homepage = "https://github.com/dojeda/poetry2conda";
+    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..c4710f6901ed
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/polarizationsolver/default.nix
@@ -0,0 +1,38 @@
+{ 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";
+    sha256 = "sha256-LACf8Xw+o/uJ3+PD/DE/o7nwKY7fv3NyYbpjCrTTnBU=";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    periodictable
+    scipy
+  ];
+
+  checkInputs = [ 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/default.nix b/nixpkgs/pkgs/development/python-modules/polars/default.nix
new file mode 100644
index 000000000000..dd9dbc114b23
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/polars/default.nix
@@ -0,0 +1,87 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, pythonOlder
+, rustPlatform
+, libiconv
+, fetchzip
+}:
+let
+  pname = "polars";
+  version = "0.13.19";
+  rootSource = fetchzip {
+    url = "https://github.com/pola-rs/${pname}/archive/refs/tags/py-polars-v${version}.tar.gz";
+    sha256 = "sha256-JOHjxTTPzS9Dd/ODp4r0ebU9hEonxrbjURJoq0BQCyI=";
+  };
+in
+buildPythonPackage {
+  inherit pname version;
+  format = "pyproject";
+  disabled = pythonOlder "3.6";
+  src = rootSource;
+  preBuild = ''
+      cd py-polars
+  '';
+
+  cargoDeps = rustPlatform.fetchCargoTarball {
+    src = rootSource;
+    preBuild = ''
+        cd py-polars
+    '';
+    name = "${pname}-${version}";
+    sha256 = "sha256-KEt8lITY4El2afuh2cxnrDkXGN3MZgfKQU3Pe2jECF0=";
+  };
+  cargoRoot = "py-polars";
+
+  nativeBuildInputs = with rustPlatform; [ cargoSetupHook maturinBuildHook ];
+
+  buildInputs = lib.optionals stdenv.isDarwin [ libiconv ];
+
+  pythonImportsCheck = [ "polars" ];
+  # checkInputs = [
+  #   pytestCheckHook
+  #   fixtures
+  #   graphviz
+  #   matplotlib
+  #   networkx
+  #   numpy
+  #   pydot
+  # ];
+
+  meta = with lib; {
+    # Adding cmake to nativeBuildInputs and using `dontUseCmakeConfigure = true;`
+    # The following error still happens
+
+    # Compiling arrow2 v0.10.1 (https://github.com/ritchie46/arrow2?branch=polars#da703ae3)
+    # error[E0554]: `#![feature]` may not be used on the stable release channel
+    #  --> /build/polars-0.13.19-vendor.tar.gz/arrow2/src/lib.rs:8:39
+    #   |
+    # 8 | #![cfg_attr(feature = "simd", feature(portable_simd))]
+    #   |                                       ^^^^^^^^^^^^^
+    # error: aborting due to previous error
+    # For more information about this error, try `rustc --explain E0554`.
+    # error: could not compile `arrow2` due to 2 previous errors
+    # warning: build failed, waiting for other jobs to finish...
+    #  maturin failed
+    #   Caused by: Failed to build a native library through cargo
+    #   Caused by: Cargo build finished with "exit status: 101": `cargo rustc --message-format json --manifest-path Cargo.toml -j 8 --frozen --target x86_64-unknown-linux-gnu --release --lib -- -C link-arg=-s`
+    # error: builder for '/nix/store/qfnqi5hs3x4xdb6d4f6rpaf63n1w74yn-python3.10-polars-0.13.19.drv' failed with exit code 1;
+    #        last 10 log lines:
+    #        > error: aborting due to previous error
+    #        >
+    #        >
+    #        > For more information about this error, try `rustc --explain E0554`.
+    #        >
+    #        > error: could not compile `arrow2` due to 2 previous errors
+    #        > warning: build failed, waiting for other jobs to finish...
+    #        >  maturin failed
+    #        >   Caused by: Failed to build a native library through cargo
+    #        >   Caused by: Cargo build finished with "exit status: 101": `cargo rustc --message-format json --manifest-path Cargo.toml -j 8 --frozen --target x86_64-unknown-linux-gnu --release --lib -- -C link-arg=-s`
+    #        For full logs, run 'nix log /nix/store/qfnqi5hs3x4xdb6d4f6rpaf63n1w74yn-python3.10-polars-0.13.19.drv'.
+    broken = true;
+    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..6190824e68e1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/polib/default.nix
@@ -0,0 +1,20 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "polib";
+  version = "1.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "e02c355ae5e054912e3b0d16febc56510eff7e49d60bf22aecb463bd2f2a2dfa";
+  };
+
+  # 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..edb30132c3cb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/policy-sentry/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, beautifulsoup4
+, buildPythonPackage
+, click
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, requests
+, schema
+}:
+
+buildPythonPackage rec {
+  pname = "policy-sentry";
+  version = "0.12.4";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "salesforce";
+    repo = "policy_sentry";
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-eAydoWalAuhiZs06vU/D1JndxKBZZBsWqEFFbAvvfzA=";
+  };
+
+  propagatedBuildInputs = [
+    beautifulsoup4
+    click
+    requests
+    pyyaml
+    schema
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "policy_sentry" ];
+
+  meta = with lib; {
+    description = "Python module for generating IAM least privilege policies";
+    homepage = "https://github.com/salesforce/policy_sentry";
+    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..11835f3ca309
--- /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.0.20220613";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-xmsfuQd1BkOhmH60GbIRKuP5xSfAE0KVJfn6uYnJotc=";
+  };
+
+  # 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/polyline/default.nix b/nixpkgs/pkgs/development/python-modules/polyline/default.nix
new file mode 100644
index 000000000000..f1dcd699527a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/polyline/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, six
+, flake8
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "polyline";
+  version = "1.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0x60lm3ccq9zrcqlzyk041xgr1mi0k9lzyyv3cbbdiq9kb88jzvw";
+  };
+
+  propagatedBuildInputs = [ six ];
+  checkInputs = [ flake8 nose ];
+  checkPhase = ''
+    nosetests
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/hicsail/polyline";
+    license = licenses.mit;
+    description = "Python implementation of Google's Encoded Polyline Algorithm Format.";
+    longDescription = "polyline is a Python implementation of Google's Encoded Polyline Algorithm Format (http://goo.gl/PvXf8Y). It is essentially a port of https://github.com/mapbox/polyline built with Python 2 and 3 support in mind.";
+    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..6d89ac0db6ce
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pomegranate/default.nix
@@ -0,0 +1,40 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, numpy
+, scipy
+, cython
+, networkx
+, joblib
+, pandas
+, nose
+, pyyaml
+}:
+
+
+buildPythonPackage rec {
+  pname = "pomegranate";
+  version = "0.14.8";
+
+  src = fetchFromGitHub {
+    repo = pname;
+    owner = "jmschrei";
+    # no tags for recent versions: https://github.com/jmschrei/pomegranate/issues/974
+    rev = "0652e955c400bc56df5661db3298a06854c7cce8";
+    sha256 = "16g49nl2bgnh6nh7bd21s393zbksdvgp9l13ww2diwhplj6hlly3";
+  };
+
+  propagatedBuildInputs = [ numpy scipy cython networkx joblib pyyaml ];
+
+  checkInputs = [ 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..f6f67b24d298
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pontos/default.nix
@@ -0,0 +1,72 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+, colorful
+, tomlkit
+, git
+, packaging
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "pontos";
+  version = "22.7.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "greenbone";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-JvmdxkgWIcXQ7ML1Sx6/YeH5WXyq/UCEZlTc9nJbcQQ=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    colorful
+    tomlkit
+    packaging
+    requests
+  ];
+
+  checkInputs = [
+    git
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'packaging = "^20.3"' 'packaging = "*"'
+  '';
+
+  disabledTests = [
+    # 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"
+  ];
+
+  pythonImportsCheck = [
+    "pontos"
+  ];
+
+  meta = with lib; {
+    description = "Collection of Python utilities, tools, classes and functions";
+    homepage = "https://github.com/greenbone/pontos";
+    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..4cea071d2772
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pony/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pony";
+  version = "0.7.16";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "ponyorm";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-yATIsX2nKsW5DBwg9/LznQqf+XPY3q46WZut18Sr0v0=";
+  };
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Tests are outdated
+    "test_exception_msg"
+    "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..238e6ad62230
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pooch/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, isPy27
+, fetchPypi
+, setuptools-scm
+, pytestCheckHook
+, packaging
+, appdirs
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "pooch";
+  version = "1.6.0";
+  format = "pyproject";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-V9IOxLEN1pTSsFu2S8axCcboWmwUBXlM6H7Ys0GrP0Q=";
+  };
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  propagatedBuildInputs = [ packaging appdirs requests ];
+
+  preCheck = "HOME=$TMPDIR";
+  checkInputs = [ pytestCheckHook ];
+  # tries to touch network
+  disabledTests = [
+    "pooch_custom_url"
+    "pooch_download"
+    "pooch_logging_level"
+    "pooch_update"
+    "pooch_corrupted"
+    "check_availability"
+    "downloader"
+    "test_retrieve"
+    "test_stream_download"
+    "test_fetch"
+    "decompress"
+    "extractprocessor_fails"
+    "processor"
+    "integration"
+  ];
+
+  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..35829044c3cf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pook/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, furl
+, jsonschema
+, nose
+, pytestCheckHook
+, pythonOlder
+, requests
+, xmltodict
+}:
+
+buildPythonPackage rec {
+  pname = "pook";
+  version = "1.0.2";
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "h2non";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-4OGcnuajGdBRlXCYwbTK/zLNQRrir60qCYajHRRCpkU=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    furl
+    jsonschema
+    requests
+    xmltodict
+  ];
+
+  checkInputs = [
+    nose
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "pook" ];
+
+  meta = with lib; {
+    description = "HTTP traffic mocking and testing made simple in Python";
+    homepage = "https://github.com/h2non/pook";
+    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..a2dfaf8e4837
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/poppler-qt5/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, isPy3k
+, fetchPypi
+, sip
+, qtbase
+, qmake
+, pyqt5
+, pyqt-builder
+, poppler
+, pkg-config
+, fetchpatch
+}:
+
+buildPythonPackage rec {
+  pname = "python-poppler-qt5";
+  version = "21.1.0";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0b82gm4i75q5v19kfbq0h4y0b2vcwr2213zkhxh6l0h45kdndmxd";
+  };
+
+  patches = [
+    # Fix for https://github.com/frescobaldi/python-poppler-qt5/issues/43 (from PR #45)
+    (fetchpatch {
+      url = "https://github.com/frescobaldi/python-poppler-qt5/commit/40e71ad88173d02648bceb2438bc0567e60dacd5.patch";
+      sha256 = "0c93d0k7b1n2s2njl8g92x6vw3z96da1fczah9qx07x08iw8dzi5";
+    })
+  ];
+
+  buildInputs = [ qtbase.dev poppler pyqt-builder ];
+  nativeBuildInputs = [ pkg-config qmake sip ];
+  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/portalocker/default.nix b/nixpkgs/pkgs/development/python-modules/portalocker/default.nix
new file mode 100644
index 000000000000..2d57952de3ec
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/portalocker/default.nix
@@ -0,0 +1,36 @@
+{ lib, buildPythonPackage, fetchPypi
+, pytestCheckHook
+, pytest-mypy
+, redis
+}:
+
+buildPythonPackage rec {
+  version = "2.5.1";
+  pname = "portalocker";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-ro6cwmYNoEv0H6Gg7vfjALteSlhprfsabYVRYytVmys=";
+  };
+
+  propagatedBuildInputs = [
+    redis
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    pytest-mypy
+  ];
+
+  disabledTests = [
+    "test_combined" # no longer compatible with setuptools>=58
+  ];
+
+  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 ];
+    platforms = platforms.unix; # Windows has a dependency on pypiwin32
+  };
+}
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..bf84e41610cb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/portend/default.nix
@@ -0,0 +1,27 @@
+{ lib, buildPythonPackage, fetchPypi
+, pytestCheckHook, setuptools-scm, tempora  }:
+
+buildPythonPackage rec {
+  pname = "portend";
+  version = "3.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "239e3116045ea823f6df87d6168107ad75ccc0590e37242af0cc1e98c5d224e4";
+  };
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  propagatedBuildInputs = [ tempora ];
+
+  checkInputs = [ pytestCheckHook ];
+
+  # 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..b88bccfc534b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/portpicker/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, psutil
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "portpicker";
+  version = "1.5.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-xVaDrXJfXACkG8fbAiUiPovgJLH6Vk0DntM5Dk/Uj7M=";
+  };
+
+  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..59f4b4b707f2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/posix_ipc/default.nix
@@ -0,0 +1,21 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "posix_ipc";
+  version = "1.0.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "6cddb1ce2cf4aae383f2a0079c26c69bee257fe2720f372201ef047f8ceb8b97";
+  };
+
+  meta = with lib; {
+    description = "POSIX IPC primitives (semaphores, shared memory and message queues)";
+    license = licenses.bsd3;
+    homepage = "http://semanchuk.com/philip/posix_ipc/";
+  };
+
+}
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..2cc9e3368c76
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pot/default.nix
@@ -0,0 +1,126 @@
+{ lib
+, autograd
+, buildPythonPackage
+, cupy
+, cvxopt
+, cython
+, fetchPypi
+, matplotlib
+, numpy
+, tensorflow
+, pymanopt
+, pytestCheckHook
+, pythonOlder
+, scikit-learn
+, scipy
+, enableDimensionalityReduction ? false
+, enableGPU ? false
+}:
+
+buildPythonPackage rec {
+  pname = "pot";
+  version = "0.8.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    pname = "POT";
+    inherit version;
+    sha256 = "sha256-PKmuPI83DPy7RkOgHHPdPJJz5NT/fpr123AVTzTLwgQ=";
+  };
+
+  nativeBuildInputs = [
+    numpy
+    cython
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    scipy
+  ] ++ lib.optionals enableGPU [
+    cupy
+  ] ++ lib.optionals enableDimensionalityReduction [
+    autograd
+    pymanopt
+  ];
+
+  checkInputs = [
+    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" ""
+    substituteInPlace setup.py \
+      --replace '"oldest-supported-numpy", ' ""
+
+    # we don't need setup.py to find the macos sdk for us
+    sed -i '/sdk_path/d' setup.py
+  '';
+
+  # To prevent importing of an incomplete package from the build directory
+  # instead of nix store (`ot` is the top-level package name).
+  preCheck = ''
+    rm -r ot
+  '';
+
+  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 = [
+    # AttributeError: module pytest has no attribute skip_backend
+    "test/test_bregman.py"
+    "test/test_da.py"
+    "test/test_utils.py"
+    "test/test_gromov.py"
+    "test/test_helpers.py"
+    "test/test_unbalanced.py"
+  ] ++ 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..9396a170ba1d
--- /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.4";
+  pname = "potentials";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-yBqU1FN2KlWE2Stg9OMdBLUfIQdbUGWCH4GU6r6HkDI=";
+  };
+
+  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..de97627f6df4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/powerline/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, socat
+, psutil
+, 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}";
+    sha256 = "sha256-UIx9/IZg6Wv596wHzQb0CO6zwmQXUaFEPKBojo2LXmA=";
+  };
+
+  propagatedBuildInputs = [
+    socat
+    psutil
+    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..3659c7e5497a
--- /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.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-y7DArNZQwP+2IJmdphHpOq5RBcRqCExM6vL3BO1wjB4=";
+  };
+
+  # 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..15597188135f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ppft/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, python
+, pythonOlder
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "ppft";
+  version = "1.7.6.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-R+DauHpRbAuZks1bDJCDSOTH2WQwTRBrIn+tKK4DIZ4=";
+  };
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  # darwin seems to hang
+  doCheck = !stdenv.isDarwin;
+  checkPhase = ''
+    cd examples
+    ${python.interpreter} -m ppft.tests
+  '';
+
+  pythonImportsCheck = [
+    "ppft"
+  ];
+
+  meta = with lib; {
+    description = "Distributed and parallel Python";
+    homepage = "https://ppft.readthedocs.io/";
+    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..190e28e714cd
--- /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.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "500bd0f4ae1a76956fae7fcba77854f5ec3e64fce76803664983763c3f2bd8bd";
+  };
+
+  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..5b07613f098a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pprintpp/default.nix
@@ -0,0 +1,30 @@
+{ lib, fetchpatch, buildPythonPackage, fetchPypi, python, nose, parameterized }:
+
+buildPythonPackage rec {
+  pname = "pprintpp";
+  version = "0.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "00v4pkyiqc0y9qjnp3br58a4k5zwqdrjjxbcsv39vx67w84630pa";
+  };
+
+  patches = [
+    (fetchpatch {
+      url = "https://github.com/wolever/pprintpp/commit/873217674cc824b4c1cfdad4867c560c60e8d806.patch";
+      sha256 = "0rqxzxawr83215s84mfzh1gnjwjm2xv399ywwcl4q7h395av5vb3";
+    })
+  ];
+
+  checkInputs = [ nose parameterized ];
+  checkPhase = ''
+    ${python.interpreter} test.py
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/wolever/pprintpp";
+    description = "A drop-in replacement for pprint that's actually pretty";
+    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..57d8048f0d6d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ppscore/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pandas
+, pytestCheckHook
+, pythonOlder
+, scikit-learn
+}:
+
+buildPythonPackage rec {
+  pname = "ppscore";
+  version = "unstable-2021-11-25";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "8080labs";
+    repo = pname;
+    rev = "c9268c16b6305c5c38e2fe2fd84f43d97ec1aaca";
+    hash = "sha256-qiogjUgcLFauAMpVf2CKNC27c9xR9q7nY69n8/go1ms=";
+  };
+
+  propagatedBuildInputs = [
+    pandas
+    scikit-learn
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "ppscore"
+  ];
+
+  meta = with lib; {
+    description = "Python implementation of the Predictive Power Score (PPS)";
+    homepage = "https://github.com/8080labs/ppscore/";
+    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..ff1433725fca
--- /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.0";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c664ee3a9a25efcb583e3d1d797588fb7c2fb5096220689eec78a7946b01b5ff";
+  };
+
+  # 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 = [ maintainers.costrouc ];
+  };
+}
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..cefa13610081
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/prance/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, chardet
+, requests
+, ruamel-yaml
+, setuptools-scm
+, six
+, semver
+, pytestCheckHook
+, openapi-spec-validator
+}:
+
+buildPythonPackage rec {
+  pname = "prance";
+  version = "0.21.8.0";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "RonnyPfannschmidt";
+    repo = pname;
+    rev = "v${version}";
+    fetchSubmodules = true;
+    sha256 = "sha256-kGANMHfWwhW3ZBw2ZVCJZR/bV2EPhcydMKhDeDTVwcQ=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "--cov=prance --cov-report=term-missing --cov-fail-under=90" "" \
+      --replace "chardet>=3.0,<5.0" "chardet"
+  '';
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    chardet
+    requests
+    ruamel-yaml
+    six
+    semver
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    openapi-spec-validator
+  ];
+
+  # Disable tests that require network
+  disabledTestPaths = [
+    "tests/test_convert.py"
+  ];
+  disabledTests = [
+    "test_fetch_url_http"
+  ];
+  pythonImportsCheck = [ "prance" ];
+
+  meta = with lib; {
+    description = "Resolving Swagger/OpenAPI 2.0 and 3.0.0 Parser";
+    homepage = "https://github.com/RonnyPfannschmidt/prance";
+    license = licenses.mit;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..967ff88be92c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/praw/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, betamax
+, betamax-matchers
+, betamax-serializers
+, buildPythonPackage
+, fetchFromGitHub
+, mock
+, prawcore
+, pytestCheckHook
+, pythonOlder
+, requests-toolbelt
+, update_checker
+, websocket-client
+}:
+
+buildPythonPackage rec {
+  pname = "praw";
+  version = "7.6.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "praw-dev";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-y2eynMsjF4wZd31YoLdtk8F+ga7Z3R+IQkQK0x0RAGA=";
+  };
+
+  propagatedBuildInputs = [
+    mock
+    prawcore
+    update_checker
+    websocket-client
+  ];
+
+  checkInputs = [
+    betamax
+    betamax-serializers
+    betamax-matchers
+    pytestCheckHook
+    requests-toolbelt
+  ];
+
+  pythonImportsCheck = [
+    "praw"
+  ];
+
+  meta = with lib; {
+    description = "Python Reddit API wrapper";
+    homepage = "https://praw.readthedocs.org/";
+    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..a115d42472a6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/prawcore/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, requests
+, testfixtures
+, mock
+, requests-toolbelt
+, betamax
+, betamax-serializers
+, betamax-matchers
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "prawcore";
+  version = "2.3.0";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0vgmhjddqxnz5vy70dyqvakak51fg1nk6j3xavkc83d8nzacrwfs";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  checkInputs = [
+    testfixtures
+    mock
+    betamax
+    betamax-serializers
+    betamax-matchers
+    requests-toolbelt
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "prawcore" ];
+
+  meta = with lib; {
+    description = "Low-level communication layer for PRAW";
+    homepage = "https://praw.readthedocs.org/";
+    license = licenses.bsd2;
+    platforms = platforms.all;
+    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..4a679a403140
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/prayer-times-calculator/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "prayer-times-calculator";
+  version = "0.0.6";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "uchagani";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-0hXbgzEKrWk79Ldd37fqnkOELa+dAGtc80RQfDZ1JTI=";
+  };
+
+  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";
+    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..282dd59a05c0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pre-commit-hooks/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, git
+, pytestCheckHook
+, pythonOlder
+, ruamel-yaml
+, toml
+}:
+
+buildPythonPackage rec {
+  pname = "pre-commit-hooks";
+  version = "4.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "pre-commit";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-qdsSM+7ScSfxhmLAqwi1iraGHrhb5NBee/j+TKr2WUA=";
+  };
+
+  propagatedBuildInputs = [
+    ruamel-yaml
+    toml
+  ];
+
+  checkInputs = [
+    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";
+    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..f6e0459139a0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/precis-i18n/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "precis-i18n";
+  version = "1.0.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "byllyfish";
+    repo = "precis_i18n";
+    rev = "v${version}";
+    hash = "sha256-90yNusUyz8qJi7WWYIFhHzrpvu1TqxfpT+lv2CVhSR8=";
+  };
+
+  pythonImportsCheck = [
+    "precis_i18n"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/byllyfish/precis_i18n";
+    description = "Internationalized usernames and passwords";
+    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..d5837fd90a1c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/prefixed/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "prefixed";
+  version = "0.3.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ca48277ba5fa8346dd4b760847da930c7b84416387c39e93affef086add2c029";
+  };
+
+  checkInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "prefixed" ];
+
+  meta = with lib; {
+    description = "Prefixed alternative numeric library";
+    homepage = "https://github.com/Rockhopper-Technologies/prefixed";
+    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..44be123335f9
--- /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 ];
+  checkInputs = [ 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..44a54810e443
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/preprocess-cancellation/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, poetry-core
+, 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
+  ];
+
+  propagatedBuildInputs = [
+    shapely
+  ];
+
+  checkInputs = [
+    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..e0188ff1a676
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/preshed/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, murmurhash
+, pytest
+, cython
+, cymem
+, python
+}:
+buildPythonPackage rec {
+  pname = "preshed";
+  version = "3.0.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "fb3b7588a3a0f2f2f1bf3fe403361b2b031212b73a37025aea1df7215af3772a";
+  };
+
+  propagatedBuildInputs = [
+    cython
+    cymem
+    murmurhash
+  ];
+
+  checkInputs = [
+    pytest
+  ];
+
+  checkPhase = ''
+    ${python.interpreter} setup.py test
+  '';
+
+  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..0134b0dc36a4
--- /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=";
+  };
+
+  checkInputs = [
+    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..21e7a455da88
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/prettytable/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, glibcLocales
+, setuptools-scm
+, wcwidth
+, importlib-metadata
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "prettytable";
+  version = "3.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-EY61T9J5QEm4EIk2U7IJUjSd9tO8F2Tn+s2KGAZPqbA=";
+  };
+
+  nativeBuildInputs = [ setuptools-scm ];
+  buildInputs = [ glibcLocales ];
+
+  propagatedBuildInputs = [
+    wcwidth
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  preCheck = ''
+    export LANG="en_US.UTF-8"
+  '';
+
+  # no test no longer available in pypi package
+  doCheck = false;
+  pythonImportsCheck = [ "prettytable" ];
+
+  meta = with lib; {
+    description = "Simple Python library for easily displaying tabular data in a visually appealing ASCII table format";
+    homepage = "http://code.google.com/p/prettytable/";
+    license = licenses.bsd3;
+  };
+
+}
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..0f1a2ac66fef
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/primer3/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, cython
+, gcc
+, click
+}:
+
+buildPythonPackage rec {
+  pname = "primer3";
+  version = "0.6.1";
+
+  src = fetchFromGitHub {
+    owner = "libnano";
+    repo = "primer3-py";
+    rev = version;
+    sha256 = "1glybwp9w2m1ydvaphr41gj31d8fvlh40s35galfbjqa563si72g";
+  };
+
+  nativeBuildInputs = [ cython ]
+    ++ lib.optionals stdenv.isDarwin [ gcc ];
+
+  # pytestCheckHook leads to a circular import issue
+  checkInputs = [ click ];
+
+  pythonImportsCheck = [ "primer3" ];
+
+  meta = with lib; {
+    description = "Oligo analysis and primer design";
+    homepage = "https://github.com/libnano/primer3-py";
+    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..16908e90c9e6
--- /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"
+  ];
+
+  checkInputs = [
+    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..95a79ea1896b
--- /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;
+    sha256 = "sha256-qor40vUQeTdlO3vwug3GGNX5vkNaF0H7EWlRdsY4bvc=";
+  };
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  checkInputs = [
+    nose
+  ];
+
+  meta = with lib; {
+    description = "Rison encoder/decoder";
+    homepage = "https://github.com/betodealmeida/python-rison";
+    license = licenses.mit;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/privacyidea-ldap-proxy/default.nix b/nixpkgs/pkgs/development/python-modules/privacyidea-ldap-proxy/default.nix
new file mode 100644
index 000000000000..417113537b9c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/privacyidea-ldap-proxy/default.nix
@@ -0,0 +1,32 @@
+{ lib, buildPythonPackage, fetchFromGitHub, twisted, ldaptor, configobj, fetchpatch }:
+
+buildPythonPackage rec {
+  pname = "privacyidea-ldap-proxy";
+  version = "0.7";
+
+  src = fetchFromGitHub {
+    owner = "privacyidea";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1i2kgxqd38xvb42qj0a4a35w4vk0fyp3n7w48kqmvrxc77p6r6i8";
+  };
+
+  patches = [
+    # support for LDAPCompareRequest.
+    (fetchpatch {
+      url = "https://github.com/mayflower/privacyidea-ldap-proxy/commit/a13356717379b174f1a6abf767faa0dbd459f5dd.patch";
+      sha256 = "sha256-SBTj9ayQ8JFD8BoYIl77nxWVV3PXnHZ8JMlJnxd/nEk=";
+    })
+  ];
+
+  propagatedBuildInputs = [ twisted ldaptor configobj ];
+
+  pythonImportsCheck = [ "pi_ldapproxy" ];
+
+  meta = with lib; {
+    description = "LDAP Proxy to intercept LDAP binds and authenticate against privacyIDEA";
+    homepage = "https://github.com/privacyidea/privacyidea-ldap-proxy";
+    license = licenses.agpl3Only;
+    maintainers = [ maintainers.globin ];
+  };
+}
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/proglog/default.nix b/nixpkgs/pkgs/development/python-modules/proglog/default.nix
new file mode 100644
index 000000000000..3b630f719054
--- /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;
+    sha256 = "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..801beaa44710
--- /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 = [ maintainers.costrouc ];
+  };
+}
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..9b159846f100
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/progressbar2/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, python
+, buildPythonPackage
+, fetchPypi
+, python-utils
+}:
+
+buildPythonPackage rec {
+  pname = "progressbar2";
+  version = "4.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "14d3165a1781d053ffaa117daf27cc706128d2ec1d2977fdb05b6bb079888013";
+  };
+
+  propagatedBuildInputs = [ python-utils ];
+
+  pythonImportsCheck = [ "progressbar" ];
+
+  meta = with lib; {
+    homepage = "https://progressbar-2.readthedocs.io/en/latest/";
+    description = "Text progressbar library for python";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ashgillman turion ];
+  };
+}
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..9b6653f2fa59
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/prometheus-client/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "prometheus-client";
+  version = "0.14.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "prometheus";
+    repo = "client_python";
+    rev = "v${version}";
+    sha256 = "sha256-hvBdWOMDuzF91Hv4u//tF+z6la0JfiTQHlpS4TnWpmk=";
+  };
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "prometheus_client"
+  ];
+
+  meta = with lib; {
+    description = "Prometheus instrumentation library for Python applications";
+    homepage = "https://github.com/prometheus/client_python";
+    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..7abb9670ac8a
--- /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.18.1";
+
+  src = fetchFromGitHub {
+    owner = "rycus86";
+    repo = "prometheus_flask_exporter";
+    rev = version;
+    sha256 = "1dwisp681w0f6zf0000rxd3ksdb48zb9mr38qfdqk2ir24y8w370";
+  };
+
+  propagatedBuildInputs = [ flask prometheus-client ];
+
+  checkInputs = [ 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/promise/default.nix b/nixpkgs/pkgs/development/python-modules/promise/default.nix
new file mode 100644
index 000000000000..8833689cec12
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/promise/default.nix
@@ -0,0 +1,48 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, lib
+, six
+, pytestCheckHook
+, mock
+, pytest-asyncio
+}:
+
+buildPythonPackage rec {
+  pname = "promise";
+  version = "2.3.0";
+
+  src = fetchFromGitHub {
+    owner = "syrusakbary";
+    repo = "promise";
+    rev = "v${version}";
+    sha256 = "17mq1bm78xfl0x1g50ng502m5ldq6421rzz35hlqafsj0cq8dkp6";
+  };
+
+  postPatch = ''
+    substituteInPlace tests/test_extra.py \
+      --replace "assert_exc.traceback[-1].path.strpath" "str(assert_exc.traceback[-1].path)"
+  '';
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    mock
+    pytest-asyncio
+  ];
+
+  disabledTestPaths = [
+    "tests/test_benchmark.py"
+  ];
+
+  meta = with lib; {
+    description = "Ultra-performant Promise implementation in Python";
+    homepage = "https://github.com/syrusakbary/promise";
+    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..e1b9695071a6
--- /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 ];
+
+  checkInputs = [ 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..f87558e5194c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/prompt-toolkit/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+, six
+, wcwidth
+}:
+
+buildPythonPackage rec {
+  pname = "prompt-toolkit";
+  version = "3.0.30";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    pname = "prompt_toolkit";
+    inherit version;
+    sha256 = "sha256-hZsoPFC95F9fl4Kfd6RnTRwfzYhTk2Txsoo3gFz9icA=";
+  };
+
+  propagatedBuildInputs = [
+    six
+    wcwidth
+  ];
+
+  checkInputs = [
+    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";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
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..f50f9625fd96
--- /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 ];
+  checkInputs = [ 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/protego/default.nix b/nixpkgs/pkgs/development/python-modules/protego/default.nix
new file mode 100644
index 000000000000..a881292ada2d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/protego/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, six
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "Protego";
+  version = "0.2.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-32ZtQwTat3Ti3J/rIIuxrI1x6lzuwS9MmeujD71kL/I=";
+  };
+  propagatedBuildInputs = [ six ];
+
+  checkInputs = [ pytest ];
+
+  checkPhase = ''
+    pytest tests
+  '';
+
+  meta = with lib; {
+    description = "A pure-Python robots.txt parser with support for modern conventions";
+    homepage = "https://github.com/scrapy/protego";
+    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..3db023447f61
--- /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.20.6";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-RJtFN+g/R3a9aQUcTXdtuP/j+dBkHx6HsGwRbrlMkOk=";
+  };
+
+  propagatedBuildInputs = [ protobuf ];
+
+  checkInputs = [ 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 SuperSandro2000 ];
+  };
+}
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..ee1d0bbffb5a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/protobuf/default.nix
@@ -0,0 +1,64 @@
+{ buildPackages
+, lib
+, fetchpatch
+, python
+, buildPythonPackage
+, isPy37
+, protobuf
+, google-apputils ? null
+, six
+, pyext
+, isPy27
+, disabled
+, doCheck ? true
+}:
+
+buildPythonPackage {
+  inherit (protobuf) pname src version;
+  inherit disabled;
+  doCheck = doCheck && !isPy27; # setuptools>=41.4 no longer collects correctly on python2
+
+  propagatedBuildInputs = [ six ] ++ lib.optionals isPy27 [ google-apputils ];
+  propagatedNativeBuildInputs = let
+    protobufVersion = "${lib.versions.major protobuf.version}_${lib.versions.minor protobuf.version}";
+  in [
+    buildPackages."protobuf${protobufVersion}" # For protoc of the same version.
+  ];
+
+  nativeBuildInputs = [ pyext ] ++ lib.optionals isPy27 [ google-apputils ];
+  buildInputs = [ protobuf ];
+
+  patches = lib.optional (isPy37 && (lib.versionOlder protobuf.version "3.6.1.2"))
+    # Python 3.7 compatibility (not needed for protobuf >= 3.6.1.2)
+    (fetchpatch {
+      url = "https://github.com/protocolbuffers/protobuf/commit/0a59054c30e4f0ba10f10acfc1d7f3814c63e1a7.patch";
+      sha256 = "09hw22y3423v8bbmc9xm07znwdxfbya6rp78d4zqw6fisdvjkqf1";
+      stripLen = 1;
+    })
+  ;
+
+  prePatch = ''
+    while [ ! -d python ]; do
+      cd *
+    done
+    cd python
+  '';
+
+  setupPyGlobalFlags = lib.optional (lib.versionAtLeast protobuf.version "2.6.0")
+    "--cpp_implementation";
+
+  pythonImportsCheck = [
+    "google.protobuf"
+  ] ++ lib.optionals (lib.versionAtLeast protobuf.version "2.6.0") [
+    "google.protobuf.internal._api_implementation" # Verify that --cpp_implementation worked
+  ];
+
+  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 ];
+  };
+
+  passthru.protobuf = protobuf;
+}
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..914f12a1546c
--- /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;
+    sha256 = "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;
+    })
+  ];
+
+  checkInputs = [ 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/default.nix b/nixpkgs/pkgs/development/python-modules/protonup/default.nix
new file mode 100644
index 000000000000..ad760063248f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/protonup/default.nix
@@ -0,0 +1,29 @@
+{ lib, buildPythonPackage, pythonOlder, fetchPypi, requests, configparser }:
+
+buildPythonPackage rec {
+  pname = "protonup";
+  version = "0.1.4";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0z5q0s9h51w2bqm9lkafml14g13v2dgm4nm9x06v7nxqc9msmyyy";
+  };
+
+  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/AUNaseef/protonup";
+    description = "CLI program and API to automate the installation and update of GloriousEggroll's Proton-GE";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ flexagoon ];
+  };
+}
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..c86ffd5bde5f
--- /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.11.0";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "ProtonVPN";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-kfOLhM0/jzHj+KlDrnCe571Bcmv8TvuAbXMpt3uR2L0=";
+  };
+
+  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..101ea7e2e939
--- /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
+  ];
+
+  checkInputs = [
+    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..1202d45efa4a
--- /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";
+  };
+
+  checkInputs = [
+    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..9684fe84ba0f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/proxmoxer/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, mock
+, nose
+, paramiko
+, pytestCheckHook
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "proxmoxer";
+  version = "1.3.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-FY0JLDBoKmh85VoKh3UuPPRbMAIjs3l/fZM4owniH1c=";
+  };
+
+  propagatedBuildInputs = [
+    paramiko
+    requests
+  ];
+
+  checkInputs = [
+    mock
+    nose
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    # Tests require openssh_wrapper which is outdated and not available
+    "tests/paramiko_tests.py"
+  ];
+
+  pythonImportsCheck = [
+    "proxmoxer"
+  ];
+
+  meta = with lib; {
+    description = "Python wrapper for Proxmox API v2";
+    homepage = "https://github.com/proxmoxer/proxmoxer";
+    license = with licenses; [ bsd3 ];
+    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..bea708129872
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/proxy-py/default.nix
@@ -0,0 +1,65 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchFromGitHub
+, openssl
+, paramiko
+, pytest-asyncio
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+, setuptools-scm
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "proxy-py";
+  version = "2.4.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "abhinavsingh";
+    repo = "proxy.py";
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-dA7a9RicBFCSf6IoGX/CdvI8x/xMOFfNtyuvFn9YmHI=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    paramiko
+    typing-extensions
+  ];
+
+  checkInputs = [
+    openssl
+    pytest-asyncio
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d);
+  '';
+
+  postPatch = ''
+    substituteInPlace requirements.txt \
+      --replace "typing-extensions==3.7.4.3" "typing-extensions"
+  '';
+
+  pythonImportsCheck = [
+    "proxy"
+  ];
+
+  meta = with lib; {
+    broken = (stdenv.isLinux && stdenv.isAarch64) || stdenv.isDarwin;
+    description = "Python proxy framework";
+    homepage = "https://github.com/abhinavsingh/proxy.py";
+    license = with licenses; [ bsd3 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..e4596956dda8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/proxy_tools/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "proxy_tools";
+  version = "0.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-zLN1H1KcBH4tilhEDYayBTA88P6BRveE0cvNlPCigBA=";
+  };
+
+  # 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..b9fb5f3aa146
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/psautohint/default.nix
@@ -0,0 +1,59 @@
+{ 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 ];
+
+  checkInputs = [
+    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"
+  ];
+
+  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..fae2c8a42818
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pscript/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, nodejs
+}:
+
+buildPythonPackage rec {
+  pname = "pscript";
+  version = "0.7.6";
+
+  # PyPI tarball doesn't include tests directory
+  src = fetchFromGitHub {
+    owner = "flexxui";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "169px5n4jjnpdn9y86f28qwd95bwf1q1rz0a1h3lb5nn5c6ym8c4";
+  };
+
+  checkInputs = [
+    pytestCheckHook
+    nodejs
+  ];
+
+  preCheck = ''
+    # do not execute legacy tests
+    rm -rf pscript_legacy
+  '';
+
+  meta = with lib; {
+    description = "Python to JavaScript compiler";
+    license = licenses.bsd2;
+    homepage = "https://pscript.readthedocs.io";
+    maintainers = [ 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..b832b7051e3c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/psd-tools/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, isPy27
+, docopt
+, pillow
+, enum34
+, scikitimage
+, aggdraw
+, pytestCheckHook
+, ipython
+, cython
+}:
+
+buildPythonPackage rec {
+  pname = "psd-tools";
+  version = "1.9.21";
+
+  src = fetchFromGitHub {
+    owner = "psd-tools";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-+nqN7DJHbr7XkfG0oUQkWcxv+krR8DlQndAQCvnBk3s=";
+  };
+
+  nativeBuildInputs = [ cython ];
+
+  propagatedBuildInputs = [
+    aggdraw
+    docopt
+    ipython
+    pillow
+    scikitimage
+  ];
+
+  checkInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "psd_tools" ];
+
+  meta = with lib; {
+    description = "Python package for reading Adobe Photoshop PSD files";
+    homepage = "https://github.com/kmike/psd-tools";
+    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..41c514d2ca63
--- /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.1.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "jborean93";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-f1NGE+wSgi8yqBicZZRfUqzinsqazuIaoAje2y+dK1w=";
+  };
+
+  propagatedBuildInputs = [
+    cryptography
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    xmldiff
+  ];
+
+
+  pythonImportsCheck = [
+    "psrpcore"
+  ];
+
+  meta = with lib; {
+    description = "Library for the PowerShell Remoting Protocol (PSRP)";
+    homepage = "https://github.com/jborean93/psrpcore";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..197da3c76ce6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/psutil/default.nix
@@ -0,0 +1,54 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, isPy27, python
+, IOKit
+, pytestCheckHook
+, mock
+, unittest2
+}:
+
+buildPythonPackage rec {
+  pname = "psutil";
+  version = "5.9.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-V/GBm12elc37DIgailt9VC7Qt8Ui1XVwaoC+3ISMiVQ=";
+  };
+
+  # We have many test failures on various parts of the package:
+  #  - segfaults on darwin:
+  #    https://github.com/giampaolo/psutil/issues/1715
+  #  - swap (on linux) might cause test failures if it is fully used:
+  #    https://github.com/giampaolo/psutil/issues/1911
+  #  - some mount paths are required in the build sanbox to make the tests succeed:
+  #    https://github.com/giampaolo/psutil/issues/1912
+  doCheck = false;
+  checkInputs = [ pytestCheckHook ]
+  ++ lib.optionals isPy27 [ mock unittest2 ];
+  # 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 = [
+    "$out/${python.sitePackages}/psutil/tests/test_system.py"
+  ];
+
+  # Note: $out must be referenced as test import paths are relative
+  disabledTests = [
+    "user"
+    "disk_io_counters"
+    "sensors_battery"
+    "cpu_times"
+    "cpu_freq"
+  ];
+
+  buildInputs = lib.optionals stdenv.isDarwin [ IOKit ];
+
+  pythonImportsCheck = [ "psutil" ];
+
+  meta = with lib; {
+    description = "Process and system utilization information interface for python";
+    homepage = "https://github.com/giampaolo/psutil";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
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..6c80ab10f745
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/psycopg/default.nix
@@ -0,0 +1,137 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, fetchurl
+, pythonOlder
+, substituteAll
+
+# links (libpq)
+, postgresql
+
+# propagates
+, backports-zoneinfo
+, typing-extensions
+
+# docs
+, furo
+, shapely
+, sphinxHook
+, sphinx-autodoc-typehints
+
+# tests
+, pproxy
+, pytest-asyncio
+, pytest-randomly
+, pytestCheckHook
+}:
+
+let
+  pname = "psycopg";
+  version = "3.0.16";
+in
+
+buildPythonPackage {
+  inherit pname version;
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "psycopg";
+    repo = pname;
+    rev = version;
+    hash = "sha256-jKhpmCcDi7FyMSpn51eSukFvmu3yacNovmRYG9jnu3g=";
+  };
+
+  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=";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./libpq.patch;
+      libpq = "${postgresql.lib}/lib/libpq${stdenv.hostPlatform.extensions.sharedLibrary}";
+    })
+  ];
+
+  # only move to sourceRoot after patching, makes patching easier
+  postPatch = ''
+    cd ${pname}
+  '';
+
+  nativeBuildInputs = [
+    furo
+    shapely
+    sphinxHook
+    sphinx-autodoc-typehints
+  ];
+
+  propagatedBuildInputs = lib.optionals (pythonOlder "3.11") [
+    typing-extensions
+  ] ++ lib.optionals (pythonOlder "3.9") [
+    backports-zoneinfo
+  ];
+
+  pythonImportsCheck = [
+    "psycopg"
+  ];
+
+  passthru.optional-dependencies = {
+    # TODO: package remaining variants
+    #c = [ psycopg-c ];
+    #pool = [ psycopg-pool ];
+  };
+
+  preCheck = ''
+    cd ..
+  '';
+
+  checkInputs = [
+    pproxy
+    pytest-asyncio
+    pytest-randomly
+    pytestCheckHook
+    postgresql
+  ];
+
+  disabledTests = [
+    # linters shouldn't be run in checks
+    "test_version"
+  ];
+
+  disabledTestPaths = [
+    # TODO: requires the pooled variant
+    "tests/pool/"
+    # Network access
+    "tests/test_dns.py"
+    "tests/test_dns_srv.py"
+    # Mypy typing test
+    "tests/test_typing.py"
+  ];
+
+  pytestFlagsArray = [
+    "-o cache_dir=$TMPDIR"
+  ];
+
+  postCheck = ''
+    cd ${pname}
+  '';
+
+  meta = with lib; {
+    changelog = "https://github.com/psycopg/psycopg/blob/master/docs/news.rst";
+    description = "PostgreSQL database adapter for Python";
+    homepage = "https://github.com/psycopg/psycopg";
+    license = licenses.lgpl3Plus;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/psycopg/libpq.patch b/nixpkgs/pkgs/development/python-modules/psycopg/libpq.patch
new file mode 100644
index 000000000000..51271c3021aa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/psycopg/libpq.patch
@@ -0,0 +1,22 @@
+diff --git a/psycopg/psycopg/pq/_pq_ctypes.py b/psycopg/psycopg/pq/_pq_ctypes.py
+index bf04d560..9e79fc3f 100644
+--- a/psycopg/psycopg/pq/_pq_ctypes.py
++++ b/psycopg/psycopg/pq/_pq_ctypes.py
+@@ -13,16 +13,7 @@ from typing import List, Optional, Tuple
+ 
+ from ..errors import NotSupportedError
+ 
+-if sys.platform == "win32":
+-    libname = ctypes.util.find_library("libpq.dll")
+-elif sys.platform == "darwin":
+-    libname = ctypes.util.find_library("libpq.dylib")
+-else:
+-    libname = ctypes.util.find_library("pq")
+-if not libname:
+-    raise ImportError("libpq library not found")
+-
+-pq = ctypes.cdll.LoadLibrary(libname)
++pq = ctypes.cdll.LoadLibrary("@libpq@")
+ 
+ # Get the libpq version to define what functions are available.
+ 
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..8ebba4b01788
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/psycopg2/default.nix
@@ -0,0 +1,50 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, pythonOlder
+, isPyPy
+, fetchPypi
+, postgresql
+, openssl
+, sphinxHook
+, sphinx-better-theme
+}:
+
+buildPythonPackage rec {
+  pname = "psycopg2";
+  version = "2.9.3";
+  outputs = [ "out" "doc" ];
+
+  # 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;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "8e841d1bf3434da985cc5ef13e6f75c8981ced601fd70cc6bf33351b91562981";
+  };
+
+  nativeBuildInputs = [
+    postgresql
+    sphinxHook
+    sphinx-better-theme
+  ];
+
+  buildInputs = lib.optionals stdenv.isDarwin [
+    openssl
+  ];
+
+  sphinxRoot = "doc/src";
+
+  # requires setting up a postgresql database
+  doCheck = false;
+
+  pythonImportsCheck = [ "psycopg2" ];
+
+  meta = with lib; {
+    description = "PostgreSQL database adapter for the Python programming language";
+    homepage = "https://www.psycopg.org";
+    license = with licenses; [ lgpl3 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..71c9017380ad
--- /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 ];
+  checkInputs = [ 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..00b3b9406617
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/psygnal/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, wheel
+, setuptools
+, setuptools-scm
+, pytestCheckHook
+, pytest-mypy-plugins
+, pytest-cov
+, pytest
+, mypy
+, typing-extensions
+}: buildPythonPackage rec
+{
+  pname = "psygnal";
+  version = "0.3.5";
+  src = fetchFromGitHub {
+    owner = "tlambert03";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-8X6d0KZ61Uy5B68zuxtaimwnDSldWsVrL19iROS4X78=";
+  };
+  buildInputs = [ setuptools-scm ];
+  propagatedBuildInputs = [ typing-extensions ];
+  checkInputs = [ pytestCheckHook pytest-cov pytest-mypy-plugins ];
+  doCheck = false;  # mypy checks are failing
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  meta = with lib; {
+    description = "Pure python implementation of Qt Signals";
+    homepage = "https://github.com/tlambert03/psygnal";
+    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..ae2ad58a1acb
--- /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";
+  };
+
+  checkInputs = [ 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..cfe65a24ece3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ptpython/default.nix
@@ -0,0 +1,38 @@
+{ lib, buildPythonPackage, pythonOlder, fetchPypi
+, appdirs
+, black
+, importlib-metadata
+, isPy3k
+, jedi
+, prompt-toolkit
+, pygments
+}:
+
+buildPythonPackage rec {
+  pname = "ptpython";
+  version = "3.0.20";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "eafd4ced27ca5dc370881d4358d1ab5041b32d88d31af8e3c24167fe4af64ed6";
+  };
+
+  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;
+
+  meta = with lib; {
+    description = "An advanced Python REPL";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ mlieberman85 ];
+    platforms = platforms.all;
+  };
+}
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..d969a679a1ae
--- /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";
+      sha256 = "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..67699b107ab5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/publicsuffix2/default.nix
@@ -0,0 +1,28 @@
+{ lib, buildPythonPackage, fetchFromGitHub }:
+
+buildPythonPackage rec {
+  pname = "publicsuffix2";
+  version = "2.2019-12-21";
+
+  src = fetchFromGitHub {
+    owner = "nexB";
+    repo = "python-publicsuffix2";
+    rev = "release-${version}";
+    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; [ SuperSandro2000 ];
+  };
+}
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..80db92ca6b2b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pubnub/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, cbor2
+, fetchFromGitHub
+, pycryptodomex
+, pytestCheckHook
+, pytest-vcr
+, pytest-asyncio
+, requests
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pubnub";
+  version = "6.5.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = "python";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-+x58aEvemav0Pz2jeICLFG36FTtZCu5dk/arb+j5nmo=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    cbor2
+    pycryptodomex
+    requests
+  ];
+
+  checkInputs = [
+    pytest-asyncio
+    pytest-vcr
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # Tests require network access
+    "tests/integrational"
+    "tests/manual"
+    "tests/functional/push"
+  ];
+
+  pythonImportsCheck = [
+    "pubnub"
+  ];
+
+  meta = with lib; {
+    description = "Python-based APIs for PubNub";
+    homepage = "https://github.com/pubnub/python";
+    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..c135b0b5ccf2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pudb/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, dataclasses
+, fetchPypi
+, jedi
+, pygments
+, urwid
+, urwid-readline
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pudb";
+  version = "2022.1.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-a4OrgFvdtTcQEJaQoiN+mL+DwLOgADPFF8319qj6Rw0=";
+  };
+
+  propagatedBuildInputs = [
+    jedi
+    pygments
+    urwid
+    urwid-readline
+  ] ++ lib.optionals (pythonOlder "3.7") [
+    dataclasses
+  ];
+
+  checkInputs = [
+    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";
+    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..65a179f59d6a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pulp/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, pyparsing
+, amply
+}:
+
+buildPythonPackage rec {
+  pname = "PuLP";
+  version = "2.6.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "4b4f7e1e954453e1b233720be23aea2f10ff068a835ac10c090a93d8e2eb2e8d";
+  };
+
+  propagatedBuildInputs = [ pyparsing amply ];
+
+  # only one test that requires an extra
+  doCheck = false;
+  pythonImportsCheck = [ "pulp" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/coin-or/pulp";
+    description = "PuLP is an LP modeler written in python";
+    maintainers = with maintainers; [ teto ];
+    license = licenses.mit;
+  };
+}
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..1990915eef44
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pulsectl/default.nix
@@ -0,0 +1,38 @@
+{ lib, buildPythonPackage, fetchPypi, libpulseaudio, glibc, substituteAll, stdenv, pulseaudio, python }:
+
+buildPythonPackage rec {
+  pname = "pulsectl";
+  version = "22.3.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-zBdOHO69TmIixbePT0FfEugHU8mrdas1QVm0y1lQsIQ=";
+  };
+
+  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"
+  ];
+
+  checkInputs = [ pulseaudio ];
+
+  checkPhase = ''
+    export HOME=$TMPDIR
+    ${python.interpreter} -m unittest discover
+  '';
+
+  meta = with lib; {
+    description = "Python high-level interface and ctypes-based bindings for PulseAudio (libpulse)";
+    homepage = "https://pypi.python.org/pypi/pulsectl/";
+    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..352f42a555f7
--- /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 = "5.10.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "pulumi";
+    repo = "pulumi-aws";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-eybcT7pdc0QED3HrHN+jnxZLXoExEZZUEHSoFmhlsHQ=";
+  };
+
+  sourceRoot = "${src.name}/sdk/python";
+
+  propagatedBuildInputs = [
+    parver
+    pulumi
+    semver
+  ];
+
+  # Checks require cloud resources
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pulumi_aws"
+  ];
+
+  meta = with lib; {
+    broken = (stdenv.isLinux && stdenv.isAarch64) || stdenv.isDarwin;
+    description = "Pulumi python amazon web services provider";
+    homepage = "https://github.com/pulumi/pulumi-aws";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ costrouc ];
+  };
+}
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..52a3cbcf91af
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pulumi/default.nix
@@ -0,0 +1,80 @@
+{ lib
+, buildPythonPackage
+, fetchpatch
+, fetchFromGitHub
+, protobuf
+, dill
+, grpcio
+, pulumi-bin
+, isPy27
+, semver
+, pyyaml
+, six
+
+
+# for tests
+, go
+, pulumictl
+, pylint
+, pytest
+, pytest-timeout
+, wheel
+, pytest-asyncio
+
+, mypy
+}:
+let
+  data = import ./data.nix {};
+in
+buildPythonPackage rec {
+  pname = "pulumi";
+  version = pulumi-bin.version;
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "pulumi";
+    repo = "pulumi";
+    rev = "v${pulumi-bin.version}";
+    sha256 = "sha256-vqEZEHTpJV65a3leWwYhyi3dzAsN67BXOvk5hnTPeuI=";
+  };
+
+  propagatedBuildInputs = [
+    semver
+    protobuf
+    dill
+    grpcio
+    pyyaml
+    six
+  ];
+
+  checkInputs = [
+    pulumi-bin
+    pulumictl
+    mypy
+    go
+    pytest
+    pytest-timeout
+    pytest-asyncio
+    wheel
+  ];
+
+  sourceRoot="source/sdk/python/lib";
+  # we apply the modifications done in the pulumi/sdk/python/Makefile
+  # but without the venv code
+  postPatch = ''
+    cp ../../README.md .
+    sed -i "s/\''${VERSION}/${version}/g" setup.py
+  '';
+
+  # disabled because tests try to fetch go packages from the net
+  doCheck = false;
+
+  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..29905d72cf27
--- /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 = "3.1.1";
+  disabled = pythonOlder "3.4";
+
+  # Archive on pypi has no tests.
+  src = fetchFromGitHub {
+    owner = "bbayles";
+    repo = "python-pure-cdb";
+    rev = "v${version}";
+    hash = "sha256-/FAe4NkY5unt83BOnJ3QqBJFQCPdQnbMVl1fSZ511Fc=";
+  };
+
+  checkInputs = [ 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..ba84c1db5fae
--- /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
+  ];
+
+  checkInputs = [
+    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-python-adb-homeassistant/default.nix b/nixpkgs/pkgs/development/python-modules/pure-python-adb-homeassistant/default.nix
new file mode 100644
index 000000000000..919ab61c60c1
--- /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;
+    sha256 = "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..512c38b730d3
--- /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
+
+  checkInputs = [
+    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..aac505dd8f39
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/puremagic/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "puremagic";
+  version = "1.14";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-PV3ybMfsmuu/hCoJEVovqF3FnqZBT6VoVyxEd115bLw=";
+  };
+
+  # test data not included on pypi
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "puremagic"
+  ];
+
+  meta = with lib; {
+    description = "Implementation of magic file detection";
+    homepage = "https://github.com/cdgriffith/puremagic";
+    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..3615935b88ec
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/purepng/default.nix
@@ -0,0 +1,48 @@
+{ 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
+  checkInputs = [ numpy ];
+  # checkPhase begins by deleting source dir to force test execution against installed version
+  checkPhase = ''
+    rm -r code/png
+    ${python.interpreter} code/test_png.py
+  '';
+
+  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..8c7b208df2fe
--- /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;
+    sha256 = "sha256-Jb3JRW/PtQ7NlO4eQ9DmTPu/sjvFTg2mztphoIF79gc=";
+  };
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  checkInputs = [
+    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..fe0582f0962e
--- /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";
+    sha256 = "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/default.nix b/nixpkgs/pkgs/development/python-modules/pushbullet/default.nix
new file mode 100644
index 000000000000..e697683b9b84
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pushbullet/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, requests
+, websocket-client
+, python-magic
+, cryptography
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pushbullet.py";
+  version = "0.12.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "917883e1af4a0c979ce46076b391e0243eb8fe0a81c086544bcfa10f53e5ae64";
+  };
+
+  propagatedBuildInputs = [ cryptography requests websocket-client python-magic ];
+
+  preCheck = ''
+    export PUSHBULLET_API_KEY=""
+  '';
+  checkInputs = [ 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..33769af319d6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pushover-complete/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, requests
+, six
+, tox
+, pytest
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pushover-complete";
+  version = "1.1.1";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    pname = "pushover_complete";
+    inherit version;
+    sha256 = "8a8f867e1f27762a28a0832c33c6003ca54ee04c935678d124b4c071f7cf5a1f";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    six
+  ];
+
+  checkInputs = [ pytest tox ];
+
+  # Fails also on their travis right now:
+  # - https://travis-ci.org/scolby33/pushover_complete/builds?utm_medium=notification&utm_source=github_status
+  doCheck = pythonOlder "3.7";
+
+  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/pushover/default.nix b/nixpkgs/pkgs/development/python-modules/pushover/default.nix
new file mode 100644
index 000000000000..bc8509b450bc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pushover/default.nix
@@ -0,0 +1,25 @@
+{ stdenv, lib, buildPythonPackage, fetchPypi
+, requests }:
+
+buildPythonPackage rec {
+  pname = "python-pushover";
+  version = "0.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "dee1b1344fb8a5874365fc9f886d9cbc7775536629999be54dfa60177cf80810";
+  };
+
+  propagatedBuildInputs = [ requests ];
+
+  # tests require network
+  doCheck = false;
+
+  meta = with lib; {
+    broken = (stdenv.isLinux && stdenv.isAarch64) || stdenv.isDarwin;
+    description = "Bindings and command line utility for the Pushover notification service";
+    homepage = "https://github.com/Thibauth/python-pushover";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ peterhoeg ];
+  };
+}
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..3a93b36cb2b7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pvlib/default.nix
@@ -0,0 +1,54 @@
+{ lib, buildPythonPackage, fetchPypi, fetchpatch, pythonOlder, numpy, pandas, pytz, six
+, pytestCheckHook, flaky, mock, pytest-mock, requests }:
+
+buildPythonPackage rec {
+  pname = "pvlib";
+  version = "0.7.2";
+
+  # Support for Python <3.5 dropped in 0.6.3 on June 1, 2019.
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi{
+    inherit pname version;
+    sha256 = "40708492ed0a41e900d36933b9b9ab7b575c72ebf3eee81293c626e301aa7ea1";
+  };
+
+  patches = [
+    # enable later pandas versions, remove next bump
+    (fetchpatch {
+      url = "https://github.com/pvlib/pvlib-python/commit/010a2adc9e9ef6fe9f2aea4c02d7e6ede9f96a53.patch";
+      sha256 = "0jibn4khixz6hv6racmp86m5mcms0ysz1y5bgpplw1kcvf8sn04x";
+      excludes = [
+        "pvlib/tests/test_inverter.py"
+        "docs/sphinx/source/whatsnew/v0.8.0.rst"
+        "ci/requirements-py35-min.yml"
+      ];
+    })
+  ];
+
+  checkInputs = [ pytestCheckHook flaky mock pytest-mock ];
+  propagatedBuildInputs = [ numpy pandas pytz six requests ];
+
+  # Skip a few tests that try to access some URLs
+  pytestFlagsArray = [ "pvlib/tests" ];
+  disabledTests = [
+    "read_srml_dt_index"
+    "read_srml_month_from_solardata"
+    "get_psm3"
+    "pvgis"
+    "read_surfrad_network"
+    "remote"
+    # small rounding errors, E.g <1e-10^5
+    "calcparams_pvsyst"
+    "martin_ruiz_diffuse"
+    "hsu"
+    "backtrack"
+  ];
+
+  meta = with lib; {
+    homepage = "https://pvlib-python.readthedocs.io";
+    description = "Simulate the performance of photovoltaic energy systems";
+    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..0b107f155060
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pvo/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, aiohttp
+, aresponses
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pydantic
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, yarl
+}:
+
+buildPythonPackage rec {
+  pname = "pvo";
+  version = "0.2.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "frenck";
+    repo = "python-pvoutput";
+    rev = "v${version}";
+    sha256 = "sha256-2/O81MnFYbdOrzLiTSoX7IW+3ZGyyE/tIqgKr/sEaHI=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    pydantic
+    yarl
+  ];
+
+  checkInputs = [
+    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 = [
+    "pvo"
+  ];
+
+  meta = with lib; {
+    description = "Python module to interact with the PVOutput API";
+    homepage = "https://github.com/frenck/python-pvoutput";
+    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..c9e2ff020f82
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pweave/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, mock
+, matplotlib
+, pkgs
+, nbconvert
+, markdown
+, isPy3k
+, ipykernel
+}:
+
+buildPythonPackage rec {
+  pname = "Pweave";
+  version = "0.30.3";
+
+  src = fetchPypi {
+    inherit pname 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..6a20a5d4bf27
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pwntools/default.nix
@@ -0,0 +1,91 @@
+{ lib
+, 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 {
+  version = "4.8.0";
+  pname = "pwntools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-QgUuLYg3EOTh2gQekWdabXGftOXvLdJFyyhT2hEmkpA=";
+  };
+
+  postPatch = ''
+    # Upstream has set an upper bound on unicorn because of https://github.com/Gallopsled/pwntools/issues/1538,
+    # but since that is a niche use case and it requires extra work to get unicorn 1.0.2rc3 to work we relax
+    # the bound here. Check if this is still necessary when updating!
+    sed -i 's/unicorn>=1.0.2rc1,<1.0.2rc4/unicorn>=1.0.2rc1/' setup.py
+
+    # 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 = ''
+    mkdir -p "$out/bin"
+    makeWrapper "${debugger}/bin/${debuggerName}" "$out/bin/pwntools-gdb"
+  '';
+
+  meta = with lib; {
+    homepage = "http://pwntools.com";
+    description = "CTF framework and exploit development library";
+    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..efa9e81b8de9
--- /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 ];
+  checkInputs = [ 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..d3150b453a63
--- /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
+  ];
+
+  checkInputs = [
+    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-canary/default.nix b/nixpkgs/pkgs/development/python-modules/py-canary/default.nix
new file mode 100644
index 000000000000..68a33ae11173
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py-canary/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, mock
+, pytestCheckHook
+, pythonOlder
+, requests
+, requests-mock
+}:
+
+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=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  checkInputs = [
+    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..86c2e80601f6
--- /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}";
+    sha256 = "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
+  ];
+
+  checkInputs = [
+    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..12b9668f1edd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py-cpuinfo/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, buildPythonPackage
+, pytestCheckHook
+, sysctl
+}:
+
+buildPythonPackage rec {
+  pname = "py-cpuinfo";
+  version = "8.0.0";
+
+  src = fetchFromGitHub {
+     owner = "workhorsy";
+     repo = pname;
+     rev = "v${version}";
+     sha256 = "sha256-Mgzj1HTasUNHeHMVwV6d+TeyVqnBNUwCJ1EC3kfovf8=";
+  };
+
+  checkInputs = [
+    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; [ costrouc ];
+  };
+}
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..ff921789bbfd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py-deprecate/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, scikit-learn
+, pytorch
+}:
+
+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=";
+  };
+
+  checkInputs = [
+    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..0c700151f694
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py-desmume/default.nix
@@ -0,0 +1,33 @@
+{ lib, buildPythonPackage, fetchFromGitHub, GitPython
+, libpcap, meson, ninja, pillow, pkg-config, pygobject3, SDL2
+, alsa-lib, soundtouch, openal
+}:
+
+buildPythonPackage rec {
+  pname = "py-desmume";
+  version = "0.0.4.post2";
+
+  src = fetchFromGitHub {
+    owner = "SkyTemple";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-a819+K/Ovnz53ViDKpUGGjeblWvrAO5ozt/tizdLKCY=";
+    fetchSubmodules = true;
+  };
+
+  buildInputs = [ GitPython libpcap SDL2 alsa-lib soundtouch openal ];
+  nativeBuildInputs = [ meson ninja pkg-config ];
+  propagatedBuildInputs = [ pillow pygobject3 ];
+
+  hardeningDisable = [ "format" ];
+
+  doCheck = false; # there are no tests
+  pythonImportsCheck = [ "desmume" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/SkyTemple/py-desmume";
+    description = "Python library to interface with DeSmuME, the Nintendo DS emulator";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ 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..e74a8d7ac297
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py-dmidecode/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchPypi, dmidecode }:
+
+buildPythonPackage rec {
+  pname = "py-dmidecode";
+  version = "0.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1bv1vmhj8h520kj6slwpz16xfmgp117yjjkfyihkl5ix6mn5zkpa";
+  };
+
+  propagatedBuildInputs = [ dmidecode ];
+
+  # Project has no tests.
+  doCheck = false;
+  pythonImportsCheck = [ "dmidecode" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/zaibon/py-dmidecode/";
+    description = "Python library that parses the output of dmidecode";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ davidtwco ];
+    platforms = platforms.linux;
+  };
+}
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..8060ab45cae1
--- /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}";
+    sha256 = "sha256-638otYA3e/Ld4mcM69yrqHQnGoK/Sfl/UA9FWnjgO/U=";
+  };
+
+  propagatedBuildInputs = [
+    cached-property
+    eth-typing
+    eth-utils
+    mypy-extensions
+  ];
+
+  checkInputs = [
+    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; [ SuperSandro2000 ];
+  };
+}
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..1dfc8904fe00
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py-eth-sig-utils/default.nix
@@ -0,0 +1,41 @@
+{ 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}";
+    sha256 = "sha256-PNvEHH5w2ptntRGzqWrqlbIzJJsT60OXg/Dh5f6Wq9k=";
+  };
+
+  propagatedBuildInputs = [
+    eth-abi
+    py-ecc
+    pycryptodome
+    rlp
+  ];
+
+  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; [ SuperSandro2000 ];
+  };
+}
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..08630928f23b
--- /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 = [ maintainers.costrouc ];
+  };
+
+}
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..24fa6975cc5e
--- /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}";
+    sha256 = "sha256-cGM7iYQPP+UOkbTxRhzuED0pkcydFCO8vpx9wTc0/HI=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py --replace "'pytest-runner'," ""
+  '';
+
+  propagatedBuildInputs = [
+    varint
+    base58
+    netaddr
+    idna
+    py-cid
+    py-multicodec
+  ];
+
+  checkInputs = [
+    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..87cfd6b8e427
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py-multibase/default.nix
@@ -0,0 +1,46 @@
+{ buildPythonPackage
+, fetchPypi
+, isPy27
+, lib
+, morphys
+, pytest
+, pytest-runner
+, python-baseconv
+, six
+}:
+buildPythonPackage rec {
+  pname = "py-multibase";
+  version = "1.0.3";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version ;
+    sha256 = "d28a20efcbb61eec28f55827a0bf329c7cea80fffd933aecaea6ae8431267fe4";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.cfg --replace "[pytest]" ""
+    substituteInPlace setup.cfg --replace "python_classes = *TestCase" ""
+  '';
+
+  nativeBuildInputs = [
+    pytest-runner
+  ];
+
+  propagatedBuildInputs = [
+    morphys
+    six
+    python-baseconv
+  ];
+
+  checkInputs = [
+    pytest
+  ];
+
+  meta = with lib; {
+    description = "Multibase is a protocol for distinguishing base encodings and other simple string encodings";
+    homepage = "https://github.com/multiformats/py-multibase";
+    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..c41da62cf4c5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py-multicodec/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-runner
+, pytestCheckHook
+, pythonOlder
+, morphys
+, six
+, varint
+}:
+
+buildPythonPackage rec {
+  pname = "py-multicodec";
+  version = "0.2.1";
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "multiformats";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "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]"
+  '';
+
+  nativeBuildInputs = [
+    pytest-runner
+  ];
+
+  propagatedBuildInputs = [
+    varint
+    six
+    morphys
+  ];
+
+  checkInputs = [
+    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..73307c75b8b8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py-multihash/default.nix
@@ -0,0 +1,48 @@
+{ base58
+, buildPythonPackage
+, fetchFromGitHub
+, lib
+, morphys
+, pytest-runner
+, pytestCheckHook
+, pythonOlder
+, six
+, varint
+}:
+
+buildPythonPackage rec {
+  pname = "py-multihash";
+  version = "2.0.1";
+  disabled = pythonOlder "3.4";
+
+  src = fetchFromGitHub {
+    owner = "multiformats";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-z1lmSypGCMFWJNzNgV9hx/IStyXbpd5jvrptFpewuOA=";
+  };
+
+  nativeBuildInputs = [
+    pytest-runner
+  ];
+
+  propagatedBuildInputs = [
+    base58
+    morphys
+    six
+    varint
+  ];
+
+  checkInputs = [
+    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..3b6d24d6168d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py-nextbusnext/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "py-nextbusnext";
+  version = "0.1.5";
+
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "ViViDboarder";
+    repo = "py_nextbus";
+    rev = "v${version}";
+    hash = "sha256-uUHA8v5iTISmPaTgk0RvcLLRM34f3JXUjZClKGXdMoI=";
+  };
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "py_nextbus" ];
+
+  meta = {
+    description = "Minimalistic Python client for the NextBus public API";
+    homepage = "https://github.com/ViViDboarder/py_nextbus";
+    license = lib.licenses.mit;
+    maintainers = with lib.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..b98fa7b13397
--- /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
+  ];
+
+  checkInputs = [
+    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-radix/default.nix b/nixpkgs/pkgs/development/python-modules/py-radix/default.nix
new file mode 100644
index 000000000000..f4b064d41aac
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py-radix/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, pythonAtLeast
+, fetchFromGitHub
+, coverage
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "py-radix";
+  version = "0.10.0";
+
+  disabled = pythonAtLeast "3.10"; # abandoned, remove when we move to py310/py311
+
+  src = fetchFromGitHub {
+    owner = "mjschultz";
+    repo = "py-radix";
+    rev = "v${version}";
+    sha256 = "01xyn9lg6laavnzczf5bck1l1c2718ihxx0hvdkclnnxjqhbrqis";
+  };
+
+  doCheck = true;
+  checkInputs = [ coverage nose ];
+
+  meta = with lib; {
+    description = "Python radix tree for IPv4 and IPv6 prefix matching";
+    homepage = "https://github.com/mjschultz/py-radix";
+    license = with licenses; [ isc bsdOriginal ];
+    maintainers = with maintainers; [ mkg ];
+  };
+}
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..dce8157da566
--- /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 = "0.7.9";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1677b7287914567b5123de90ad872b441628d8a7777cf4a5f41671b813facf75";
+  };
+
+  # 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-synologydsm-api/default.nix b/nixpkgs/pkgs/development/python-modules/py-synologydsm-api/default.nix
new file mode 100644
index 000000000000..0ebd218aa9cc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py-synologydsm-api/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytestCheckHook
+, requests
+, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "py-synologydsm-api";
+  version = "1.0.8";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "mib1185";
+    repo = "synologydsm-api";
+    rev = "v${version}";
+    sha256 = "sha256-9bh7uLt9+uda6yFCWV6xUh//jFC4DgiS+KtRXQrU3A8=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    requests
+    urllib3
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "synology_dsm"
+  ];
+
+  meta = with lib; {
+    description = "Python API for Synology DSM";
+    homepage = "https://github.com/hacf-fr/synologydsm-api";
+    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..633dc6fa5f4a
--- /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
+  ];
+
+  checkInputs = [
+    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..9d7b82986976
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py-tree-sitter/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub }:
+
+buildPythonPackage rec {
+  pname = "py-tree-sitter";
+  version = "unstable-2022-02-08";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "tree-sitter";
+    repo = "py-tree-sitter";
+    rev = "9c8261d36e55d9e4a6543dc9e570bfd7911ed7bf";
+    sha256 = "sha256-YDe9m85LIPNumo9mrhMMotUspq/8B3t5kt2ScMJI+hY=";
+    fetchSubmodules = true;
+  };
+
+  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..4efa2b8b6fdb
--- /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";
+  };
+
+  checkInputs = [
+    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..69dde8ca38ed
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py-vapid/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildPythonPackage, fetchPypi
+, flake8, mock, nose, pytest
+, cryptography
+}:
+
+buildPythonPackage rec {
+  pname = "py-vapid";
+  version = "1.8.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "874f21910f2103c56228cded941d6e733dd8f1eb12876137919533bfacb65a48";
+  };
+
+  propagatedBuildInputs = [ cryptography ];
+
+  checkInputs = [ flake8 mock nose pytest ];
+
+  meta = with lib; {
+    description = "VAPID is a voluntary standard for WebPush subscription providers";
+    homepage = "https://github.com/mozilla-services/vapid";
+    license = licenses.mpl20;
+  };
+}
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..410068f45237
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py-zabbix/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, 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 = version;
+    sha256 = "aPQc188pszfDQvNtsGYlRLHS5CG5VyqptSoe4/GJVvE=";
+  };
+
+  checkInputs = [
+    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..b39d50dbfc7a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py17track/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, aiohttp
+, aresponses
+, async-timeout
+, attrs
+, buildPythonPackage
+, fetchFromGitHub
+, 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;
+    sha256 = "sha256-T0Jjdu6QC8rTqZwe4cdsBbs0hQXUY6CkrImCgYwWL9o=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    async-timeout
+    attrs
+    pytz
+  ];
+
+  checkInputs = [
+    aresponses
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'attrs = ">=19.3,<21.0"' 'attrs = ">=19.3,<22.0"' \
+      --replace 'async-timeout = "^3.0.1"' 'async-timeout = ">=3.0.1,<5.0.0"'
+  '';
+
+  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..a7003945526e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py3exiv2/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, stdenv
+, boost
+, buildPythonPackage
+, exiv2
+, fetchPypi
+, libcxx
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "py3exiv2";
+  version = "0.11.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-ZgDaa4lxmdTaZhkblgRfPMxfVwENp2s6xdKSuD/MqEQ=";
+  };
+
+  buildInputs = [
+    boost
+    exiv2
+  ];
+
+  # Work around Python distutils compiling C++ with $CC (see issue #26709)
+  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/py3rijndael/default.nix b/nixpkgs/pkgs/development/python-modules/py3rijndael/default.nix
new file mode 100644
index 000000000000..be098df6a6a8
--- /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=";
+  };
+
+  checkInputs = [
+    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..626de02595e3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py3status/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, requests
+, pytz
+, tzlocal
+, i3ipc
+, pydbus
+, pygobject3
+, pyserial
+, setuptools
+, dbus-python
+
+, file
+, acpi
+, coreutils
+, alsa-utils
+, i3
+, procps
+, lm_sensors
+, libnotify
+, xorg
+}:
+
+buildPythonPackage rec {
+  pname = "py3status";
+  version = "3.45";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-ksZM2PaeYhluq4nyw6MTFjSb/fQNJha7BRc8/U/7zwg=";
+  };
+
+  doCheck = false;
+  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
+  '';
+
+  meta = with lib; {
+    description = "Extensible i3status wrapper";
+    license = licenses.bsd3;
+    homepage = "https://github.com/ultrabug/py3status";
+    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..dac1ecb9ec1f
--- /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.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-J2pKPFohVN8YYO8zA6knRg4C6XsEfcCkfBw/uMzjTbY=";
+  };
+
+  # 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/pyGithub/default.nix b/nixpkgs/pkgs/development/python-modules/pyGithub/default.nix
new file mode 100644
index 000000000000..02656968d682
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyGithub/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, cryptography
+, deprecated
+, fetchFromGitHub
+, pynacl
+, pyjwt
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "PyGithub";
+  version = "1.55";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "PyGithub";
+    repo = "PyGithub";
+    rev = "v${version}";
+    sha256 = "sha256-PuGCBFSbM91NtSzuyf0EQUr3LiuHDq90OwkSf53rSyA=";
+  };
+
+  propagatedBuildInputs = [
+    cryptography
+    deprecated
+    pynacl
+    pyjwt
+    requests
+  ];
+
+  # 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";
+    platforms = platforms.all;
+    license = licenses.lgpl3Plus;
+    maintainers = with maintainers; [ jhhuh ];
+  };
+}
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..5c43fb756ce8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pySmartDL/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+}:
+
+buildPythonPackage rec {
+  pname = "pySmartDL";
+  version = "1.3.4";
+  src = fetchFromGitHub ({
+    owner = "iTaybb";
+    repo = pname;
+    rev = "b93df794e1e60017c42d9520ac097b6fd38c2e8b";
+    sha256 = "sha256-Etyv3xCB1cGozWDsskygwcTHJfC+V5hvqBNQAF8SIMM=";
+  });
+
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/iTaybb/pySmartDL";
+    description = "A Smart Download Manager for Python";
+    license = licenses.unlicense;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ WeebSorceress ];
+  };
+}
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..0474ed4e67cf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyTelegramBotAPI/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, aiohttp
+, requests
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyTelegramBotAPI";
+  version = "4.6.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-sa6kw8hnWGt++qgNVNs7cQ9LJK64CVv871aP8n08pRA=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    requests
+  ];
+
+  pythonImportsCheck = [
+    "telebot"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/eternnoir/pyTelegramBotAPI";
+    description = "A simple, but extensible Python implementation for the Telegram Bot API";
+    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..acfab6791a2e
--- /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;
+    sha256 = "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/py_stringmatching/default.nix b/nixpkgs/pkgs/development/python-modules/py_stringmatching/default.nix
new file mode 100644
index 000000000000..79d09daba9cc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py_stringmatching/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, numpy
+, six
+, nose
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "py_stringmatching";
+  version = "0.4.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c87f62698fba1612a18f8f44bd57f0c4e70aac2d7ca6dfb6ed46dabd2194453c";
+  };
+
+  checkInputs = [ nose ];
+
+  propagatedBuildInputs = [ numpy six ];
+
+  meta = with lib; {
+    description = "A Python string matching library including string tokenizers and string similarity measures";
+    homepage =  "https://sites.google.com/site/anhaidgroup/projects/magellan/py_stringmatching";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ixxie ];
+  };
+}
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..6e1bb63f0f60
--- /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.2.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c279d9c30a7f481f1420fc37db65833b5f9816cd364dc2acaa93a11c482d4141";
+  };
+
+  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..a22e85154261
--- /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;
+    sha256 = "sha256-eNouFJQDgp56fgkA7wZKfosKWOKU6OvXRjFwjCMvZqI=";
+  };
+
+  buildInputs = [
+    adslib
+  ];
+
+  patchPhase = ''
+    substituteInPlace pyads/pyads_ex.py \
+      --replace "ctypes.CDLL(adslib)" "ctypes.CDLL(\"${adslib}/lib/adslib.so\")"
+  '';
+
+  checkInputs = [
+    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..c0b941e849d1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyaftership/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, aiohttp
+, aresponses
+, pytest-asyncio
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pyaftership";
+  version = "21.11.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "ludeeus";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-SN7fvI/+VHYn2eYQe5wp6lEZ73YeZbsiPjDiq/Ibk3Q=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  checkInputs = [
+    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";
+    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..fd2c6de2c25c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyahocorasick/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyahocorasick";
+  version = "2.0.0b1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "WojciechMula";
+    repo = pname;
+    rev = version;
+    hash = "sha256-APpL99kOwzIQjePvRDeJ0FDm1kjBi6083JMKuBqtaRk=";
+  };
+
+  checkInputs = [
+    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";
+    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..51497e8875b7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyairnow/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, aiohttp
+, aioresponses
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-aiohttp
+, poetry
+, pytest-asyncio
+, pytest-cov
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pyairnow";
+  version = "1.1.0";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "asymworks";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1hkpfl8rdwyzqrr1drqlmcw3xpv3pi1jf19h1divspbzwarqxs1c";
+  };
+
+  nativeBuildInputs = [ poetry ];
+
+  propagatedBuildInputs = [ aiohttp ];
+
+  checkInputs = [
+    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";
+    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..3721bf1d8099
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyairvisual/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, aiohttp
+, aresponses
+, asynctest
+, buildPythonPackage
+, fetchFromGitHub
+, numpy
+, poetry-core
+, pysmb
+, pytest-aiohttp
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyairvisual";
+  version = "2022.07.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "bachya";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-UzcKK0LJ/Xp5iVWsrDQ3nfhWgKAAxKmXrK1zPSoG/gY=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    numpy
+    pysmb
+  ];
+
+  checkInputs = [
+    aresponses
+    asynctest
+    pytest-aiohttp
+    pytest-asyncio
+    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/pyalmond/default.nix b/nixpkgs/pkgs/development/python-modules/pyalmond/default.nix
new file mode 100644
index 000000000000..59a9339c2649
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyalmond/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyalmond";
+  version = "0.0.3";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "stanford-oval";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0d1w83lr7k2wxcs846iz4mjyqn1ximnw6155kgl515v10fqyrhgk";
+  };
+
+  propagatedBuildInputs = [ aiohttp ];
+
+  # Tests require a running Almond instance
+  doCheck = false;
+  pythonImportsCheck = [ "pyalmond" ];
+
+  meta = with lib; {
+    description = "Python client for the Almond API";
+    homepage = "https://github.com/stanford-oval/pyalmond";
+    license = with licenses; [ bsd3 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..09a113a42185
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyamg/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, numpy
+, scipy
+, pytest
+, pybind11
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "pyamg";
+  version = "4.2.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-N608Hcr/JDXCq3yOw2lCrwcmxWPTUFm80Y6wdHP3GC4=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    scipy
+    pytest
+    pybind11
+  ];
+
+  # failed with "ModuleNotFoundError: No module named 'pyamg.amg_core.evolution_strength'"
+  doCheck = false;
+  # taken from https://aur.archlinux.org/cgit/aur.git/tree/PKGBUILD?h=python-pyamg#n27
+  # checkPhase = ''
+  #   PYTHONPATH="$PWD/build/lib.linux-*:$PYTHONPATH" ${python3.interpreter} -c "import pyamg; pyamg.test()"
+  # '';
+
+  pythonImportsCheck = [
+    "pyamg"
+    "pyamg.amg_core.evolution_strength"
+  ];
+
+  meta = with lib; {
+    description = "Algebraic Multigrid Solvers in Python";
+    homepage = "https://github.com/pyamg/pyamg";
+    license = licenses.mit;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..cbab9bacfb81
--- /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 = "21.10.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c6519fee13bf06e3bb3f20cacdea8eba9140385a7c2546df5dbae4887f768383";
+  };
+
+  propagatedBuildInputs = [
+    pyyaml
+  ];
+
+  checkInputs = [
+    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..50edda1a7ef2
--- /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
+  ];
+
+  checkInputs = [
+    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; [ costrouc ];
+  };
+}
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..76fe9bc0a108
--- /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
+  ];
+
+  checkInputs = [
+    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..0150e0cc9b85
--- /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 = "4.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-3DX02V3Srpx6hqimWbesxfkDqslVH4+8uXY7XYDmjX0=";
+  };
+
+  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..bdd907176f99
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyarrow/default.nix
@@ -0,0 +1,147 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, python
+, pythonOlder
+, arrow-cpp
+, cffi
+, cloudpickle
+, cmake
+, cython
+, fsspec
+, hypothesis
+, numpy
+, pandas
+, pytestCheckHook
+, pytest-lazy-fixture
+, pkg-config
+, scipy
+, setuptools-scm
+, six
+}:
+
+let
+  zero_or_one = cond: if cond then 1 else 0;
+
+  _arrow-cpp = arrow-cpp.override { python3 = python; };
+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
+  ];
+
+  propagatedBuildInputs = [
+    cffi
+    cloudpickle
+    fsspec
+    numpy
+    scipy
+    six
+  ];
+
+  checkInputs = [
+    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_PLASMA = zero_or_one (!stdenv.isDarwin);
+  PYARROW_WITH_S3 = zero_or_one _arrow-cpp.enableS3;
+
+  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
+  '';
+
+  pytestFlagsArray = [
+    # 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"
+  ] ++ 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"
+  ];
+
+  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"
+  ] ++ lib.optionals (!stdenv.isDarwin) [
+    "plasma"
+  ]);
+
+  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..3054af1b4e09
--- /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.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-6UK1SRY2Pse4tw6urs0OtOQe8bz0ojl7KabXFfzN+SU=";
+  };
+
+  datasrc = fetchFromGitHub {
+    owner = "hadiasghari";
+    repo = "pyasn";
+    rev = "${version}";
+    sha256 = "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..4bb515e17aa6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyasn1-modules/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pyasn1
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "pyasn1-modules";
+  version = "0.2.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "905f84c712230b2c592c19470d3ca8d552de726050d1d1716282a1f6146be65e";
+  };
+
+  propagatedBuildInputs = [ pyasn1 ];
+
+  checkInputs = [
+    pytest
+  ];
+
+  # running tests through setup.py fails only for python2 for some reason:
+  # AttributeError: 'module' object has no attribute 'suitetests'
+  checkPhase = ''
+    py.test
+  '';
+
+  meta = with lib; {
+    description = "A collection of ASN.1-based protocols modules";
+    homepage = "https://pypi.python.org/pypi/pyasn1-modules";
+    license = licenses.bsd3;
+    platforms = platforms.unix;  # same as pyasn1
+  };
+}
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..a3dbc7396b0d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyasn1/default.nix
@@ -0,0 +1,20 @@
+{ lib, buildPythonPackage, fetchPypi, }:
+
+buildPythonPackage rec {
+  pname = "pyasn1";
+  version = "0.4.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba";
+  };
+
+  pythonImportsCheck = [ "pyasn1" ];
+
+  meta = with lib; {
+    description = "Generic ASN.1 library for Python";
+    homepage = "https://github.com/etingof/pyasn1";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..a06d2a05fb40
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyatag/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, isPy27
+, fetchFromGitHub
+, aiohttp
+}:
+
+buildPythonPackage rec {
+  pname = "pyatag";
+  version = "3.5.1";
+
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "MatsNl";
+    repo = "pyatag";
+    rev = version;
+    sha256 = "17x2m7icbby1y2zfc79jpbir2kvyqlrkix9pvvxanm658arsh8c7";
+  };
+
+  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";
+    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..15b43db0e5b4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyathena/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, boto3
+, botocore
+, buildPythonPackage
+, fetchPypi
+, pandas
+, pythonOlder
+, tenacity
+}:
+
+buildPythonPackage rec {
+  pname = "pyathena";
+  version = "2.14.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "PyAthena";
+    inherit version;
+    hash = "sha256-1DeqvlHlOt781nObnPdgZo3JqjwcK8lSREXqUNoKhhU=";
+  };
+
+  propagatedBuildInputs = [
+    boto3
+    botocore
+    pandas
+    tenacity
+  ];
+
+  # 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/";
+    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..25d61641f207
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyatmo/default.nix
@@ -0,0 +1,68 @@
+{ 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.0.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "jabesq";
+    repo = "pyatmo";
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-WrpRLAfViudC0n7AG5es2CM8XbZ0yJqXCY9yod9czb0=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    oauthlib
+    requests
+    requests-oauthlib
+  ];
+
+  checkInputs = [
+    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";
+    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..7db5b4fb15eb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyatome/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, requests
+, simplejson
+, fake-useragent
+}:
+
+buildPythonPackage rec {
+  pname = "pyatome";
+  version = "0.1.1";
+
+  src = fetchPypi {
+    pname = "pyAtome";
+    inherit version;
+    sha256 = "7282e7ec258c69d4ddf2a5754ff07680a1ac92f9bfb478d601fd9e944fccd834";
+  };
+
+  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..d32a4a1ca3a1
--- /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.38.2";
+  format = "other";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
+    sha256 = "DnCJwLYwlhS1NiCDazRi1/kShOQ2/kkpuhYZqEHPEYU=";
+  };
+
+  nativeBuildInputs = [ pkg-config ];
+
+  buildInputs = [
+    at-spi2-core
+    pygobject3
+  ];
+
+  configureFlags = [
+    "PYTHON=${python.pythonForBuild.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..644c346e4b0c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyatv/default.nix
@@ -0,0 +1,89 @@
+{ lib
+, buildPythonPackage
+, aiohttp
+, bitarray
+, chacha20poly1305-reuseable
+, cryptography
+, deepdiff
+, fetchFromGitHub
+, mediafile
+, miniaudio
+, netifaces
+, protobuf
+, pytest-aiohttp
+, pytest-asyncio
+, pytest-timeout
+, pytestCheckHook
+, pythonOlder
+, requests
+, srptools
+, zeroconf
+}:
+
+buildPythonPackage rec {
+  pname = "pyatv";
+  version = "0.10.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "postlund";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-ng5KfW93p2/N2a6lnGbRJC6aWOQgTl0imBLdUIUlDic=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "pytest-runner" ""
+    # Remove all version pinning
+
+    substituteInPlace base_versions.txt \
+      --replace "protobuf==3.19.1,<4" "protobuf>=3.19.0,<4"
+  '';
+
+  propagatedBuildInputs = [
+    aiohttp
+    bitarray
+    chacha20poly1305-reuseable
+    cryptography
+    mediafile
+    miniaudio
+    netifaces
+    protobuf
+    requests
+    srptools
+    zeroconf
+  ];
+
+  checkInputs = [
+    deepdiff
+    pytest-aiohttp
+    pytest-asyncio
+    pytest-timeout
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "--asyncio-mode=legacy"
+  ];
+
+  disabledTestPaths = [
+    # Test doesn't work in the sandbox
+    "tests/protocols/companion/test_companion_auth.py"
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  pythonImportsCheck = [
+    "pyatv"
+  ];
+
+  meta = with lib; {
+    description = "Python client library for the Apple TV";
+    homepage = "https://github.com/postlund/pyatv";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
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..82f2b685d268
--- /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.12";
+  disabled = isPyPy;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-Vd3123K8U3u6X128o6ufAiLuW4Qr2oOXjqsLe49g+54=";
+  };
+
+  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..86d2f59e9424
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyaussiebb/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, loguru
+, pydantic
+, poetry-core
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "pyaussiebb";
+  version = "0.0.15";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "yaleman";
+    repo = "aussiebb";
+    rev = "v${version}";
+    hash = "sha256-V9yN05Bkv5vkHgXZ77ps3d6JS39M5iMuiijOGRBFi0U=";
+  };
+
+  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";
+    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..a7b35bc5710e
--- /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";
+    sha256 = "sha256-R9tcTqxUaqw63FLOGFRaO/Oz6kD7V6MPHdQ8A29NdXw=";
+  };
+
+  checkInputs = [ 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..c5127be1a877
--- /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;
+    sha256 = "sha256-gV78ypvYwohHmdjP3lN5F97PfmxuV91tvw5gsYeZ7i8=";
+  };
+
+  propagatedBuildInputs = [
+    astropy-helpers
+  ];
+
+  checkInputs = [
+    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..12c4851e3470
--- /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}";
+    sha256 = "sha256-NtAsO/I1jDEv676yhAgLguQnB/kHdAqPoLt2QFWbvmw=";
+  };
+
+  propagatedBuildInputs = [ asn1crypto click lxml ];
+
+  checkInputs = [ 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; [ SuperSandro2000 ];
+  };
+}
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..3c290b843941
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pybalboa/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pybalboa";
+  version = "0.13";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "garbled1";
+    repo = pname;
+    rev = version;
+    sha256 = "0aw5jxpsvzyx05y1mg8d63lxx1i607yb6x19n9jil5wfis95m8pd";
+  };
+
+  # 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";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..d4b67f2bb21e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pybase64/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pybase64";
+  version = "1.2.2";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-vv2YOlp7ZVE1W2q+VnI/f58SxYDgLxJreIOwdb6/8lw=";
+  };
+
+  checkInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "pybase64" ];
+
+  meta = with lib; {
+    description = "Fast Base64 encoding/decoding";
+    homepage = "https://github.com/mayeut/pybase64";
+    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..bddb9fb52200
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pybids/default.nix
@@ -0,0 +1,49 @@
+{ buildPythonPackage
+, lib
+, fetchPypi
+, click
+, num2words
+, numpy
+, scipy
+, pandas
+, nibabel
+, patsy
+, bids-validator
+, sqlalchemy
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  version = "0.15.1";
+  pname = "pybids";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-AlNQegTb/qQ+sfdaH3GqsEviEHa/6WwASIgAC4AuOPI=";
+  };
+
+  propagatedBuildInputs = [
+    click
+    num2words
+    numpy
+    scipy
+    pandas
+    nibabel
+    patsy
+    bids-validator
+    sqlalchemy
+  ];
+
+  checkInputs = [ pytestCheckHook ];
+  pythonImportsCheck = [ "bids" ];
+
+  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 ];
+    # Doesn't support sqlalchemy >=1.4
+    # See https://github.com/bids-standard/pybids/issues/680
+    broken = true;
+  };
+}
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..cb1764b23b04
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pybigwig/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+, numpy
+, zlib
+}:
+
+buildPythonPackage rec {
+  pname = "pyBigWig";
+  version = "0.3.18";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "4c2a8c571b4100ad7c4c318c142eb48558646be52aaab28215a70426f5be31bc";
+  };
+
+  buildInputs = [ zlib ];
+
+  checkInputs = [ numpy pytest ];
+
+  meta = with lib; {
+    homepage = "https://github.com/deeptools/pyBigWig";
+    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.
+    '';
+    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..9333055ccdc3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pybind11/default.nix
@@ -0,0 +1,79 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchFromGitHub
+, cmake
+, boost
+, eigen
+, python
+, catch
+, numpy
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pybind11";
+  version = "2.9.2";
+
+  src = fetchFromGitHub {
+    owner = "pybind";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-O3bkexUBa+gfiJEM6KSR8y/iVqHqlCFmz/9EghxdIpw=";
+  };
+
+  nativeBuildInputs = [ cmake ];
+
+  dontUseCmakeBuildDir = true;
+
+  cmakeFlags = [
+    "-DBoost_INCLUDE_DIR=${lib.getDev boost}/include"
+    "-DEIGEN3_INCLUDE_DIR=${lib.getDev eigen}/include/eigen3"
+    "-DBUILD_TESTING=on"
+  ] ++ lib.optionals (python.isPy3k && !stdenv.cc.isClang) [
+    "-DPYBIND11_CXX_STANDARD=-std=c++17"
+  ];
+
+  postBuild = ''
+    # build tests
+    make -j $NIX_BUILD_CORES -l $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
+  '';
+
+  checkInputs = [
+    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"
+  ];
+
+  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/pybindgen/default.nix b/nixpkgs/pkgs/development/python-modules/pybindgen/default.nix
new file mode 100644
index 000000000000..ab18b4886bda
--- /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
+  ];
+
+  checkInputs = [
+    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..fd8f46a968fe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyblackbird/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pyserial
+, pyserial-asyncio
+}:
+
+buildPythonPackage rec {
+  pname = "pyblackbird";
+  version = "0.5";
+
+  src = fetchFromGitHub {
+    owner = "koolsb";
+    repo = pname;
+    rev = version;
+    sha256 = "0m1yd1cb3z8011x7nicxpf091bdcwghcphn0l21c65f71rabzg6s";
+  };
+
+  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";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyblake2/default.nix b/nixpkgs/pkgs/development/python-modules/pyblake2/default.nix
new file mode 100644
index 000000000000..a0f62cf0e77f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyblake2/default.nix
@@ -0,0 +1,23 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "pyblake2";
+  version = "1.1.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5ccc7eb02edb82fafb8adbb90746af71460fbc29aa0f822526fc976dff83e93f";
+  };
+
+  # requires setting up sphinx doctest
+  doCheck = false;
+
+  meta = {
+    description = "BLAKE2 hash function extension module";
+    license = lib.licenses.publicDomain;
+    homepage = "https://github.com/dchest/pyblake2";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyblock/default.nix b/nixpkgs/pkgs/development/python-modules/pyblock/default.nix
new file mode 100644
index 000000000000..0e94764e4a22
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyblock/default.nix
@@ -0,0 +1,37 @@
+{ lib, stdenv
+, python
+, pkgs
+, isPy3k
+}:
+
+stdenv.mkDerivation rec {
+  pname = "pyblock";
+  version = "0.53";
+  md5_path = "f6d33a8362dee358517d0a9e2ebdd044";
+
+  src = pkgs.fetchurl {
+    url = "https://src.fedoraproject.org/repo/pkgs/python-pyblock/"
+        + "${pname}-${version}.tar.bz2/${md5_path}/${pname}-${version}.tar.bz2";
+    sha256 = "f6cef88969300a6564498557eeea1d8da58acceae238077852ff261a2cb1d815";
+  };
+
+  postPatch = ''
+    sed -i -e 's|/usr/include/python|${python}/include/python|' \
+           -e 's/-Werror *//' -e 's|/usr/|'"$out"'/|' Makefile
+  '';
+
+  buildInputs = [ python pkgs.lvm2 pkgs.dmraid ];
+
+  makeFlags = [
+    "USESELINUX=0"
+    "SITELIB=$(out)/${python.sitePackages}"
+  ];
+
+  meta = with lib; {
+    homepage = "https://www.centos.org/docs/5/html/5.4/Technical_Notes/python-pyblock.html";
+    description = "Interface for working with block devices";
+    license = licenses.gpl2Plus;
+    broken = isPy3k; # doesn't build on python 3, 2018-04-11
+  };
+
+}
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..394ea6e3fb0d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pybotvac/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, requests
+, requests-oauthlib
+, voluptuous
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pybotvac";
+  version = "0.0.23";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-VLT+VlwQAAxU1WRNCB4t4fhQ2u+6w5zqdM6mSbR7+xI=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    requests-oauthlib
+    voluptuous
+  ];
+
+  # 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";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
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..391be3c17bd4
--- /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 ];
+
+  checkInputs = [ 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..1bffde00e8e8
--- /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.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Q6o1O21Jj9WsMPAHOpjjMtBh00/mGdPVDRdh+P1KoBY=";
+  };
+
+  buildInputs = [
+    docutils
+    pybtex
+  ];
+
+  checkInputs = [
+    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..c93cc59d9138
--- /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;
+    sha256 = "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..d58dd9b333c2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycairo/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, pythonOlder
+, fetchFromGitHub
+, meson
+, ninja
+, buildPythonPackage
+, pytestCheckHook
+, pkg-config
+, cairo
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "pycairo";
+  version = "1.21.0";
+
+  disabled = pythonOlder "3.6";
+
+  format = "other";
+
+  src = fetchFromGitHub {
+    owner = "pygobject";
+    repo = "pycairo";
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-cwkGN5O15DduCLkFWeh8DPO4lY64iIlCQaUsCBKB8Mw=";
+  };
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    pkg-config
+  ];
+
+  buildInputs = [
+    cairo
+  ];
+
+  checkInputs = [
+    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.pythonForBuild.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..24c73a152d76
--- /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";
+    sha256 = "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..cd2e8f450cd2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycapnp/default.nix
@@ -0,0 +1,37 @@
+{ 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; [ cstrahan lukeadams ];
+    license = licenses.bsd2;
+  };
+}
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..a0a0ff76337b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycaption/default.nix
@@ -0,0 +1,41 @@
+{ lib, fetchpatch
+, buildPythonPackage, fetchPypi, isPy3k
+, beautifulsoup4, lxml, cssutils, future, enum34, six
+}:
+
+buildPythonPackage rec {
+  pname = "pycaption";
+  version = "1.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0f2hx9ky65c4niws3x5yx59yi8mqqrw9b2cghd220g4hj9yl800h";
+  };
+
+  disabled = !isPy3k;
+
+  prePatch = ''
+    substituteInPlace setup.py \
+      --replace 'beautifulsoup4>=4.2.1,<4.5.0' \
+                'beautifulsoup4>=4.2.1,<5'
+  '';
+
+  # don't require enum34 on python >= 3.4
+  patches = [
+    (fetchpatch {
+        url = "https://github.com/pbs/pycaption/pull/161.patch";
+        sha256 = "0p58awpsqx1qc3x9zfl1gd85h1nk7204lzn4kglsgh1bka0j237j";
+    })
+  ];
+
+  propagatedBuildInputs = [ beautifulsoup4 lxml cssutils future enum34 six ];
+
+  # Tests not included in pypi (?)
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Closed caption converter";
+    homepage = "https://github.com/pbs/pycaption";
+    license = with licenses; [ asl20 ];
+  };
+}
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..c8e8fdb7b3d9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycares/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, c-ares
+, cffi
+, fetchPypi
+, idna
+}:
+
+buildPythonPackage rec {
+  pname = "pycares";
+  version = "4.2.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-c1tPdf0PWVxOkYTaGM2Hc39GvIGmTqQfTtzitraNRtI=";
+  };
+
+  buildInputs = [
+    c-ares
+  ];
+
+  propagatedBuildInputs = [
+    cffi
+    idna
+  ];
+
+  propagatedNativeBuildInputs = [
+    cffi
+  ];
+
+  # Requires network access
+  doCheck = false;
+
+  pythonImportsCheck = [ "pycares" ];
+
+  meta = with lib; {
+    description = "Python interface for c-ares";
+    homepage = "https://github.com/saghul/pycares";
+    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..e404475e93ba
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycarwings2/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, iso8601
+, requests
+, pycryptodome
+}:
+
+buildPythonPackage rec {
+  pname = "pycarwings2";
+  version = "2.13";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "filcole";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "04k1la7wix6sp668nqpwdhd3057b2bzcz7h2b9a57cxlifl8pjxf";
+  };
+
+  propagatedBuildInputs = [
+    pyyaml
+    iso8601
+    requests
+    pycryptodome
+  ];
+
+  checkInputs = [
+    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";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..ec902e0b385d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycategories/default.nix
@@ -0,0 +1,35 @@
+{ buildPythonPackage
+, callPackage
+, pytest-cov
+, fetchPypi
+, lib
+, pytest
+, pythonOlder
+, pytest-runner
+}:
+
+buildPythonPackage rec {
+  pname = "pycategories";
+  version = "1.2.0";
+  disabled = pythonOlder "3.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "bd70ecb5e94e7659e564ea153f0c7673291dc37c526c246800fc08d6c5378099";
+  };
+
+  nativeBuildInputs = [ pytest-runner ];
+
+  # Is private because the author states it's unmaintained
+  # and shouldn't be used in production code
+  propagatedBuildInputs = [ (callPackage ./infix.nix { }) ];
+
+  checkInputs = [ pytest pytest-cov ];
+
+  meta = with lib; {
+    homepage = "https://gitlab.com/danielhones/pycategories";
+    description = "Implementation of some concepts from category theory";
+    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/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..640cc6b36561
--- /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}";
+    sha256 = "sha256-H18petSiUdftZN8Q3fPmfSJA3OZks+gI+FAq9LwkRsk=";
+  };
+
+  propagatedBuildInputs = [
+    libcec
+  ];
+
+  checkInputs = [
+    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..91722ee89bca
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycep-parser/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, assertpy
+, buildPythonPackage
+, fetchFromGitHub
+, lark
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+, regex
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "pycep-parser";
+  version = "0.3.8";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "gruebel";
+    repo = "pycep";
+    rev = "refs/tags/${version}";
+    hash = "sha256-y6npvFh6/QykOAKK8ihTHDcv5dFd4lLU64UXPIhBELA=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    lark
+    regex
+    typing-extensions
+  ];
+
+  checkInputs = [
+    assertpy
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'regex = "^2022.3.15"' 'regex = "*"'
+  '';
+
+  pythonImportsCheck = [
+    "pycep"
+  ];
+
+  meta = with lib; {
+    description = "Python based Bicep parser";
+    homepage = "https://github.com/gruebel/pycep";
+    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..7a4ae1cf7fa4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycfdns/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, aiohttp
+, async-timeout
+, buildPythonPackage
+, fetchFromGitHub
+}:
+
+buildPythonPackage rec {
+  pname = "pycfdns";
+  version = "1.2.2";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "ludeeus";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-bsalfZEkZrBG0/SyEXCWOZyrhOYU/3YJR/78FQTpXYk=";
+  };
+
+  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";
+    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..a6d991becbbc
--- /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.20.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Skyscanner";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-syEE03lcOt6tTD88+BJ8nHCkamKn+BX/rZU9TOsxATc=";
+  };
+
+  propagatedBuildInputs = [
+    pydantic
+  ];
+
+  checkInputs = [
+    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..8923e5c9c69e
--- /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;
+    sha256 = "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/pychef/default.nix b/nixpkgs/pkgs/development/python-modules/pychef/default.nix
new file mode 100644
index 000000000000..ddd7dec820db
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pychef/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, six
+, requests
+, mock
+, unittest2
+}:
+
+buildPythonPackage rec {
+  pname    = "PyChef";
+  version = "0.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0zdz8lw545cd3a34cpib7mdwnad83gr2mrrxyj3v74h4zhwabhmg";
+  };
+
+  propagatedBuildInputs = [ six requests mock unittest2 ];
+
+  # FIXME
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/coderanger/pychef";
+    description = "Python implementation of a Chef API client";
+    license = licenses.bsd0;
+  };
+
+}
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..9dce1cfa7938
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pychromecast/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, casttube
+, fetchPypi
+, isPy3k
+, protobuf
+, requests
+, zeroconf
+}:
+
+buildPythonPackage rec {
+  pname = "pychromecast";
+  version = "12.1.4";
+  format = "setuptools";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    pname = "PyChromecast";
+    inherit version;
+    sha256 = "sha256-nlfcmFpKBdtb3NXaIZy/bO0lVIygk/jXS8EHs8VU7AA=";
+  };
+
+  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";
+    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..7f5703585c43
--- /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}";
+    sha256 = "sha256-jWHjnebg4Aar48gid7bB7XYXOQtSqbmVmASsZd0YoPc=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    pytz
+  ];
+
+  checkInputs = [
+    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..6a344365b25b
--- /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.6.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "spyoungtech";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-NCWmCp4VGwwvubqN8FUUJ0kcZbXjOEyB6+BfGky1Kj4=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace docs/README.md README.md
+  '';
+
+  checkInputs = [
+    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 = with lib; {
+    broken = stdenv.isDarwin;
+    description = "Cross-platform clipboard utilities supporting both binary and text data";
+    homepage = "https://github.com/spyoungtech/pyclip";
+    license = licenses.asl20;
+    maintainers = with 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..9216f0d5b893
--- /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.post3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "fonttools";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-viBnmzbCAH9QaVHwUq43rm11e8o3N/jtGsGpmRZokaw=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+    cython
+  ];
+
+  checkInputs = [
+    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..549cc8a96ad2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycm/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, matplotlib
+, numpy
+, pytestCheckHook
+, pythonOlder
+, seaborn
+}:
+
+buildPythonPackage rec {
+  pname = "pycm";
+  version = "3.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "sepandhaghighi";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-iDt1voNcn59bZN/AyKrWFBIymTT618o91kz2AV42hWs=";
+  };
+
+  propagatedBuildInputs = [
+    matplotlib
+    numpy
+    seaborn
+  ];
+
+  checkInputs = [
+    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()' '=[]'
+  '';
+
+  disabledTests = [
+    # Output formatting error
+    "pycm.pycm_compare.Compare"
+    "plot_test"
+  ];
+
+  pythonImportsCheck = [
+    "pycm"
+  ];
+
+  meta = with lib; {
+    description = "Multiclass confusion matrix library";
+    homepage = "https://pycm.ir";
+    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..348bca8d49e7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycmarkgfm/default.nix
@@ -0,0 +1,34 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27, cffi, pytest }:
+
+buildPythonPackage rec {
+  pname = "pycmarkgfm";
+  version = "1.1.0";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "694cb242f4961437c30b5b015dfbce9d1a1fa48305c2e39f902ce7c65b4cbe0e";
+  };
+
+  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
+  checkInputs = [ 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";
+    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..13757c9f0088
--- /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.4";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "2ab586aa389b9657b6d73c2b9a827a3681f8d00f36490c2e8ab05902e3fd9e93";
+  };
+
+  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..9904353bfccd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycodestyle/default.nix
@@ -0,0 +1,39 @@
+{ buildPythonPackage
+, pythonOlder
+, fetchPypi
+, lib
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "pycodestyle";
+  version = "2.9.1";
+
+  disabled = pythonOlder "3.6";
+
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "2c9607871d58c76354b697b42f5d57e1ada7d261c261efac224b664affdc5785";
+  };
+
+  # https://github.com/PyCQA/pycodestyle/blob/2.9.1/tox.ini#L13
+  checkPhase = ''
+    ${python.interpreter} -m pycodestyle --statistics pycodestyle.py
+    ${python.interpreter} -m pycodestyle --max-doc-length=72 --testsuite testsuite
+    ${python.interpreter} -m pycodestyle --max-doc-length=72 --doctest
+    ${python.interpreter} -m unittest discover testsuite -vv
+  '';
+
+  pythonImportsCheck = [ "pycodestyle" ];
+
+  meta = with lib; {
+    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..f0399d751cae
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycognito/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, boto3
+, buildPythonPackage
+, envs
+, fetchFromGitHub
+, isPy27
+, freezegun
+, mock
+, moto
+, pytestCheckHook
+, python-jose
+, requests
+, requests-mock
+}:
+
+buildPythonPackage rec {
+  pname = "pycognito";
+  version = "2022.05.0";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "pvizeli";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-KPZcfTFZCPV/3tQHOGA99uAyYPkvusCwZrefKwEMAOo=";
+  };
+
+  propagatedBuildInputs = [
+    boto3
+    envs
+    python-jose
+    requests
+  ];
+
+  checkInputs = [
+    freezegun
+    mock
+    moto
+    pytestCheckHook
+    requests-mock
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace 'python-jose[cryptography]' 'python-jose'
+  '';
+
+  pytestFlagsArray = [ "tests.py" ];
+
+  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..f20a971aa24d
--- /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.20220529";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-PQOWR1teLZ2npQV+q3K+DgiFBejkRoB4gQYjaHLFQqI=";
+  };
+
+  propagatedBuildInputs = [ setuptools ];
+
+  postPatch = ''
+    substituteInPlace ./pycoin/cmds/tx.py --replace '"gpg"' '"${gnupg}/bin/gpg"'
+  '';
+
+  checkInputs = [ 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..06daa9194610
--- /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 = "BSD"; # they don't specify which BSD variant
+    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..0c35dc4d5bac
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycomfoconnect/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, protobuf
+}:
+
+buildPythonPackage rec {
+  pname = "pycomfoconnect";
+  version = "0.4";
+
+  src = fetchFromGitHub {
+    owner = "michaelarnauts";
+    repo = "comfoconnect";
+    rev = version;
+    sha256 = "0bipzv68yw056iz9m2g9h40hzrwd058a7crxp0xbq4rw2d8j0jn6";
+  };
+
+  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";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..b960b4b7da6d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycontrol4/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, aiohttp
+, xmltodict
+}:
+
+buildPythonPackage rec {
+  pname = "pycontrol4";
+  version = "0.3.1";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "lawtancool";
+    repo = "pyControl4";
+    rev = "v${version}";
+    sha256 = "068iiyi17ndv6cv124r5dzvififblbi2zw7jgnzb5xi0q093czkj";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    xmltodict
+  ];
+
+  # 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/pycoolmasternet-async/default.nix b/nixpkgs/pkgs/development/python-modules/pycoolmasternet-async/default.nix
new file mode 100644
index 000000000000..909feb944328
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycoolmasternet-async/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+}:
+
+buildPythonPackage rec {
+  pname = "pycoolmasternet-async";
+  version = "0.1.3";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "OnFreund";
+    repo = "pycoolmasternet-async";
+    rev = "v${version}";
+    hash = "sha256-1Xd8OdN8d3g23kQZqihZrNLKoqLCbu5BvAMNitg8aDA=";
+  };
+
+  # 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/pycountry/default.nix b/nixpkgs/pkgs/development/python-modules/pycountry/default.nix
new file mode 100644
index 000000000000..3583826f69a3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycountry/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pycountry";
+  version = "22.3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-shY6JGxYWJTYCPGHg+GRN8twoMGPs2dI3AH8bxCcFkY=";
+  };
+
+  checkInputs = [
+    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..c8283f93c512
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycparser/default.nix
@@ -0,0 +1,22 @@
+{ lib, buildPythonPackage, fetchPypi, python }:
+
+buildPythonPackage rec {
+  pname = "pycparser";
+  version = "2.21";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206";
+  };
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest discover -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..e02a69933f69
--- /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;
+    sha256 = "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..7155ee95723e
--- /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";
+  };
+
+  checkInputs = [ 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..29ef48bde165
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycryptodome/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, callPackage
+, fetchFromGitHub
+, cffi
+, gmp
+}:
+
+let
+  test-vectors = callPackage ./vectors.nix { };
+in
+buildPythonPackage rec {
+  pname = "pycryptodome";
+  version = "3.15.0";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "Legrandin";
+    repo = "pycryptodome";
+    rev = "v${version}";
+    hash = "sha256-SPRoAfwP1MFlVzZsVWmXDWUY5Yje7eg7d+9zJhZNXrw=";
+  };
+
+  postPatch = ''
+    substituteInPlace lib/Crypto/Math/_IntegerGMP.py \
+      --replace 'load_lib("gmp"' 'load_lib("${gmp}/lib/libgmp.so.10"'
+  '';
+
+  checkInputs = [
+    test-vectors
+  ];
+
+  pythonImportsCheck = [
+    "Crypto"
+  ];
+
+  meta = with lib; {
+    description = "Self-contained cryptographic library";
+    homepage = "https://github.com/Legrandin/pycryptodome";
+    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..f6a2b715ad91
--- /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.8";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-3BTh7as4CikvVfUx2xBZlUOaq/dAQNNFHpuRxWg/5N0=";
+    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..14958299c31b
--- /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;
+    sha256 = "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..4538410c3623
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyct/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, param
+, pytestCheckHook
+, pyyaml
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "pyct";
+  version = "0.4.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "23d7525b5a1567535c093aea4b9c33809415aa5f018dd77f6eb738b1226df6f7";
+  };
+
+  propagatedBuildInputs = [
+    param
+    pyyaml
+    requests
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  doCheck = !isPy27;
+
+  pythonImportsCheck = [
+    "pyct"
+  ];
+
+  meta = with lib; {
+    description = "ClI for Python common tasks for users";
+    homepage = "https://github.com/pyviz/pyct";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ costrouc ];
+  };
+}
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..3817342be3ed
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyctr/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildPythonPackage, fetchPypi, pythonOlder
+, pycryptodomex }:
+
+buildPythonPackage rec {
+  pname = "pyctr";
+  version = "0.6.0";
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-05lMcsIeJIHI3LwHQTjr4M+bn1FG+GQscuGq34XxjK8=";
+  };
+
+  propagatedBuildInputs = [ pycryptodomex ];
+
+  pythonImportsCheck = [ "pyctr" ];
+
+  meta = with lib; {
+    description = "Python library to interact with Nintendo 3DS files";
+    license = licenses.mit;
+    maintainers = with maintainers; [ rileyinman ];
+    homepage = "https://github.com/ihaveamac/pyctr";
+  };
+}
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..c0ea080396bd
--- /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 = "2022.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-rNkDDZPnbmCxIuM60WvPAbsTRPTDBN7f8c0r/7DzE6M=";
+  };
+
+  preConfigure = with lib.versions; ''
+    ${python.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..789d9d4cb8ea
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycups/default.nix
@@ -0,0 +1,22 @@
+{ stdenv, lib, buildPythonPackage, fetchurl, cups, libiconv }:
+
+buildPythonPackage rec {
+  pname = "pycups";
+  version = "1.9.73";
+
+  src = fetchurl {
+    url = "http://cyberelk.net/tim/data/pycups/pycups-${version}.tar.bz2";
+    sha256 = "c381be011889ca6f728598578c89c8ac9f7ab1e95b614474df9f2fa831ae5335";
+  };
+
+  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..4b0e215f22c1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycurl/default.nix
@@ -0,0 +1,83 @@
+{ lib
+, buildPythonPackage
+, isPyPy
+, fetchPypi
+, fetchpatch
+, pythonOlder
+, curl
+, openssl
+, bottle
+, pytestCheckHook
+, flaky
+}:
+
+buildPythonPackage rec {
+  pname = "pycurl";
+  version = "7.45.1";
+  disabled = isPyPy || (pythonOlder "3.5"); # https://github.com/pycurl/pycurl/issues/208
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-qGOtGP9Hj1VFkkBXiHza5CLhsnRuQWdGFfaHSY6luIo=";
+  };
+
+  patches = [
+    # Pull upstream patch for curl-3.83:
+    #  https://github.com/pycurl/pycurl/pull/753
+    (fetchpatch {
+      name = "curl-3.83.patch";
+      url = "https://github.com/pycurl/pycurl/commit/d47c68b1364f8a1a45ab8c584c291d44b762f7b1.patch";
+      sha256 = "sha256-/lGq7O7ZyytzBAxWJPigcWdvypM7OHLBcp9ItmX7z1g=";
+    })
+  ];
+
+  preConfigure = ''
+    substituteInPlace setup.py --replace '--static-libs' '--libs'
+    export PYCURL_SSL_LIBRARY=openssl
+  '';
+
+  buildInputs = [
+    curl
+    openssl
+  ];
+
+  nativeBuildInputs = [
+    curl
+  ];
+
+  checkInputs = [
+    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"
+  ];
+
+  meta = with lib; {
+    homepage = "http://pycurl.io/";
+    description = "Python Interface To The cURL library";
+    license = with licenses; [ lgpl2Only mit ];
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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/pydaikin/default.nix b/nixpkgs/pkgs/development/python-modules/pydaikin/default.nix
new file mode 100644
index 000000000000..adbb0d21a8c3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydaikin/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromBitbucket
+, freezegun
+, netifaces
+, pytest-aiohttp
+, pytestCheckHook
+, pythonOlder
+, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "pydaikin";
+  version = "2.7.0";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromBitbucket {
+    owner = "mustang51";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-k6NAQvt79Qo7sAXQwOjq4Coz2iTZAUImasc/oMSpmmg=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    netifaces
+    urllib3
+  ];
+
+  # while they have tests, they do not run them in their CI and they fail as of 2.7.0
+  # AttributeError: 'DaikinBRP069' object has no attribute 'last_hour_cool_energy_consumption'
+  doCheck = false;
+
+  checkInputs = [
+    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..1134422e6e60
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydal/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "pydal";
+  version = "20220807.1";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-pIdDovZmKzqOB/4FKnivHQ5/YKuyj1Kq+30ZkHn33Wc=";
+  };
+
+  postPatch = ''
+    # this test has issues with an import statement
+    # rm tests/tags.py
+    sed -i '/from .tags import/d' tests/__init__.py
+
+    # this assertion errors without obvious reason
+    sed -i '/self.assertEqual(csv0, str(r4))/d' tests/caching.py
+
+    # some sql tests fail against sqlite engine
+    sed -i '/from .sql import/d' tests/__init__.py
+  '';
+
+  pythonImportsCheck = [ "pydal" ];
+
+  checkPhase = ''
+    runHook preCheck
+    ${python.interpreter} -m unittest tests
+    runHook postCheck
+  '';
+
+  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..d492923f07ab
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydanfossair/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+}:
+
+buildPythonPackage rec {
+  pname = "pydanfossair";
+  version = "0.1.0";
+
+  src = fetchFromGitHub {
+    owner = "JonasPed";
+    repo = "pydanfoss-air";
+    rev = "v${version}";
+    sha256 = "0950skga7x930whdn9f765x7fi8g6rr3zh99zpzaj8avjdwf096b";
+  };
+
+  # 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/default.nix b/nixpkgs/pkgs/development/python-modules/pydantic/default.nix
new file mode 100644
index 000000000000..f9993850f1df
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydantic/default.nix
@@ -0,0 +1,105 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, cython
+, devtools
+, email-validator
+, fetchFromGitHub
+, pytest-mock
+, pytestCheckHook
+, python-dotenv
+, pythonOlder
+, 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)
+, ansi2html
+, markdown-include
+, mkdocs
+, mkdocs-exclude
+, mkdocs-material
+, mdx-truly-sane-lists
+, sqlalchemy
+, ujson
+, orjson
+, hypothesis
+}:
+
+buildPythonPackage rec {
+  pname = "pydantic";
+  version = "1.9.1";
+
+  outputs = [
+    "out"
+  ] ++ lib.optionals withDocs [
+    "doc"
+  ];
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "samuelcolvin";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-jqTtNJQ9lRkxDYGG4vg91qH1jrxRU9orEeUofO+bBpA=";
+  };
+
+  postPatch = ''
+    sed -i '/flake8/ d' Makefile
+  '';
+
+  nativeBuildInputs = [
+    cython
+  ] ++ lib.optionals withDocs [
+    # dependencies for building documentation
+    ansi2html
+    markdown-include
+    mdx-truly-sane-lists
+    mkdocs
+    mkdocs-exclude
+    mkdocs-material
+    sqlalchemy
+    ujson
+    orjson
+    hypothesis
+  ];
+
+  propagatedBuildInputs = [
+    devtools
+    email-validator
+    python-dotenv
+    typing-extensions
+  ];
+
+  checkInputs = [
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  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; {
+    homepage = "https://github.com/samuelcolvin/pydantic";
+    description = "Data validation and settings management using Python type hinting";
+    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..08e7fe72acf4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydash/default.nix
@@ -0,0 +1,49 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchFromGitHub
+, invoke
+, mock
+, pytestCheckHook
+, pythonOlder
+, sphinx-rtd-theme
+}:
+
+buildPythonPackage rec {
+  pname = "pydash";
+  version = "5.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "dgilland";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-BAyiSnILvujUOFOAkiXSgyozs2Q809pYihHwa+6BHcQ=";
+  };
+
+  checkInputs = [
+    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; {
+    broken = stdenv.isDarwin;
+    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-sphinx-theme/default.nix b/nixpkgs/pkgs/development/python-modules/pydata-sphinx-theme/default.nix
new file mode 100644
index 000000000000..4305b8aa67c1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydata-sphinx-theme/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, sphinx
+, beautifulsoup4
+, docutils
+, packaging
+}:
+
+buildPythonPackage rec {
+  pname = "pydata-sphinx-theme";
+  version = "0.9.0";
+
+  format = "wheel";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit version format;
+    dist = "py3";
+    python = "py3";
+    pname = "pydata_sphinx_theme";
+    sha256 = "sha256-sitEKm1kN+Xq8KHwVxaf/LMeqp8Qvn1UgaEl5zXHHBI=";
+  };
+
+  propagatedBuildInputs = [
+    sphinx
+    beautifulsoup4
+    docutils
+    packaging
+  ];
+
+  pythonImportsCheck = [ "pydata_sphinx_theme" ];
+
+  meta = with lib; {
+    description = "Bootstrap-based Sphinx theme from the PyData community";
+    homepage = "https://github.com/pydata/pydata-sphinx-theme";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ marsam ];
+  };
+}
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..f9a3e7f5ccb6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydbus/default.nix
@@ -0,0 +1,22 @@
+{ lib, buildPythonPackage, fetchPypi, pygobject3 }:
+
+buildPythonPackage rec {
+  pname = "pydbus";
+  version = "0.6.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0b0gipvz7vcfa9ddmwq2jrx16d4apb0hdnl5q4i3h8jlzwp1c1s2";
+  };
+
+  propagatedBuildInputs = [ pygobject3 ];
+
+  pythonImportsCheck = [ "pydbus" ];
+
+  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..9ca7638538a5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydeck/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, ipykernel
+, ipywidgets
+, pythonOlder
+, pytestCheckHook
+, pandas
+, jinja2
+, numpy
+, traitlets
+}:
+
+buildPythonPackage rec {
+  pname = "pydeck";
+  version = "0.7.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  patches = [
+    # fixes build with latest setuptools
+    (fetchpatch {
+      url = "https://github.com/visgl/deck.gl/commit/9e68f73b28aa3bf0f2a887a4d8ccd2dc35677039.patch";
+      sha256 = "sha256-YVVoVbVdY5nV+17OwYIs9AwKGyzgKZHi655f4BLcdMU=";
+      stripLen = 2;
+    })
+  ];
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "907601c99f7510e16d27d7cb62bfa145216d166a2b5c9c50cfe2b65b032ebd2e";
+  };
+
+  pythonImportsCheck = [ "pydeck" ];
+
+  checkInputs = [ pytestCheckHook pandas ];
+
+  # tries to start a jupyter server
+  disabledTests = [ "test_nbconvert" ];
+
+  propagatedBuildInputs = [
+    ipykernel
+    ipywidgets
+    jinja2
+    numpy
+    traitlets
+  ];
+
+  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..45d69f53b3f7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydeconz/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, aiohttp
+, aioresponses
+, async-timeout
+, buildPythonPackage
+, fetchFromGitHub
+, orjson
+, pytest-aiohttp
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pydeconz";
+  version = "103";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "Kane610";
+    repo = "deconz";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-nxM9airO1/CF4g9CeyV2WMxh22fBtu0fjz1R3X1zm+o=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    async-timeout
+    orjson
+  ];
+
+  checkInputs = [
+    aioresponses
+    pytest-aiohttp
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pydeconz"
+  ];
+
+  meta = with lib; {
+    description = "Python library wrapping the Deconz REST API";
+    homepage = "https://github.com/Kane610/deconz";
+    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..151a0c5a9669
--- /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.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c5b6565c50d4f97d28baca9faf487281c2a5db635060b69f659e27c28a1a6e93";
+  };
+
+  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..3325155b947d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydeps/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, graphviz
+, stdlib-list
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+}:
+
+buildPythonPackage rec {
+  pname = "pydeps";
+  version = "1.10.22";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "thebjorn";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-PA+TpPAuzyAQSlD08ZgmZAKgVEGoIUw/zq4QdTmU8HE=";
+  };
+
+  buildInputs = [
+    graphviz
+  ];
+
+  propagatedBuildInputs = [
+    graphviz
+    stdlib-list
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    pyyaml
+  ];
+
+  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";
+    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..212a245b328c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydevccu/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pydevccu";
+  version = "0.1.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "danielperna84";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-rbxYTpB6ieZBYbbE1AKVEc/lapWlOUMOrSHCkuwkzLg=";
+  };
+
+  # 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";
+    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..11ada4189d20
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydevd/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, pytestCheckHook
+, untangle
+, psutil
+, trio
+, numpy
+}:
+
+buildPythonPackage rec {
+  pname = "pydevd";
+  version = "2.8.0";
+
+  src = fetchFromGitHub {
+    owner = "fabioz";
+    repo = "PyDev.Debugger";
+    rev = "pydev_debugger_${lib.replaceStrings ["."] ["_"] version}";
+    sha256 = "sha256-+yRngN10654trB09ZZa8QQsTPdM7VxVj7r6jh7OcgAA=";
+  };
+
+  checkInputs = [
+    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"
+  ];
+
+  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/pydexcom/default.nix b/nixpkgs/pkgs/development/python-modules/pydexcom/default.nix
new file mode 100644
index 000000000000..f79cfc9493dd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydexcom/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "pydexcom";
+  version = "0.2.3";
+
+  src = fetchFromGitHub {
+    owner = "gagebenne";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-ItDGnUUUTwCz4ZJtFVlMYjjoBPn2h8QZgLzgnV2T/Qk=";
+  };
+
+  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";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..9310d0cf5553
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydicom/default.nix
@@ -0,0 +1,79 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+, numpy
+, pillow
+, setuptools
+}:
+
+let
+  pname = "pydicom";
+  version = "2.3.0";
+
+  src = fetchFromGitHub {
+    owner = "pydicom";
+    repo = "pydicom";
+    rev = "v${version}";
+    hash = "sha256-CAQWaBkzecJ1VXQ5BnAUjmBMjh0I8y+gT7I4P4o2gqI=";
+  };
+
+  # 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 = "bbb723879690bb77e077a6d57657930998e92bd5";
+    hash = "sha256-dCI1temvpNWiWJYVfQZKy/YJ4ad5B0e9hEKHJnEeqzk=";
+  };
+
+in
+buildPythonPackage {
+  inherit pname version src;
+  disabled = pythonOlder "3.6";
+
+  format = "setuptools";
+
+  propagatedBuildInputs = [
+    numpy
+    pillow
+    setuptools
+  ];
+
+  checkInputs = [
+    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/pydigiham/default.nix b/nixpkgs/pkgs/development/python-modules/pydigiham/default.nix
new file mode 100644
index 000000000000..da8056e8a2e0
--- /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;
+    sha256 = "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/pydispatcher/default.nix b/nixpkgs/pkgs/development/python-modules/pydispatcher/default.nix
new file mode 100644
index 000000000000..d949b16d1057
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydispatcher/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+}:
+
+buildPythonPackage rec {
+  version = "2.0.5";
+  pname = "pydispatcher";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1bswbmhlbqdxlgbxlb6xrlm4k253sg8nvpl1whgsys8p3fg0cw2m";
+  };
+
+  checkInputs = [ pytest ];
+
+  checkPhase = ''
+    py.test
+  '';
+
+  meta = with lib; {
+    homepage = "http://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..beb6ef710bbd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydmd/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, future
+, matplotlib
+, numpy
+, pytestCheckHook
+, pythonOlder
+, scipy
+, ezyrb
+}:
+
+buildPythonPackage rec {
+  pname = "pydmd";
+  version = "0.4.0.post2207";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "mathLab";
+    repo = "PyDMD";
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-IiHNn8BXOl+eQdxwTrF8PQhDlsMOTj87ugpQ09kDTO4=";
+  };
+
+  propagatedBuildInputs = [
+    future
+    matplotlib
+    numpy
+    scipy
+    ezyrb
+  ];
+
+  checkInputs = [
+    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/";
+    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..0658e1857174
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydocstyle/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, isPy3k
+, fetchFromGitHub
+, snowballstemmer
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pydocstyle";
+  version = "6.1.1";
+  disabled = !isPy3k;
+
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "PyCQA";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-j0WMD2qKDdMaKG2FxrrM/O7zX4waJ1afaRPRv70djkE=";
+  };
+
+  propagatedBuildInputs = [
+    snowballstemmer
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    "src/tests/test_integration.py" # runs pip install
+  ];
+
+  meta = with lib; {
+    description = "Python docstring style checker";
+    homepage = "https://github.com/PyCQA/pydocstyle";
+    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..8dccfbc2610d
--- /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
+  ];
+
+  checkInputs = [
+    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/pydrive2/default.nix b/nixpkgs/pkgs/development/python-modules/pydrive2/default.nix
new file mode 100644
index 000000000000..6ebdc3d6cc57
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydrive2/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, google-api-python-client
+, oauth2client
+, pyopenssl
+, pyyaml
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "pydrive2";
+  version = "1.14.0";
+
+  src = fetchPypi {
+    pname = "PyDrive2";
+    inherit version;
+    sha256 = "sha256-212jvmcWMPVxynEAsoHYtdcv0His1CUkem0pLis9KEA=";
+  };
+
+  propagatedBuildInputs = [
+    google-api-python-client
+    oauth2client
+    pyopenssl
+    pyyaml
+    six
+  ];
+
+  doCheck = false;
+
+  pythonImportsCheck = [ "pydrive2" ];
+
+  meta = {
+    description = "Google Drive API Python wrapper library. Maintained fork of PyDrive.";
+    homepage = "https://github.com/iterative/PyDrive2";
+    license = lib.licenses.asl20;
+    maintainers = with lib.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..50e04ef2018d
--- /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 = "1.3.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "home-assistant-libs";
+    repo = pname;
+    rev = "3ca14ff178f3506a6a91d8736deea8f06e9ad1c1";
+    hash = "sha256-ekgYzTf8it94OYVGcJhEzVFv+9tCrdfLgyco7wq9AXE=";
+  };
+
+  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/pydsdl/default.nix b/nixpkgs/pkgs/development/python-modules/pydsdl/default.nix
new file mode 100644
index 000000000000..b1c6fab9f8a8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydsdl/default.nix
@@ -0,0 +1,36 @@
+{ lib, buildPythonPackage, fetchFromGitHub, pythonOlder }:
+
+ buildPythonPackage rec {
+  pname = "pydsdl";
+  version = "1.12.1";
+  disabled = pythonOlder "3.5"; # only python>=3.5 is supported
+
+  src = fetchFromGitHub {
+    owner = "UAVCAN";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-5AwwqduIvLSZk6WcI59frwRKwjniQXfNWWVsy6V6I1E=";
+  };
+
+  # allow for writable directory for darwin
+  preBuild = ''
+    export HOME=$TMPDIR
+  '';
+
+  # repo doesn't contain tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pydsdl"
+  ];
+
+  meta = with lib; {
+    description = "A UAVCAN DSDL compiler frontend implemented in Python";
+    longDescription = ''
+      It supports all DSDL features defined in the UAVCAN specification.
+    '';
+    homepage = "https://uavcan.org";
+    maintainers = with maintainers; [ wucke13 ];
+    license = licenses.mit;
+  };
+}
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..3adf54281b77
--- /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"
+  ];
+
+  checkInputs = [
+    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..26ac6b51d407
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyduke-energy/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, jsonpickle
+, paho-mqtt
+, pytest-asyncio
+, pytest-timeout
+, pytestCheckHook
+, python-dateutil
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyduke-energy";
+  version = "1.0.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "mjmeli";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-qHVQ7ehvhVM2IL8DcoB6TU2Q4GBn4Ewmzs6Yp46r6xE=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    jsonpickle
+    paho-mqtt
+    python-dateutil
+  ];
+
+  checkInputs = [
+    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";
+    license = licenses.mit;
+    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..b342a2a99e03
--- /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.6.0";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-e/Ssfd5llioA7ccLULlRdHR113IbR4AJ4/HmzQuU7vI=";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    scipy
+    sympy
+  ];
+
+  checkInputs = [
+    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 = [ maintainers.costrouc ];
+  };
+}
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..4cf44e3c67eb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydyf/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchpatch
+, fetchPypi
+, isPy3k
+, pytestCheckHook
+, coverage
+, ghostscript
+, pillow
+}:
+
+buildPythonPackage rec {
+  pname = "pydyf";
+  version = "0.1.2";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit version;
+    pname = "pydyf";
+    sha256 = "sha256-Hi9d5IF09QXeAlp9HnzwG73ZQiyoq5RReCvwDuF4YCw=";
+  };
+
+  patches = [
+    # Fix tests for Ghostscript 9.56
+    # Remove after v0.1.3 has been released
+    (fetchpatch {
+      url = "https://github.com/CourtBouillon/pydyf/commit/d4c34823f1d15368753c9c26f7acc7a24fc2d979.patch";
+      sha256 = "sha256-2hHZW/q5CbStbpSJYbm3b23qKXANEb5jbPGQ83uHC+Q=";
+    })
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "--isort --flake8 --cov --no-cov-on-fail" ""
+  '';
+
+  checkInputs = [
+    pytestCheckHook
+    coverage
+    ghostscript
+    pillow
+  ];
+
+  meta = with lib; {
+    homepage = "https://doc.courtbouillon.org/pydyf/stable/";
+    description = "Low-level PDF generator written in Python and based on PDF specification 1.7";
+    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..aa9e0983b7e3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyeapi/default.nix
@@ -0,0 +1,70 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, mock
+, netaddr
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyeapi";
+  version = "0.8.4";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "arista-eosplus";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "13chya6wix5jb82k67gr44bjx35gcdwz80nsvpv0gvzs6shn4d7b";
+  };
+
+  propagatedBuildInputs = [
+    netaddr
+  ];
+
+  checkInputs = [
+    mock
+    pytestCheckHook
+  ];
+
+  patches = [
+    # Fix usage of collection, https://github.com/arista-eosplus/pyeapi/pull/223
+    (fetchpatch {
+      name = "fix-collection-usage.patch";
+      url = "https://github.com/arista-eosplus/pyeapi/commit/81754f57eb095703cc474f527a0915360af76f68.patch";
+      sha256 = "sha256-ZNBTPRNmXCFVJeRAJxzIHmCOXZiGwU6t4ekSupU3BX8=";
+    })
+    (fetchpatch {
+      name = "fix-collection-usage-2.patch";
+      url = "https://github.com/arista-eosplus/pyeapi/commit/cc9c584e4a3167e3c1624cccb6bc0d9c9bcdbc1c.patch";
+      sha256 = "sha256-EY0i1Skm1llEQAAzvrb2yelhhLBkqKAFJB5ObAIxAYo=";
+      excludes = [
+        ".github/workflows/ci.yml"
+      ];
+    })
+    (fetchpatch {
+      name = "fix-collection-usage-3.patch";
+      url = "https://github.com/arista-eosplus/pyeapi/commit/dc35ab076687ea71665ae9524480b05a4e893909.patch";
+      sha256 = "sha256-xPaYULCPTxiQGB9Im/qLet+XebW9wq+TAfrxcgQxcoE=";
+    })
+  ];
+
+  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..5506c1fbf36e
--- /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;
+    sha256 = "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..7dd36c8fd6a1
--- /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";
+    sha256 = "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 ];
+
+  checkInputs = [ 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/pyeconet/default.nix b/nixpkgs/pkgs/development/python-modules/pyeconet/default.nix
new file mode 100644
index 000000000000..581238c90ac6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyeconet/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, paho-mqtt
+, buildPythonPackage
+, fetchPypi
+, aiohttp
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyeconet";
+  version = "0.1.15";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-zxD2sjKWB/bmxwpVFgkKTngMhr4bVuW+qkSt+pbxqPY=";
+  };
+
+  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";
+    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..7a967c48a042
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyee/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, mock
+, pytest-asyncio
+, pytest-trio
+, pytestCheckHook
+, pythonOlder
+, twisted
+, typing-extensions
+, vcversioner
+}:
+
+buildPythonPackage rec {
+  pname = "pyee";
+  version = "9.0.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-J3DEkoq8ch9GtwXmpysMWUgMSmnJqDygsAu5lPHqSzI=";
+  };
+
+  buildInputs = [
+    vcversioner
+  ];
+
+  propagatedBuildInputs = [
+    typing-extensions
+  ];
+
+  checkInputs = [
+    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..7b7e587feddb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyefergy/default.nix
@@ -0,0 +1,44 @@
+{ 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=";
+  };
+
+  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..66cd3ac70c8b
--- /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.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "mezz64";
+    repo = "pyEight";
+    rev = version;
+    sha256 = "sha256-H8f7990+ZKoOEzPgeYt4vMHCrcWwIa0X1gMh2qXBAoo=";
+  };
+
+  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..cec999bf999a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyelftools/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, python
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyelftools";
+  version = "0.28";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "eliben";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-+T5C0ah2oj5E8fWaQbuzYRVgD5bSiUbaArrlxNLojvw=";
+  };
+
+  doCheck = stdenv.hostPlatform.system == "x86_64-linux";
+
+  checkPhase = ''
+    patchelf --set-interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" test/external_tools/readelf
+    ${python.interpreter} test/all_tests.py
+  '';
+
+  pythonImportsCheck = [
+    "elftools"
+  ];
+
+  meta = with lib; {
+    description = "Python library for analyzing ELF files and DWARF debugging information";
+    homepage = "https://github.com/eliben/pyelftools";
+    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..d197b62b21e9
--- /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.8";
+
+  src = fetchFromGitHub {
+    owner = "mezz64";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-EpmXdyKtfb/M8rTv6YrfNCpDmKei2AD5DBcdVvqCVWw=";
+  };
+
+  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..c7b277a60989
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyemd/default.nix
@@ -0,0 +1,21 @@
+{ lib, buildPythonPackage, fetchPypi, numpy, cython }:
+
+buildPythonPackage rec {
+  pname = "pyemd";
+  version = "0.5.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "fc81c2116f8573e559dfbb8d73e03d9f73c22d0770559f406516984302e07e70";
+  };
+
+  propagatedBuildInputs = [ numpy ];
+  buildInputs = [ cython ];
+
+  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/pyenvisalink/default.nix b/nixpkgs/pkgs/development/python-modules/pyenvisalink/default.nix
new file mode 100644
index 000000000000..d0237e4f2690
--- /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;
+    sha256 = "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..a6f8d405f617
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyephember/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "pyephember";
+  version = "0.3.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3eMdkP7u3TTg1AUK4OR7AGZkD0FxUUPp/etvZ2Rw74E=";
+  };
+
+  propagatedBuildInputs = [
+    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..7f51f435ada9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyerfa/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools-scm
+, liberfa
+, packaging
+, numpy
+}:
+
+buildPythonPackage rec {
+  pname = "pyerfa";
+  format = "pyproject";
+  version = "2.0.0.1";
+
+  doCheck = false;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "2fd4637ffe2c1e6ede7482c13f583ba7c73119d78bef90175448ce506a0ede30";
+  };
+
+  nativeBuildInputs = [
+    packaging
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    liberfa
+    numpy
+  ];
+
+  preBuild = ''
+    export PYERFA_USE_SYSTEM_LIBERFA=1
+  '';
+
+  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..b59f2ad4fe9e
--- /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;
+    sha256 = "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..d2923f1ad44a
--- /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 ];
+
+  checkInputs = [ 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..840a74f252ef
--- /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;
+    sha256 = "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; [ jtojnar ];
+  };
+}
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..b923932ec574
--- /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
+  ];
+
+  checkInputs = [
+    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; [ jtojnar ];
+  };
+}
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..ea520b50c6f3
--- /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
+  ];
+
+  checkInputs = [
+    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; [ jtojnar ];
+  };
+}
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..83b5254d3984
--- /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;
+    sha256 = "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; [ jtojnar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyext/default.nix b/nixpkgs/pkgs/development/python-modules/pyext/default.nix
new file mode 100644
index 000000000000..eb88bf785860
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyext/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildPythonPackage, fetchFromGitHub }:
+
+buildPythonPackage {
+    pname = "pyext";
+    version = "0.8";
+
+    # Latest release not on Pypi or tagged since 2015
+    src = fetchFromGitHub {
+      owner = "kirbyfan64";
+      repo = "PyExt";
+      rev = "1e018b12752ceb279f11aee123ed773d63dcec7e";
+      sha256 = "16km897ng6lgjs39hv83xragdxh0mhyw6ds0qkm21cyci1k5m1vm";
+    };
+
+    # Has no test suite
+    doCheck = false;
+
+    meta = with lib; {
+      description = "Simple Python extensions";
+      homepage = "https://github.com/kirbyfan64/PyExt";
+      license = licenses.mit;
+      maintainers = with maintainers; [ edwtjo ];
+    };
+}
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..35f8eb4bfa44
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyezviz/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, paho-mqtt
+, pandas
+, pycryptodome
+, pythonOlder
+, requests
+, xmltodict
+}:
+
+buildPythonPackage rec {
+  pname = "pyezviz";
+  version = "0.2.0.9";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "baqs";
+    repo = "pyEzviz";
+    rev = version;
+    sha256 = "sha256-HdtyERk2Af+O7/ei7S1+JO6zQxNXrSX95k9707SQuwE=";
+  };
+
+  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/";
+    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..bd0785d9403c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyface/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, importlib-metadata
+, importlib-resources
+, traits
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyface";
+  version = "7.4.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-YT7TAcubr7m6o3xEeT13XQPdI9hD7rkm/xPPaJ6v6N0=";
+  };
+
+  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";
+    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..11359954c505
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyfaidx/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nose
+, numpy
+, setuptools-scm
+, six
+, glibcLocales
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pyfaidx";
+  version = "0.7.1";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-OXdjK3/SkEn4sRA11+neoOLF2pwjX5grTD+uBv8foj8=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  checkInputs = [
+    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..9f9dbe7fd7bf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyfakefs/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  version = "4.6.2";
+  pname = "pyfakefs";
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-jdnIAgvNCB8llleoadXq+cynuzZzx/A7+uiyi751mbY=";
+  };
+
+  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"
+  '');
+
+  checkInputs = [ pytestCheckHook ];
+  # https://github.com/jmcgeheeiv/pyfakefs/issues/581 (OSError: [Errno 9] Bad file descriptor)
+  disabledTests = [ "test_open_existing_pipe" ];
+  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..651ad1c439e3
--- /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.0";
+  pname = "pyFFTW";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "da85102405c0bd95d57eb19e99b01a0729d8406cb204c3900894b873784253da";
+  };
+
+  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/pyfido/default.nix b/nixpkgs/pkgs/development/python-modules/pyfido/default.nix
new file mode 100644
index 000000000000..43909e2c130f
--- /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.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0b28bhyhscaw7dbc92dxswann05x8mz92cagyawdfm8jnc67gq4b";
+  };
+
+  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..e9671e03cb3b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyfiglet/default.nix
@@ -0,0 +1,19 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  version = "0.8.post1";
+  pname = "pyfiglet";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c6c2321755d09267b438ec7b936825a4910fec696292139e664ca8670e103639";
+  };
+
+  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..9f6d85fc5646
--- /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;
+    sha256 = "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..64f554a00efd
--- /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 = "2.5.0";
+
+  disabled = pythonOlder "3.6";
+
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "491feb020dca48ccc562a8c0cbe8df07ee13078df59813b83959cbdada312ea3";
+  };
+
+  checkInputs = [
+    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/pyflume/default.nix b/nixpkgs/pkgs/development/python-modules/pyflume/default.nix
new file mode 100644
index 000000000000..cb02243676a5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyflume/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, pyjwt
+, ratelimit
+, pytz
+, requests
+, requests-mock
+}:
+
+buildPythonPackage rec {
+  pname = "pyflume";
+  version = "0.7.1";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "ChrisMandich";
+    repo = "PyFlume";
+    rev = "v${version}";
+    sha256 = "sha256-Ka90n9Esv6tm310DjYeosBUhudeVoEJzt45L40+0GwQ=";
+  };
+
+  propagatedBuildInputs = [
+    pyjwt
+    ratelimit
+    pytz
+    requests
+  ];
+
+  checkInputs = [
+    requests-mock
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "pyflume" ];
+
+  meta = with lib; {
+    description = "Python module to work with Flume sensors";
+    homepage = "https://github.com/ChrisMandich/PyFlume";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyflunearyou/default.nix b/nixpkgs/pkgs/development/python-modules/pyflunearyou/default.nix
new file mode 100644
index 000000000000..a481e9a97a89
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyflunearyou/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, aiohttp
+, aresponses
+, aiocache
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytest-asyncio
+, pytest-aiohttp
+, pytestCheckHook
+, pythonOlder
+, msgpack
+, ujson
+}:
+
+buildPythonPackage rec {
+  pname = "pyflunearyou";
+  version = "2021.10.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "bachya";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-Q65OSE4qckpvaIvZULBR434i7hwuVM97eSq1Blb1oIU=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'ujson = ">=1.35,<5.0"' 'ujson = "*"'
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    aiocache
+    msgpack
+    ujson
+  ];
+
+  checkInputs = [
+    aresponses
+    pytest-asyncio
+    pytest-aiohttp
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # Ignore the examples directory as the files are prefixed with test_.
+    "examples/"
+  ];
+
+  pythonImportsCheck = [
+    "pyflunearyou"
+  ];
+
+  meta = with lib; {
+    description = "Python library for retrieving UV-related information from Flu Near You";
+    homepage = "https://github.com/bachya/pyflunearyou";
+    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..2e26cee84da4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyfma/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, importlib-metadata
+, numpy
+, pybind11
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyfma";
+  version = "0.1.6";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "nschloe";
+    repo = pname;
+    rev = version;
+    sha256 = "12i68jj9n1qj9phjnj6f0kmfhlsd3fqjlk9p6d4gs008azw5m8yn";
+  };
+  format = "pyproject";
+
+  buildInputs = [
+    pybind11
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "pyfma" ];
+
+  meta = with lib; {
+    description = "Fused multiply-add for Python";
+    homepage = "https://github.com/nschloe/pyfma";
+    license = licenses.mit;
+    maintainers = with maintainers; [ costrouc ];
+  };
+}
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..98aaea66f2e2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyfritzhome/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, requests
+, nose
+, mock
+}:
+
+buildPythonPackage rec {
+  pname = "pyfritzhome";
+  version = "0.6.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "hthiery";
+    repo = "python-fritzhome";
+    rev = version;
+    hash = "sha256-0wfC4lQeTghN2uDUO8Rn2+G8BYOh2UfCZBDJmTw6Lb0=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  checkInputs = [
+    mock
+    nose
+  ];
+
+  checkPhase = ''
+    nosetests
+  '';
+
+  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..8a27fb0bae9c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyfronius/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, pythonOlder
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pyfronius";
+  version = "0.7.1";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "nielstron";
+    repo = pname;
+    rev = "release-${version}";
+    sha256 = "1xwx0c1dp2374bwigzwhvcj4577vrxyhn6i5zv73k9ydc7w1xgyz";
+  };
+
+  patches = [
+    (fetchpatch {
+      # Python3.10 compatibility; https://github.com/nielstron/pyfronius/pull/7
+      url = "https://github.com/nielstron/pyfronius/commit/9deb209d4246ff575cd3c4c5373037bf11df6719.patch";
+      hash = "sha256-srXYCvp86kGYUYZIXMcu68hEbkTspD945J+hc/AhqSw=";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "pyfronius" ];
+
+  meta = with lib; {
+    description = "Python module to communicate with Fronius Symo";
+    homepage = "https://github.com/nielstron/pyfronius";
+    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..baf57da4160e
--- /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.54.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "eblot";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-vL8jSgTtDvaHuCvaCYmFixILQFasTl82yINL5yRtOwU=";
+  };
+
+  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..b3aa456c4a9d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyftpdlib/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, mock
+, psutil
+, pyopenssl
+, pysendfile
+}:
+
+buildPythonPackage rec {
+  version = "1.5.6";
+  pname = "pyftpdlib";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0pnv2byzmzg84q5nmmhn1xafvfil85qa5y52bj455br93zc5b9px";
+  };
+
+  checkInputs = [ mock psutil ];
+  propagatedBuildInputs = [ pyopenssl pysendfile ];
+
+  # impure filesystem-related tests cause timeouts
+  # on Hydra: https://hydra.nixos.org/build/84374861
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/giampaolo/pyftpdlib/";
+    description = "Very fast asynchronous FTP server library";
+    license = licenses.mit;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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/pyfuse3/default.nix b/nixpkgs/pkgs/development/python-modules/pyfuse3/default.nix
new file mode 100644
index 000000000000..07ba27c0ef7d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyfuse3/default.nix
@@ -0,0 +1,69 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, cython
+, pkg-config
+, fuse3
+, trio
+, python
+, pytestCheckHook
+, pytest-trio
+, which
+}:
+
+buildPythonPackage rec {
+  pname = "pyfuse3";
+  version = "3.2.1";
+
+  disabled = pythonOlder "3.5";
+
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "libfuse";
+    repo = "pyfuse3";
+    rev = "release-${version}";
+    hash = "sha256-JGbp2bSI/Rvyys1xMd2o34KlqqBsV6B9LhuuNopayYA=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "'pkg-config'" "'$(command -v $PKG_CONFIG)'"
+  '';
+
+  nativeBuildInputs = [
+    cython
+    pkg-config
+  ];
+
+  buildInputs = [ fuse3 ];
+
+  propagatedBuildInputs = [ trio ];
+
+  preBuild = ''
+    ${python.pythonForBuild.interpreter} setup.py build_cython
+  '';
+
+  checkInputs = [
+    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 ];
+  };
+}
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..46a25e2c6bba
--- /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
+  ];
+
+  checkInputs = [
+    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..86a56c11bcaa
--- /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;
+    sha256 = "sha256-KSP5XS5RWTCqWplyGdzO+/PZK36vX8HJ/ruVsJk1/bI=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace pytest-runner ""
+  '';
+
+  passthru.optional-dependencies = {
+    lxml = [ lxml ];
+    png = [ cairosvg ];
+  };
+
+  checkInputs = [
+    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..7404a5fefcbb
--- /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 = "064";
+  # nixpkgs-update: no auto update
+
+  src = fetchFromGitHub {
+    owner = "MyreMylar";
+    repo = "pygame_gui";
+    rev = "refs/tags/v_${version}";
+    sha256 = "sha256-13+fK1hYxiMh0T+xbbmHViZjyBoQfRyIDc05fIJ/46U=";
+  };
+
+  propagatedBuildInputs = [ pygame python-i18n ];
+
+  postPatch = ''
+    substituteInPlace pygame_gui/core/utility.py \
+      --replace "xsel" "${pkgs.xsel}/bin/xsel"
+  '';
+
+  checkInputs = [ 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..751bb9c8ae94
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygame/default.nix
@@ -0,0 +1,79 @@
+{ stdenv, lib, substituteAll, fetchFromGitHub, buildPythonPackage, python, pkg-config, libX11
+, SDL2, SDL2_image, SDL2_mixer, SDL2_ttf, libpng, libjpeg, portmidi, freetype, fontconfig
+, AppKit
+}:
+
+buildPythonPackage rec {
+  pname = "pygame";
+  version = "2.1.2";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = 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.
+    sha256 = "sha256-v1z6caEMJNXqbcbTmFXoy3KQewHiz6qK4vhNU6Qbukk=";
+    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.interpreter} buildconfig/config.py
+  '';
+
+  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..a756cb8e5d6b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygame/fix-dependency-finding.patch
@@ -0,0 +1,48 @@
+diff --git a/buildconfig/config_darwin.py b/buildconfig/config_darwin.py
+index c785e183..37d5cea4 100644
+--- a/buildconfig/config_darwin.py
++++ b/buildconfig/config_darwin.py
+@@ -146,16 +146,8 @@ def main():
+     ])
+ 
+     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 5c50bcdc..2fd69e2d 100644
+--- a/buildconfig/config_unix.py
++++ b/buildconfig/config_unix.py
+@@ -210,18 +210,8 @@ def main():
+     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 += ["/usr"+d for d in origincdirs]
+-    libdirs += ["/usr"+d for d in origlibdirs]
+-    incdirs += ["/usr/local"+d for d in origincdirs]
+-    libdirs += ["/usr/local"+d for d in origlibdirs]
+-    if localbase:
+-        incdirs = [localbase+d for d in origincdirs]
+-        libdirs = [localbase+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..2d0004cdfc18
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygame_sdl2/default.nix
@@ -0,0 +1,44 @@
+{ 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";
+    sha256 = "sha256-iKsnmuSBzfHlIOHUwWECfvPa9LuBbCr9Kmq5dolxUlU=";
+  };
+
+  # force rebuild of headers needed for install
+  prePatch = ''
+    rm -rf gen gen3
+  '';
+
+  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..fab5c093c502
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygatt/default.nix
@@ -0,0 +1,52 @@
+{ 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
+  ];
+
+  checkInputs = [
+    mock
+    nose
+    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/pygbm/default.nix b/nixpkgs/pkgs/development/python-modules/pygbm/default.nix
new file mode 100644
index 000000000000..5367f622e9b8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygbm/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, scipy
+, numpy
+, numba
+, scikit-learn
+, pytest
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pygbm";
+  version = "0.1.0";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "ogrisel";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1qg2md86d0z5aa6jn8kj3rxsippsqsccx1dbraspdsdkycncvww3";
+  };
+
+  propagatedBuildInputs = [
+    scipy
+    numpy
+    numba
+    scikit-learn
+  ];
+
+  checkInputs = [
+    pytest
+  ];
+
+  checkPhase = ''
+    # numerical rounding error in test
+    pytest -k "not test_derivatives"
+  '';
+
+  meta = with lib; {
+    description = "Experimental Gradient Boosting Machines in Python";
+    homepage = "https://github.com/ogrisel/pygbm";
+    license = licenses.mit;
+    maintainers = [ maintainers.costrouc ];
+    broken = true;
+  };
+}
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..f07340ce2fb8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygccxml/default.nix
@@ -0,0 +1,26 @@
+{ lib, castxml, fetchFromGitHub, buildPythonPackage,
+llvmPackages }:
+buildPythonPackage rec {
+  pname = "pygccxml";
+  version = "2.2.1";
+
+  src = fetchFromGitHub {
+    owner  = "gccxml";
+    repo   = "pygccxml";
+    rev    = "v${version}";
+    sha256 = "1msqpg3dqn7wjlf91ddljxzz01a3b1p2sy91n36lrsy87lz499gh";
+  };
+
+  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; {
+    homepage = "https://github.com/gccxml/pygccxml";
+    description = "Python package for easy C++ declarations navigation";
+    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..c1be042dc7d9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygdbmi/default.nix
@@ -0,0 +1,36 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchFromGitHub
+, gdb
+}:
+
+buildPythonPackage rec {
+  pname = "pygdbmi";
+  version = "0.10.0.0";
+
+  src = fetchFromGitHub {
+    owner = "cs01";
+    repo = "pygdbmi";
+    rev = version;
+    sha256 = "0a6b3zyxwdcb671c6lrwxm8fhvsbjh0m8hf1r18m9dha86laimjr";
+  };
+
+  checkInputs = [ gdb ];
+
+  # 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..c02400fd1970
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygeos/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+, geos
+, pytestCheckHook
+, cython
+, numpy
+}:
+
+buildPythonPackage rec {
+  pname = "pygeos";
+  version = "0.12.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-PEFULvZ8ZgFfRDrj5uaDUDqKIh+cJPsjgPauQq7RYAo=";
+  };
+
+  patches = [
+    # Adapt https://github.com/shapely/shapely/commit/4889bd2d72ff500e51ba70d5b954241878349562,
+    # backporting to pygeos
+    ./fix-for-geos-3-11.patch
+  ];
+
+  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.interpreter} setup.py build_ext --inplace
+    ${python.interpreter} setup.py bdist_wheel
+  '';
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "pygeos" ];
+
+  meta = with lib; {
+    description = "Wraps GEOS geometry functions in numpy ufuncs.";
+    homepage = "https://github.com/pygeos/pygeos";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ nialov ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/pygeos/fix-for-geos-3-11.patch b/nixpkgs/pkgs/development/python-modules/pygeos/fix-for-geos-3-11.patch
new file mode 100644
index 000000000000..fe81c0769c18
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygeos/fix-for-geos-3-11.patch
@@ -0,0 +1,29 @@
+From ea82dbefeb573150935eb78a6916813775512e76 Mon Sep 17 00:00:00 2001
+From: Joris Van den Bossche <jorisvandenbossche@gmail.com>
+Date: Tue, 26 Apr 2022 22:17:00 +0200
+Subject: [PATCH] TST: fix tests for GEOS main (#1357) (backported for nixpkgs)
+
+---
+ pygeos/tests/test_constructive.py | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+diff --git a/pygeos/tests/test_constructive.py b/pygeos/tests/test_constructive.py
+index 87c0a9f..b3459d1 100644
+--- a/pygeos/tests/test_constructive.py
++++ b/pygeos/tests/test_constructive.py
+@@ -48,7 +48,11 @@ def test_no_args_array(geometry, func):
+ @pytest.mark.parametrize("geometry", all_types)
+ @pytest.mark.parametrize("func", CONSTRUCTIVE_FLOAT_ARG)
+ def test_float_arg_array(geometry, func):
+-    if func is pygeos.offset_curve and pygeos.get_type_id(geometry) not in [1, 2]:
++    if (
++        func is pygeos.offset_curve
++        and pygeos.get_type_id(geometry) not in [1, 2]
++        and pygeos.geos_version < (3, 11, 0)
++    ):
+         with pytest.raises(GEOSException, match="only accept linestrings"):
+             func([geometry, geometry], 0.0)
+         return
+-- 
+2.36.1
+
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..3ca462115768
--- /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;
+    sha256 = "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..9e293e65a09b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygit2/default.nix
@@ -0,0 +1,89 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, cacert
+, cached-property
+, cffi
+, fetchpatch
+, fetchPypi
+, isPyPy
+, libgit2
+, pycparser
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pygit2";
+  version = "1.9.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-IIlEM98RRkgarK434rDzu7/eoCbbL1UGEXC9mCPkCxk=";
+  };
+
+  patches = [
+    # libgit 2 fix
+    (fetchpatch {
+      url = "https://github.com/libgit2/pygit2/commit/14b1df84060ea4ab085202382e80672ec1a104e3.patch";
+      includes = [ "src/types.h" ];
+      sha256 = "sha256-2krkyAT30l/olSEl2ugWCsylvGuT7VvkuSFVshIXktA=";
+    })
+  ];
+
+  preConfigure = lib.optionalString stdenv.isDarwin ''
+    export DYLD_LIBRARY_PATH="${libgit2}/lib"
+  '';
+
+  buildInputs = [
+    libgit2
+  ];
+
+  propagatedBuildInputs = [
+    cached-property
+    pycparser
+  ] ++ lib.optional (!isPyPy) [
+    cffi
+  ];
+
+  propagatedNativeBuildInputs = lib.optional (!isPyPy) [
+    cffi
+  ];
+
+  checkInputs = [
+    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";
+
+  # setup.py check is broken
+  # https://github.com/libgit2/pygit2/issues/868
+  dontUseSetuptoolsCheck = true;
+
+  # TODO: Test collection is failing
+  # https://github.com/NixOS/nixpkgs/pull/72544#issuecomment-582681068
+  doCheck = false;
+
+  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/pyglet/default.nix b/nixpkgs/pkgs/development/python-modules/pyglet/default.nix
new file mode 100644
index 000000000000..6048991cbff2
--- /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 = "1.5.26";
+  pname = "pyglet";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-7oxeC1uH34QYjiDlUpguuo2gCUS0xVYPHP3VyXFNGbA=";
+    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;
+
+  checkInputs = [
+    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/pygls/default.nix b/nixpkgs/pkgs/development/python-modules/pygls/default.nix
new file mode 100644
index 000000000000..e9a6850b5e65
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygls/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, setuptools-scm
+, pydantic
+, toml
+, typeguard
+, mock
+, pytest-asyncio
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pygls";
+  version = "0.12.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "openlawlibrary";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-L2KTNiI+I+r2fF88B1NSunowokrDzGCw3PXbxekg/oE=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+  nativeBuildInputs = [ setuptools-scm ];
+
+  propagatedBuildInputs = [
+    pydantic
+    toml
+    typeguard
+  ];
+
+  checkInputs = [
+    mock
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  # Fixes hanging tests on Darwin
+  __darwinAllowLocalNetworking = true;
+
+  pythonImportsCheck = [ "pygls" ];
+
+  meta = with lib; {
+    description = "Pythonic generic implementation of the Language Server Protocol";
+    homepage = "https://github.com/openlawlibrary/pygls";
+    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..e0764ecb3a4b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygmars/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, setuptools-scm
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pygmars";
+  version = "0.7.0";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "nexB";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0wghk4nzplpl26iwrgvm0n9x88nyxlcxz4ywss4nwdr4hfccl28l";
+  };
+
+  dontConfigure = true;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pygmars"
+  ];
+
+  meta = with lib; {
+    description = "Python lexing and parsing library";
+    homepage = "https://github.com/nexB/pygmars";
+    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..152e9463b0e2
--- /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.4";
+  disabled = ! isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "028szd3k295yhz943bj19i4kx6f0pfh1fd2q14id0g84dl4i49dm";
+  };
+
+  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/default.nix b/nixpkgs/pkgs/development/python-modules/pygments/default.nix
new file mode 100644
index 000000000000..c8759a2fe056
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygments/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, docutils
+, lxml
+, pytestCheckHook
+, wcag-contrast-ratio
+}:
+
+let pygments = buildPythonPackage
+  rec {
+    pname = "pygments";
+    version = "2.12.0";
+
+    src = fetchPypi {
+      pname = "Pygments";
+      inherit version;
+      sha256 = "sha256-XrEWEY+WEv8e6JrJZDe7a0no8E2KE7UUuib2ICCOJus=";
+    };
+
+    propagatedBuildInputs = [
+      docutils
+    ];
+
+    # circular dependencies if enabled by default
+    doCheck = false;
+    checkInputs = [
+      lxml
+      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; {
+      homepage = "https://pygments.org/";
+      description = "A generic syntax highlighter";
+      license = licenses.bsd2;
+      maintainers = with maintainers; [ SuperSandro2000 ];
+    };
+  };
+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..b06cb5430064
--- /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.18.0";
+
+  src = fetchFromGitHub {
+    owner = "esa";
+    repo = "pygmo2";
+    rev = "v${version}";
+    sha256 = "sha256-he7gxRRJd6bBrD0Z0i+CQTr5JH4P3Im/beNGO+HfmNM=";
+  };
+
+  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 = [ maintainers.costrouc ];
+  };
+})
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..a2a993de7f17
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygmt/default.nix
@@ -0,0 +1,54 @@
+{ lib, stdenv
+, pythonOlder
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools-scm
+, gmt
+, numpy
+, netcdf4
+, pandas
+, packaging
+, xarray
+, pytest-mpl
+, ipython
+, ghostscript
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pygmt";
+  version = "0.7.0";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "GenericMappingTools";
+    repo = "pygmt";
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-Z38fZvmeWDLZEIyH+UG6Nb6KNnjEuXIn3RRH4CPWz9A=";
+  };
+
+  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 ];
+
+  doCheck = false; # the *entire* test suite requires network access
+  checkInputs = [ pytestCheckHook pytest-mpl ghostscript ipython ];
+  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;
+    # 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/pygobject/3.nix b/nixpkgs/pkgs/development/python-modules/pygobject/3.nix
new file mode 100644
index 000000000000..20c45462d9ed
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygobject/3.nix
@@ -0,0 +1,79 @@
+{ lib
+, stdenv
+, fetchurl
+, buildPythonPackage
+, pkg-config
+, glib
+, gobject-introspection
+, pycairo
+, cairo
+, ncurses
+, meson
+, ninja
+, isPy3k
+, gnome
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "pygobject";
+  version = "3.42.2";
+
+  outputs = [ "out" "dev" ];
+
+  disabled = !isPy3k;
+
+  format = "other";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
+    sha256 = "rehpXipwc4Sd0DFtMdhyjhXh4Lxx2f9tHAnoa+UryVc=";
+  };
+
+  depsBuildBuild = [
+    pkg-config
+  ];
+
+  nativeBuildInputs = [
+    pkg-config
+    meson
+    ninja
+    gobject-introspection
+  ];
+
+  buildInputs = [
+    # # .so files link to these
+    gobject-introspection
+    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.pythonForBuild.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/pygobject/default.nix b/nixpkgs/pkgs/development/python-modules/pygobject/default.nix
new file mode 100644
index 000000000000..bf42d17b4deb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygobject/default.nix
@@ -0,0 +1,42 @@
+{ lib, stdenv, fetchurl, python, buildPythonPackage, pkg-config, glib, isPy3k, pythonAtLeast }:
+
+buildPythonPackage rec {
+  pname = "pygobject";
+  version = "2.28.7";
+  format = "other";
+  disabled = pythonAtLeast "3.9";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/pygobject/2.28/${pname}-${version}.tar.xz";
+    sha256 = "0nkam61rsn7y3wik3vw46wk5q2cjfh2iph57hl9m39rc8jijb7dv";
+  };
+
+  outputs = [ "out" "devdoc" ];
+
+  patches = lib.optionals stdenv.isDarwin [
+    ./pygobject-2.0-fix-darwin.patch
+  ];
+
+  configureFlags = [ "--disable-introspection" ];
+
+  nativeBuildInputs = [ pkg-config ];
+  buildInputs = [ glib ];
+
+  # in a "normal" setup, pygobject and pygtk are installed into the
+  # same site-packages: we need a pth file for both. pygtk.py would be
+  # used to select a specific version, in our setup it should have no
+  # effect, but we leave it in case somebody expects and calls it.
+  postInstall = lib.optionalString (!isPy3k) ''
+    mv $out/lib/${python.libPrefix}/site-packages/{pygtk.pth,${pname}-${version}.pth}
+
+    # Prevent wrapping of codegen files as these are meant to be
+    # executed by the python program
+    chmod a-x $out/share/pygobject/*/codegen/*.py
+  '';
+
+  meta = with lib; {
+    homepage = "https://pygobject.readthedocs.io/";
+    description = "Python bindings for GLib";
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pygobject/pygobject-2.0-fix-darwin.patch b/nixpkgs/pkgs/development/python-modules/pygobject/pygobject-2.0-fix-darwin.patch
new file mode 100644
index 000000000000..7fef05262f4d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygobject/pygobject-2.0-fix-darwin.patch
@@ -0,0 +1,88 @@
+--- a/gio/unix-types.defs
++++ b/gio/unix-types.defs
+@@ -7,18 +7,6 @@
+   (gtype-id "G_TYPE_UNIX_CONNECTION")
+ )
+ 
+-(define-object DesktopAppInfo
+-  (docstring
+-  "DesktopAppInfo(desktop_id) -> gio.unix.DesktopAppInfo\n\n"
+-  "gio.Unix.DesktopAppInfo is an implementation of gio.AppInfo\n"
+-  "based on desktop files."
+-  )
+-  (in-module "giounix")
+-  (parent "GObject")
+-  (c-name "GDesktopAppInfo")
+-  (gtype-id "G_TYPE_DESKTOP_APP_INFO")
+-)
+-
+ (define-object FDMessage
+   (in-module "giounix")
+   (parent "GSocketControlMessage")
+--- a/gio/unix.defs
++++ b/gio/unix.defs
+@@ -32,54 +32,6 @@
+ 
+ 
+ 
+-;; From gdesktopappinfo.h
+-
+-(define-function desktop_app_info_get_type
+-  (c-name "g_desktop_app_info_get_type")
+-  (return-type "GType")
+-)
+-
+-(define-function desktop_app_info_new_from_filename
+-  (c-name "g_desktop_app_info_new_from_filename")
+-  (return-type "GDesktopAppInfo*")
+-  (parameters
+-    '("const-char*" "filename")
+-  )
+-)
+-
+-(define-function g_desktop_app_info_new_from_keyfile
+-  (c-name "g_desktop_app_info_new_from_keyfile")
+-  (return-type "GDesktopAppInfo*")
+-  (parameters
+-    '("GKeyFile*" "key_file")
+-  )
+-)
+-
+-(define-function desktop_app_info_new
+-  (c-name "g_desktop_app_info_new")
+-  (is-constructor-of "GDesktopAppInfo")
+-  (return-type "GDesktopAppInfo*")
+-  (parameters
+-    '("const-char*" "desktop_id")
+-  )
+-)
+-
+-(define-method get_is_hidden
+-  (of-object "GDesktopAppInfo")
+-  (c-name "g_desktop_app_info_get_is_hidden")
+-  (return-type "gboolean")
+-)
+-
+-(define-function desktop_app_info_set_desktop_env
+-  (c-name "g_desktop_app_info_set_desktop_env")
+-  (return-type "none")
+-  (parameters
+-    '("const-char*" "desktop_env")
+-  )
+-)
+-
+-
+-
+ ;; From gunixfdmessage.h
+ 
+ (define-function g_unix_fd_message_get_type
+--- a/gio/unix.override
++++ b/gio/unix.override
+@@ -24,7 +24,6 @@
+ #define NO_IMPORT_PYGOBJECT
+ #include <pygobject.h>
+ #include <gio/gio.h>
+-#include <gio/gdesktopappinfo.h>
+ #include <gio/gunixinputstream.h>
+ #include <gio/gunixmounts.h>
+ #include <gio/gunixoutputstream.h>
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..8cee037bb106
--- /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
+  ];
+
+  checkInputs = [
+    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..29be02751bb2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygpgme/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchurl, isPyPy
+, gpgme }:
+
+buildPythonPackage rec {
+  version = "0.3";
+  pname = "pygpgme";
+  disabled = isPyPy;
+
+  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..3780122f19f7
--- /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.9";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-+hj3xs6ig0Gk5GbtDPBWgrCmgoiv6N18lCZ4L3wa4Bw=";
+    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 ];
+
+  checkInputs = [ 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..56d8b05af9a5
--- /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 ];
+
+  checkInputs =  [ 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.linux;
+  };
+}
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..6bd6fedb64a4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygtfs/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, docopt
+, fetchPypi
+, nose
+, pytz
+, pythonOlder
+, setuptools-scm
+, six
+, sqlalchemy
+}:
+
+buildPythonPackage rec {
+  pname = "pygtfs";
+  version = "0.1.7";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-sGJwtf8DVIrE4hcU3IksnyAAt8yf67UBJIiVILDSsv8=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    docopt
+    pytz
+    six
+    sqlalchemy
+  ];
+
+  checkInputs = [
+    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..29fc09120f71
--- /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.3";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "vigonotion";
+    repo = "pygti";
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-5Pc6gAI3xICS+f7tYwC9OVOAHJSW8AGPOvPYs0/6/iI=";
+  };
+
+  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..a22436ba6273
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygtkspellcheck/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildPythonPackage, fetchPypi, gobject-introspection, gtk3, pyenchant, pygobject3 }:
+
+buildPythonPackage rec {
+  pname = "pygtkspellcheck";
+  version = "5.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-kfhoOLnKbA9jH4DUtQw0nATjK21pMNxyAOzYDLQkR4U=";
+  };
+
+  nativeBuildInputs = [ gobject-introspection gtk3 ];
+  propagatedBuildInputs = [ pyenchant pygobject3 ];
+
+  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..c7738a9f3ec7
--- /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;
+    sha256 = "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..a4c04ce79ee6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyhamcrest/default.nix
@@ -0,0 +1,27 @@
+{ lib, buildPythonPackage, fetchPypi
+, mock, pytest
+, six
+}:
+buildPythonPackage rec {
+  pname = "PyHamcrest";
+  version = "2.0.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "dfb19cf6d71743e086fbb761ed7faea5aacbc8ec10c17a08b93ecde39192a3db";
+  };
+
+  checkInputs = [ mock pytest ];
+  propagatedBuildInputs = [ six ];
+
+  doCheck = false;  # pypi tarball does not include tests
+
+  meta = with lib; {
+    homepage = "https://github.com/hamcrest/PyHamcrest";
+    description = "Hamcrest framework for matcher objects";
+    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..4675e48a5646
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyhanko-certvalidator/default.nix
@@ -0,0 +1,73 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, aiohttp
+, asn1crypto
+, cryptography
+, oscrypto
+, requests
+, uritools
+, openssl
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pyhanko-certvalidator";
+  version = "0.19.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  # Tests are only available on GitHub
+  src = fetchFromGitHub {
+    owner = "MatthiasValvekens";
+    repo = "certvalidator";
+    rev = version;
+    sha256 = "sha256-UxlBggKgqvbKioG98UaKvhW0YgEa6PqV913nqYvTx1I=";
+  };
+
+  propagatedBuildInputs = [
+    asn1crypto
+    cryptography
+    oscrypto
+    requests
+    uritools
+  ];
+
+  checkInputs = [
+    aiohttp
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # Test looks for libcrypto.so.1.1
+    "dev/stress_test.py"
+    # 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"
+  ];
+
+  pythonImportsCheck = [
+    "pyhanko_certvalidator"
+  ];
+
+  meta = with lib; {
+    description = "Python library for validating X.509 certificates and paths";
+    homepage = "https://github.com/MatthiasValvekens/certvalidator";
+    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..2cd71ae0f33a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyhanko/default.nix
@@ -0,0 +1,132 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, asn1crypto
+, click
+, cryptography
+, pyhanko-certvalidator
+, pytz
+, pyyaml
+, qrcode
+, requests
+, tzlocal
+, certomancer
+, freezegun
+, python-pae
+, pytest-aiohttp
+, requests-mock
+, pytestCheckHook
+# Flags to add to the library
+, extraPubkeyAlgsSupport ? false
+, oscrypto
+, opentypeSupport ? false
+, fonttools
+, uharfbuzz
+, imageSupport ? false
+, pillow
+, python-barcode
+, pkcs11Support ? false
+, python-pkcs11
+, asyncHttpSupport ? false
+, aiohttp
+}:
+
+buildPythonPackage rec {
+  pname = "pyhanko";
+  version = "0.12.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  # Tests are only available on GitHub
+  src = fetchFromGitHub {
+    owner = "MatthiasValvekens";
+    repo = "pyHanko";
+    rev = version;
+    sha256 = "sha256-W60NTKEtCqJ/QdtNiieKUsrl2jIjIH86Wych68R3mBc=";
+  };
+
+  propagatedBuildInputs = [
+    click
+    pyhanko-certvalidator
+    pytz
+    pyyaml
+    qrcode
+    tzlocal
+  ] ++ lib.optionals (extraPubkeyAlgsSupport) [
+    oscrypto
+  ] ++ lib.optionals (opentypeSupport) [
+    fonttools
+    uharfbuzz
+  ] ++ lib.optionals (imageSupport) [
+    pillow
+    python-barcode
+  ] ++ lib.optionals (pkcs11Support) [
+    python-pkcs11
+  ] ++ lib.optionals (asyncHttpSupport) [
+    aiohttp
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace ", 'pytest-runner'" "" \
+      --replace "pytest-aiohttp~=0.3.0" "pytest-aiohttp~=1.0.3"
+  '';
+
+  checkInputs = [
+    aiohttp
+    certomancer
+    freezegun
+    python-pae
+    pytest-aiohttp
+    requests-mock
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = lib.optionals (!opentypeSupport) [
+    "pyhanko_tests/test_stamp.py"
+    "pyhanko_tests/test_text.py"
+  ] ++ lib.optionals (!imageSupport) [
+    "pyhanko_tests/test_barcode.py"
+  ] ++ lib.optionals (!pkcs11Support) [
+    "pyhanko_tests/test_pkcs11.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";
+    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..84c5756689fd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyhaversion/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, aiohttp
+, aresponses
+, awesomeversion
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytest-asyncio
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pyhaversion";
+  version = "22.4.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "ludeeus";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-adM6LUo8ycD/3G19JIl4DcuVK/f0/9V8AG82qgYO0uM=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    awesomeversion
+  ];
+
+  checkInputs = [
+    aresponses
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    # Upstream doesn't set a version for the tagged releases
+    substituteInPlace setup.py \
+      --replace "main" ${version}
+  '';
+
+
+  pythonImportsCheck = [
+    "pyhaversion"
+  ];
+
+  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..62d40e368efc
--- /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
+  '';
+
+  checkInputs = [
+    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/pyheos/default.nix b/nixpkgs/pkgs/development/python-modules/pyheos/default.nix
new file mode 100644
index 000000000000..715c609875e6
--- /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";
+  };
+
+  checkInputs = [
+    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/pyhiveapi/default.nix b/nixpkgs/pkgs/development/python-modules/pyhiveapi/default.nix
new file mode 100644
index 000000000000..bd85e0dfa73c
--- /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.13";
+
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "Pyhass";
+    repo = "Pyhiveapi";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-VuWP+yypQznirNcjvqbI3x+bWRiVIfO1NxG76Mdc37g=";
+  };
+
+  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..f9014f5db2b7
--- /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.59";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "chimpler";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-0BuDYheURFhtnWIh7Qw4LzZbk5tSqiNejo+08eglIvs=";
+  };
+
+  propagatedBuildInputs = [
+    pyparsing
+    python-dateutil
+  ];
+
+  checkInputs = [
+    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..429f3a8ebb9f
--- /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
+  ];
+
+  checkInputs = [
+    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..c8356f0e12f7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyhumps/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyhumps";
+  version = "3.7.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "nficano";
+    repo = "humps";
+    rev = "v${version}";
+    hash = "sha256-nxiNYBpbX2GfzYj+DdU89bsyEHDnrKZIAGZY7ut/P6I=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  patches = [
+    # Fix naming, https://github.com/nficano/humps/pull/246
+    (fetchpatch {
+      name = "fix-naming.patch";
+      url = "https://github.com/nficano/humps/commit/8c7de2040e3610760c4df604cdbe849a9b7f0074.patch";
+      sha256 = "sha256-dNgPAOxPdCwDteobP4G2/GiVj/Xg+m7u/Or92vo8ilk=";
+    })
+  ];
+
+  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..56f4e4236215
--- /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;
+    sha256 = "sha256-2E1pdHHt8o7CGpdG+u4xy5OyNCueUGVw5CY8oicYd5w=";
+  };
+
+  propagatedBuildInputs = [
+    certifi
+    click
+    future
+    keyring
+    keyrings-alt
+    pytz
+    requests
+    six
+    tzlocal
+  ];
+
+  checkInputs = [
+    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..255231f8a496
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyicu/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, six
+, icu
+}:
+
+buildPythonPackage rec {
+  pname = "PyICU";
+  version = "2.9";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-PCnWzmVUYVcReho0ejA+zfzxp1ke1nn8iM3vQQiEWHg=";
+  };
+
+  nativeBuildInputs = [ icu ]; # for icu-config, but should be replaced with pkg-config
+  buildInputs = [ icu ];
+  checkInputs = [ 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..43e1a1a2b82f
--- /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 = teams.determinatesystems.members;
+  };
+}
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..467bc00ba7ad
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyinfra/default.nix
@@ -0,0 +1,70 @@
+{ lib
+, buildPythonPackage
+, click
+, colorama
+, configparser
+, distro
+, fetchFromGitHub
+, gevent
+, jinja2
+, paramiko
+, pytestCheckHook
+, python-dateutil
+, pythonOlder
+, pywinrm
+, pyyaml
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "pyinfra";
+  version = "2.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Fizzadar";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-nWH4o6NqyqkZg/HxF6NesnA6ijWo+B94BeohSsP60TY=";
+  };
+
+  propagatedBuildInputs = [
+    click
+    colorama
+    configparser
+    distro
+    gevent
+    jinja2
+    paramiko
+    python-dateutil
+    pywinrm
+    pyyaml
+    setuptools
+  ];
+
+  checkInputs = [
+    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://github.com/Fizzadar/pyinfra";
+    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/pyinsteon/default.nix b/nixpkgs/pkgs/development/python-modules/pyinsteon/default.nix
new file mode 100644
index 000000000000..5340be273fc9
--- /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
+, pytest-asyncio
+, pytest-timeout
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+}:
+
+buildPythonPackage rec {
+  pname = "pyinsteon";
+  version = "1.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-PMjvic+K/m7beavlZvGhJcizSNCzLPZYLm3P2V9EPLs=";
+  };
+
+  propagatedBuildInputs = [
+    aiofiles
+    aiohttp
+    pypubsub
+    pyserial
+    pyserial-asyncio
+    pyyaml
+  ];
+
+  checkInputs = [
+    async_generator
+    pytest-asyncio
+    pytest-timeout
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    "test_results"
+  ];
+
+  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";
+    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..45425e1d1187
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyinstrument/default.nix
@@ -0,0 +1,31 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchFromGitHub
+}:
+
+buildPythonPackage rec {
+  pname = "pyinstrument";
+  version = "4.1.1";
+
+  src = fetchFromGitHub {
+    owner = "joerick";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-4gM60UhzN+VnNMTHw6NSU7/LUPHaMgg105D+dO6SDfg=";
+  };
+
+  # Module import recursion
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pyinstrument"
+  ];
+
+  meta = with lib; {
+    description = "Call stack profiler for Python";
+    homepage = "https://github.com/joerick/pyinstrument";
+    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..c6b1a7319f3e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyintesishome/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+}:
+
+buildPythonPackage rec {
+  pname = "pyintesishome";
+  version = "1.8.1";
+
+  src = fetchFromGitHub {
+    owner = "jnimmo";
+    repo = "pyIntesisHome";
+    rev = version;
+    sha256 = "sha256-+bad3VIoP0sVw0blK9YIot2GfK5de4HTXv5/ipV2Nds=";
+  };
+
+  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";
+    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..6a9847d3778f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyipma/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, aiohttp
+, aioresponses
+, buildPythonPackage
+, fetchFromGitHub
+, freezegun
+, mock
+, geopy
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyipma";
+  version = "3.0.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "dgomes";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-AF4bwEsAwJ5MoBQieNDFQ00LILJu+bZZttw4T5+6gkk=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    geopy
+  ];
+
+  checkInputs = [
+    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";
+    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..dfef79a4dcae
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyipp/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, aiohttp
+, aresponses
+, buildPythonPackage
+, deepmerge
+, fetchFromGitHub
+, pytest-asyncio
+, pytestCheckHook
+, pytest-cov
+, yarl
+}:
+
+buildPythonPackage rec {
+  pname = "pyipp";
+  version = "0.11.0";
+
+  src = fetchFromGitHub {
+   owner = "ctalkington";
+   repo = "python-ipp";
+   rev = version;
+   sha256 = "0ar3mkyfa9qi3av3885bvacpwlxh420if9ymdj8i4x06ymzc213d";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    deepmerge
+    yarl
+  ];
+
+  checkInputs = [
+    aresponses
+    pytest-asyncio
+    pytest-cov
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "pyipp" ];
+
+  meta = with lib; {
+    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..6ebe09463e3a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyiqvia/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, buildPythonPackage
+, aiohttp
+, aresponses
+, backoff
+, fetchFromGitHub
+, poetry-core
+, pytest-aiohttp
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyiqvia";
+  version = "2022.04.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "bachya";
+    repo = pname;
+    rev = version;
+    hash = "sha256-qW1rjKc1+w2rTUGackPjb0qgTZpFXh0ZRBqMmf4nDnk=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    backoff
+  ];
+
+  checkInputs = [
+    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";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..e35abee42d38
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyisy/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, requests
+, python-dateutil
+, aiohttp
+}:
+
+buildPythonPackage rec {
+  pname = "pyisy";
+  version = "3.0.7";
+
+  src = fetchFromGitHub {
+    owner = "automicus";
+    repo = "PyISY";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-FWv5xPUQob+UlTU9eq9HYAhxCDucOZr+ddm5/a0sbgw=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "setuptools-git-version" "" \
+      --replace 'version_format="{tag}"' 'version="${version}"'
+  '';
+
+  propagatedBuildInputs = [
+    aiohttp
+    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";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
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..ed23eba4c264
--- /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}";
+    sha256 = "sha256-0g0fCf0FIwde5Vsc/BJxjgMcs5llpD8JqOgFbMjOooc=";
+  };
+
+  nativeBuildInputs = [ cython ];
+  propagatedBuildInputs = [
+    numpy
+  ] ++ lib.optionals (pythonOlder "3.9") [
+    importlib-resources
+  ];
+
+  checkInputs = [ 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/pyjson5/default.nix b/nixpkgs/pkgs/development/python-modules/pyjson5/default.nix
new file mode 100644
index 000000000000..232bafd3ba7e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyjson5/default.nix
@@ -0,0 +1,26 @@
+{ buildPythonPackage, lib, nose, fetchFromGitHub }:
+
+buildPythonPackage rec {
+  pname = "pyjson5";
+  version = "0.8.5";
+
+  src = fetchFromGitHub {
+    owner = "dpranke";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0nyngj18jlkgvm1177lc3cj47wm4yh3dqigygvcvw7xkyryafsqn";
+  };
+
+  doCheck = true;
+  checkInputs = [ nose ];
+  checkPhase = ''
+    nosetests
+  '';
+
+  meta = with lib; {
+    description = "Python implementation of the JSON5 data format";
+    license = licenses.asl20;
+    homepage = "https://github.com/dpranke/pyjson5";
+    maintainers = with maintainers; [ isgy ];
+  };
+}
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..0f2ddf62f1a8
--- /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";
+    sha256 = "sha256-Hqay9/qsjUfe62U7Q79l0Yy01L2Bnj5xNs6427k3Br8=";
+  };
+
+  checkInputs = [ 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..500f46b02408
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyjwt/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, cryptography
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyjwt";
+  version = "2.4.0";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    pname = "PyJWT";
+    inherit version;
+    sha256 = "sha256-1CkIIIxpmzuXPL6wGpabpqlsgh7vscW/5MOQwB1nq7o=";
+  };
+
+  propagatedBuildInputs = [
+    cryptography
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "jwt" ];
+
+  meta = with lib; {
+    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..13f5466b8a10
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pykakasi/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, buildPythonPackage
+, deprecated
+, fetchFromGitHub
+, importlib-metadata
+, jaconv
+, 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 = "v${version}";
+    sha256 = "ivlenHPD00bxc0c9G368tfTEckOC3vqDB5kMQzHXbVM=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    jaconv
+    deprecated
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  checkInputs = [
+    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";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..0d7e82be63f3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pykdl/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv, toPythonModule, cmake, orocos-kdl, eigen, python }:
+
+toPythonModule (stdenv.mkDerivation {
+  pname = "pykdl";
+  inherit (orocos-kdl) version src;
+
+  sourceRoot = "source/python_orocos_kdl";
+
+  # Fix hardcoded installation path
+  postPatch = ''
+    substituteInPlace CMakeLists.txt \
+      --replace dist-packages site-packages
+  '';
+
+  nativeBuildInputs = [ cmake ];
+  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..b4b442945962
--- /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.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-c0L3XnMRA+ZT/B9rn9q8JBDPkrbnsGFggEp1eGybV0c=";
+  };
+
+  buildInputs = [ openmp ];
+
+  propagatedBuildInputs = [ numpy ];
+
+  preCheck = ''
+    # make sure we don't import pykdtree from the source tree
+    mv pykdtree tests
+  '';
+
+  checkInputs = [ 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..da5f2826e434
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pykeepass/default.nix
@@ -0,0 +1,44 @@
+{ lib, fetchFromGitHub, buildPythonPackage
+, lxml, pycryptodomex, construct
+, argon2-cffi, python-dateutil, future
+, python
+}:
+
+buildPythonPackage rec {
+  pname   = "pykeepass";
+  version = "4.0.3";
+
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "libkeepass";
+    repo = "pykeepass";
+    rev = "v${version}";
+    hash = "sha256-HyveBBsd1OFWoY3PgqqaKRLBhsxgFv8PRAxEF6r+bf4=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py --replace "==" ">="
+  '';
+
+  propagatedBuildInputs = [
+    lxml pycryptodomex construct
+    argon2-cffi python-dateutil future
+  ];
+
+  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..67246ffbb1ab
--- /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;
+    sha256 = "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..a9bfb58a9c18
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pykeyatome/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, fake-useragent
+, fetchFromGitHub
+, pytest-aiohttp
+, pytestCheckHook
+, pythonOlder
+, requests
+, requests-mock
+, responses
+, simplejson
+}:
+
+buildPythonPackage rec {
+  pname = "pykeyatome";
+  version = "1.5.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "jugla";
+    repo = "pyKeyAtome";
+    rev = "refs/tags/V${version}";
+    sha256 = "sha256-9J8MaQs3+/Ld+v3WmA98lSu3iMrX4Se4q1jD1KeRTpw=";
+  };
+
+  propagatedBuildInputs = [
+    fake-useragent
+    requests
+    simplejson
+  ];
+
+  checkInputs = [
+    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";
+    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..43d381e6bce7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pykira/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "pykira";
+  version = "0.1.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0zxglzmd2k1nc4wri76ykra910fdgli027nw9d6541ic7xmw87vj";
+  };
+
+  # 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..060a738911d1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pykka/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, poetry-core
+, pytestCheckHook
+, pytest-mock
+}:
+
+buildPythonPackage rec {
+  pname = "pykka";
+  version = "3.1.1";
+  format = "pyproject";
+  disabled = pythonOlder "3.6.1";
+
+  src = fetchFromGitHub {
+    owner = "jodal";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-bvRjFpXufGygTgPfEOJOCXFbMy3dNlrTHlGoaIG/Fbs=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    pytest-mock
+  ];
+
+  meta = with lib; {
+    homepage = "https://www.pykka.org/";
+    description = "A Python implementation of the actor model";
+    changelog = "https://github.com/jodal/pykka/blob/v${version}/docs/changes.rst";
+    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..29a3f04e32cb
--- /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;
+    sha256 = "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..73508e3479cd
--- /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;
+    sha256 = "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..ba39dc536e2f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pykoplenti/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, click
+, fetchFromGitHub
+, prompt-toolkit
+, pycryptodome
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pykoplenti";
+  version = "1.0.0";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "stegm";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "12nsyz8a49vhby1jp991vaky82fm93jrgcsjzwa2rixwg1zql4sw";
+  };
+
+  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..1b36374b20b0
--- /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.1-1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Florian7843";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-0szkxR19iSWWpPAEo3wriMmI5TFI6YeYRTj86b4rKlU=";
+  };
+
+  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..0514b9eaeb40
--- /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.1";
+
+  disabled = pythonOlder "3.3";
+
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "dominiktraxl";
+    repo = "pykrakenapi";
+    rev = "v${version}";
+    hash = "sha256-gG0kbB3yaFU4DcBKupnBS7UFuU1hIMThdUHCuqufKzc=";
+  };
+
+  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..83a5b58c7f1c
--- /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.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "emlove";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-voD4tR+k5TKGjLXFK94GJy4+wUoP2cSFc5BWkCiinOg=";
+  };
+
+  propagatedBuildInputs = [
+    bleak
+    click
+  ];
+
+  checkInputs = [
+    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..cf42c98457cb
--- /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;
+    sha256 = "sha256-eWsq0+1MuZuIMItTP7L1WcMPpu+0+p/aETR/SD0kWIQ=";
+  };
+
+  propagatedBuildInputs = [
+    python-dateutil
+    docopt
+    pyyaml
+    ruamel-yaml
+  ];
+
+  checkInputs = [
+    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..74b244f52965
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pylacrosse/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, mock
+, nose
+, pyserial
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pylacrosse";
+  version = "0.4";
+
+  src = fetchFromGitHub {
+    owner = "hthiery";
+    repo = "python-lacrosse";
+    rev = version;
+    sha256 = "0g5hqm8lq0gsnvhcydjk54rjf7lpxzph8k7w1nnvnqfbhf31xfcf";
+  };
+
+  propagatedBuildInputs = [ pyserial ];
+
+  checkInputs = [
+    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..41e2b86202d7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pylama/default.nix
@@ -0,0 +1,81 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, substituteAll
+, git
+, eradicate
+, mccabe
+, mypy
+, pycodestyle
+, pydocstyle
+, pyflakes
+, vulture
+, 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
+    vulture
+  ];
+
+  # escape infinite recursion pylint -> isort -> pylama
+  doCheck = false;
+
+  checkInputs = [
+    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..1a101310d405
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pylast/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, flaky
+, httpx
+, importlib-metadata
+, pytestCheckHook
+, pythonOlder
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "pylast";
+  version = "5.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-UBi2bCtGMtcavYEDtz5m5N0UxmCaj3un5aomxzbfLfg=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    httpx
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  checkInputs = [
+    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; [ 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..496e7e6af2c3
--- /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" ];
+  checkInputs = [ 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..8f2ed7083580
--- /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.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "ludeeus";
+    repo = pname;
+    rev = version;
+    sha256 = "1b41j384lqg3gc7dsmdzp7anrsymqgc1895lc5j8g43x2mfgbjnh";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  checkInputs = [
+    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/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..51e3dfdab28f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pylgnetcast/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, requests
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pylgnetcast";
+  version = "0.3.7";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "Drafteed";
+    repo = "python-lgnetcast";
+    rev = "v${version}";
+    sha256 = "0pmz52k2sfxj5x2wcwdjks2lqh1gb5zfrjgc6xij8jal4l9xd2dz";
+  };
+
+  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";
+    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..6bc0d74b5bae
--- /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.6.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "88a0a4322e3a62d797d61f96ec7f38d1c471c48a3cc3cedb32ab5c20aa98d9ff";
+  };
+
+  # 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/pylibftdi/default.nix b/nixpkgs/pkgs/development/python-modules/pylibftdi/default.nix
new file mode 100644
index 000000000000..d4dd2d6781be
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pylibftdi/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, libftdi1
+, libusb1
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pylibftdi";
+  version = "0.20.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f4a87fc4af2c9c7d42badd4192ca9b529f32c9d96fdc8daea7e29c509226df5f";
+  };
+
+  propagatedBuildInputs = [
+    libftdi1
+    libusb1
+  ];
+
+  postPatch = ''
+    substituteInPlace 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; {
+    homepage = "https://pylibftdi.readthedocs.io/";
+    description = "Wrapper to Intra2net's libftdi driver for FTDI's USB devices";
+    license = licenses.mit;
+    maintainers = with maintainers; [ matthuszagh ];
+  };
+}
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..64f8e62c2862
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyliblo/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchurl
+, isPyPy
+, 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";
+  };
+
+  buildInputs = [ liblo cython ];
+
+  meta = with lib; {
+    homepage = "http://das.nasophon.de/pyliblo/";
+    description = "Python wrapper for the liblo OSC library";
+    license = licenses.lgpl21;
+  };
+
+}
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..039c793f20b2
--- /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.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-QatJ05VAdnN0iRvvC+tSkcqXvrcEi3r3dSEGSVPATcA=";
+  };
+
+  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..9de892352760
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pylink-square/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchFromGitHub
+, mock
+, psutil
+, six
+, future
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pylink-square";
+  version = "0.14.1";
+
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "square";
+    repo = "pylink";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-eCVNDPXtZAuzGb4ZOnjEmE1pKPOl52xRfZy+ppfxS3g=";
+  };
+
+  propagatedBuildInputs = [ psutil six future ];
+
+  checkInputs = [
+    mock
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "pylink" ];
+
+  meta = with lib; {
+    description = "Python interface for the SEGGER J-Link";
+    homepage = "https://github.com/square/pylink";
+    changelog = "https://github.com/square/pylink/blob/${src.rev}/CHANGELOG.md";
+    maintainers = with maintainers; [ dump_stack ];
+    license = licenses.asl20;
+  };
+}
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..e6d7c6bd63d3
--- /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
+  ];
+
+  checkInputs = [
+    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..46c12f0d0d07
--- /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
+  ];
+
+  checkInputs = [
+    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/default.nix b/nixpkgs/pkgs/development/python-modules/pylint/default.nix
new file mode 100644
index 000000000000..3bc20493dd64
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pylint/default.nix
@@ -0,0 +1,110 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, installShellFiles
+, astroid
+, dill
+, isort
+, mccabe
+, platformdirs
+, tomli
+, tomlkit
+, typing-extensions
+, GitPython
+, pytest-timeout
+, pytest-xdist
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pylint";
+  version = "2.14.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7.2";
+
+  src = fetchFromGitHub {
+    owner = "PyCQA";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-JTFGplqIA6WavwzKOkrm1rHBKNRrplBPvAdEkb/fTlI=";
+  };
+
+  nativeBuildInputs = [
+    installShellFiles
+  ];
+
+  propagatedBuildInputs = [
+    astroid
+    dill
+    isort
+    mccabe
+    platformdirs
+    tomlkit
+  ] ++ lib.optionals (pythonOlder "3.11") [
+    tomli
+  ] ++ lib.optionals (pythonOlder "3.9") [
+    typing-extensions
+  ];
+
+  postInstall = ''
+    mkdir -p $out/share/emacs/site-lisp
+    cp -v "elisp/"*.el $out/share/emacs/site-lisp/
+    installManPage man/*.1
+  '';
+
+  checkInputs = [
+    GitPython
+    # https://github.com/PyCQA/pylint/blob/main/requirements_test_min.txt
+    pytest-timeout
+    pytest-xdist
+    pytestCheckHook
+    typing-extensions
+  ];
+
+  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"
+  ] ++ lib.optionals stdenv.isDarwin [
+    "test_parallel_execution"
+    "test_py3k_jobs_option"
+  ];
+
+  meta = with lib; {
+    homepage = "https://pylint.pycqa.org/";
+    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; [ SuperSandro2000 ];
+  };
+}
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..cdb971b6a7b5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pylitterbot/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, authlib
+, buildPythonPackage
+, fetchFromGitHub
+, httpx
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, pytz
+}:
+
+buildPythonPackage rec {
+  pname = "pylitterbot";
+  version = "2022.7.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "natekspencer";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-iniSlsZVWdDuwM/6asX4xyVrtrQvt7wEBwDVutjCogU=";
+  };
+
+  propagatedBuildInputs = [
+    authlib
+    httpx
+    pytz
+  ];
+
+  checkInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pylitterbot"
+  ];
+
+  meta = with lib; {
+    description = "Python package for controlling a Litter-Robot";
+    homepage = "https://github.com/natekspencer/pylitterbot";
+    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..bfb180319897
--- /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";
+    sha256 = "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/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-black/default.nix b/nixpkgs/pkgs/development/python-modules/pyls-black/default.nix
new file mode 100644
index 000000000000..128c8cbd0de2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyls-black/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, black
+, toml
+, pytestCheckHook
+, python-language-server
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "pyls-black";
+  version = "0.4.7";
+
+  src = fetchFromGitHub {
+    owner = "rupert";
+    repo = "pyls-black";
+    rev = "v${version}";
+    sha256 = "0bkhfnlik89j3yamr20br4wm8975f20v33wabi2nyxvj10whr5dj";
+  };
+
+  disabled = !isPy3k;
+
+  checkInputs = [ pytestCheckHook ];
+
+  propagatedBuildInputs = [ black toml python-language-server ];
+
+  meta = with lib; {
+    homepage = "https://github.com/rupert/pyls-black";
+    description = "Black plugin for the Python Language Server";
+    license = licenses.mit;
+    maintainers = [ ];
+  };
+}
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-mypy/default.nix b/nixpkgs/pkgs/development/python-modules/pyls-mypy/default.nix
new file mode 100644
index 000000000000..acce4469eed4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyls-mypy/default.nix
@@ -0,0 +1,51 @@
+{ lib, buildPythonPackage, fetchFromGitHub, isPy27
+, future, python-language-server, mypy, configparser
+, pytestCheckHook, mock, pytest-cov, coverage
+, fetchpatch
+}:
+
+buildPythonPackage rec {
+  pname = "pyls-mypy";
+  version = "0.1.8";
+
+  src = fetchFromGitHub {
+    owner = "tomv564";
+    repo = "pyls-mypy";
+    rev = version;
+    sha256 = "14giyvcrq4w3asm1nyablw70zkakkcsr76chk5a41alxlk4l2alb";
+  };
+
+  # presumably tests don't find typehints ?
+  doCheck = false;
+
+  disabledTests = [
+    "test_parse_line_without_line"
+  ];
+
+  preCheck = ''
+    export HOME=$TEMPDIR
+  '';
+
+  patches = [
+    # makes future optional
+    (fetchpatch {
+      url = "https://github.com/tomv564/pyls-mypy/commit/2949582ff5f39b1de51eacc92de6cfacf1b5ab75.patch";
+      sha256 = "0bqkvdy5mxyi46nhq5ryynf465f68b6ffy84hmhxrigkapz085g5";
+    })
+  ];
+
+  checkInputs = [ mock pytest-cov coverage pytestCheckHook ];
+
+  propagatedBuildInputs = [
+    mypy python-language-server configparser
+  ] ++ lib.optional (isPy27) [
+    future
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/tomv564/pyls-mypy";
+    description = "Mypy plugin for the Python Language Server";
+    license = licenses.mit;
+    maintainers = [ ];
+  };
+}
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..61b0fa7449bc
--- /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
+  ];
+
+  checkInputs = [
+    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; [ SuperSandro2000 ];
+  };
+}
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..c9f263ad2b08
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pylsp-mypy/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, mock
+, mypy
+, pytestCheckHook
+, python-lsp-server
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pylsp-mypy";
+  version = "0.6.2";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "Richardk2n";
+    repo = "pylsp-mypy";
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-uOfNSdQ1ONybEiYXW6xDHfUH+0HY9bxDlBCNl3xHEn8=";
+  };
+
+  disabledTests = [
+    "test_multiple_workspaces"
+    "test_option_overrides_dmypy"
+  ];
+
+  checkInputs = [ pytestCheckHook mock ];
+
+  propagatedBuildInputs = [ mypy python-lsp-server ];
+
+  pythonImportsCheck = [ "pylsp_mypy" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/Richardk2n/pylsp-mypy";
+    description = "Mypy plugin for the Python LSP Server";
+    license = licenses.mit;
+    maintainers = with maintainers; [ cpcloud ];
+  };
+}
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..80fa5bff3200
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pylti/default.nix
@@ -0,0 +1,51 @@
+{ 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 ];
+  checkInputs = [
+    flask httpretty oauthlib pyflakes pytest pytestcache pytest-cov covCore
+    pytest-flakes sphinx mock chalice
+  ];
+
+  src = fetchPypi {
+    inherit pname 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..1bbbcf308900
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pylutron-caseta/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, cryptography
+, fetchFromGitHub
+, pytest-asyncio
+, pytest-sugar
+, pytest-timeout
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pylutron-caseta";
+  version = "0.14.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "gurumitts";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-D1P4roUZ+byU031RtdwIOR/ncxY9wl9UqCKVb/XPGVk=";
+  };
+
+  propagatedBuildInputs = [
+    cryptography
+  ];
+
+  checkInputs = [
+    pytest-asyncio
+    pytest-sugar
+    pytest-timeout
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "--asyncio-mode=legacy"
+  ];
+
+  pythonImportsCheck = [
+    "pylutron_caseta"
+  ];
+
+  meta = with lib; {
+    description = "Python module o control Lutron Caseta devices";
+    homepage = "https://github.com/gurumitts/pylutron-caseta";
+    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..4bf56d5e6edc
--- /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.9";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-xy5XPNOrvdPZMCfa2MYA+xtUcFdGSurW5QYL6H7n2VI=";
+  };
+
+  # 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..3373daf8a796
--- /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;
+    sha256 = "sha256-eDRCJYjmBndMnSNuS6HD/2p/KhzqJq2qPAzMk7kC5UM=";
+  };
+
+  propagatedBuildInputs = [
+    cryptography
+    python-dateutil
+    requests
+    requests-toolbelt
+    requests-unixsocket
+    ws4py
+  ];
+
+  checkInputs = [
+    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..df511b1c4c0f
--- /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";
+    sha256 = "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; [ SuperSandro2000 ];
+  };
+}
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/pymaging/default.nix b/nixpkgs/pkgs/development/python-modules/pymaging/default.nix
new file mode 100644
index 000000000000..8869924bddba
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymaging/default.nix
@@ -0,0 +1,24 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+}:
+
+buildPythonPackage {
+  pname = "pymaging";
+  version = "unstable-2016-11-16";
+
+  src = fetchFromGitHub {
+    owner = "ojii";
+    repo = "pymaging";
+    rev = "596a08fce5664e58d6e8c96847393fbe987783f2";
+    sha256 = "18g3n7kfrark30l4vzykh0gdbnfv5wb1zvvjbs17sj6yampypn38";
+  };
+
+  meta = with lib; {
+    description = "Pure Python imaging library with Python 2.6, 2.7, 3.1+ support";
+    homepage    = "http://pymaging.rtfd.org";
+    license     = licenses.mit;
+    maintainers = with maintainers; [ mic92 ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pymaging_png/default.nix b/nixpkgs/pkgs/development/python-modules/pymaging_png/default.nix
new file mode 100644
index 000000000000..6d12ddd40062
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymaging_png/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pymaging
+}:
+
+buildPythonPackage {
+  pname = "pymaging-png";
+  version = "unstable-2016-11-16";
+
+  src = fetchFromGitHub {
+    owner = "ojii";
+    repo = "pymaging-png";
+    rev = "83d85c44e4b2342818e6c068065e031a9f81bb9f";
+    sha256 = "1mknxvsq0lr1ffm8amzm3w2prn043c6ghqgpxlkw83r988p5fn57";
+  };
+
+  propagatedBuildInputs = [ pymaging ];
+
+  meta = with lib; {
+    description = "Pure Python imaging library with Python 2.6, 2.7, 3.1+ support";
+    homepage    = "https://github.com/ojii/pymaging-png/";
+    license     = licenses.mit;
+    maintainers = with maintainers; [ mic92 ];
+  };
+
+}
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..f04357596852
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymanopt/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, numpy
+, scipy
+, pytorch
+, autograd
+, nose2
+, matplotlib
+, tensorflow
+}:
+
+buildPythonPackage rec {
+  pname = "pymanopt";
+  version = "2.0.0";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-dqyduExNgXIbEFlgkckaPfhLFSVLqPgwAOyBUdowwiQ=";
+  };
+
+  propagatedBuildInputs = [ numpy scipy pytorch ];
+  checkInputs = [ nose2 autograd matplotlib tensorflow ];
+
+  checkPhase = ''
+    runHook preCheck
+    # FIXME: Some numpy regression?
+    # Traceback (most recent call last):
+    #   File "/build/source/tests/manifolds/test_hyperbolic.py", line 270, in test_second_order_function_approximation
+    #     self.run_hessian_approximation_test()
+    #   File "/build/source/tests/manifolds/_manifold_tests.py", line 29, in run_hessian_approximation_test
+    #     assert np.allclose(np.linalg.norm(error), 0) or (2.95 <= slope <= 3.05)
+    # AssertionError
+    rm tests/manifolds/test_hyperbolic.py
+
+    nose2 tests -v
+    runHook postCheck
+  '';
+
+  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 ];
+  };
+}
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..7da938526422
--- /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;
+    sha256 = "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
+  ];
+
+  checkInputs = [
+    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-lammps/default.nix b/nixpkgs/pkgs/development/python-modules/pymatgen-lammps/default.nix
new file mode 100644
index 000000000000..87d46a35fa84
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymatgen-lammps/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, fetchurl
+, buildPythonPackage
+, pymatgen
+, pytest-runner
+, pytestCheckHook
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "pymatgen-lammps";
+  version = "0.4.5";
+  disabled = !isPy3k;
+
+  src = fetchurl {
+     url = "https://gitlab.com/costrouc/${pname}/-/archive/v${version}/${pname}-v${version}.tar.gz";
+     sha256 = "0shldl8is3195jmji7dr3zsh1bzxlahaqrmpr28niks7nnfj80fx";
+  };
+
+  buildInputs = [ pytest-runner ];
+  checkInputs = [ pytestCheckHook ];
+  propagatedBuildInputs = [ pymatgen ];
+
+  pythonImportsCheck = [ "pmg_lammps" ];
+
+  meta = {
+    description = "A LAMMPS wrapper using pymatgen";
+    homepage = "https://gitlab.com/costrouc/pymatgen-lammps";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ costrouc ];
+    # not compatible with recent versions of pymatgen
+    broken = true;
+  };
+}
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/pymaven-patch/default.nix b/nixpkgs/pkgs/development/python-modules/pymaven-patch/default.nix
new file mode 100644
index 000000000000..e3a70ede0602
--- /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
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    pytest-cov
+    mock
+  ];
+
+  pythonImportsCheck = [
+    "pymaven"
+  ];
+
+  meta = with lib; {
+    description = "Python access to maven";
+    homepage = "https://github.com/nexB/pymaven";
+    license = licenses.asl20;
+    maintainers = teams.determinatesystems.members;
+  };
+}
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..2e71e58e7c30
--- /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.34";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-2JPBjEXiJWDJJPwS7SjNr3L4Ct+U44QaJiiv8MtSnEk=";
+  };
+
+  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/pymazda/default.nix b/nixpkgs/pkgs/development/python-modules/pymazda/default.nix
new file mode 100644
index 000000000000..7515c8fe9d2a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymazda/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, cryptography
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pymazda";
+  version = "0.3.7";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-1xreFjoHmdMirpxjVya30cw31fBaCPt877yqTr9By+A=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    cryptography
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pymazda"
+  ];
+
+  meta = with lib; {
+    description = "Python client for interacting with the MyMazda API";
+    homepage = "https://github.com/bdr99/pymazda";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..44aa012d57d0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymbolic/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, matchpy
+, pytestCheckHook
+, pythonOlder
+, pytools
+}:
+
+buildPythonPackage rec {
+  pname = "pymbolic";
+  version = "2022.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-tS9FHdC5gD4D3jMgrzt85XIwcAYcbSMcACFvbaQlkBI=";
+  };
+
+  propagatedBuildInputs = [
+    pytools
+  ];
+
+  checkInputs = [
+    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; [ costrouc ];
+  };
+}
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..ba9b82b35297
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymc/default.nix
@@ -0,0 +1,71 @@
+{ lib
+, aeppl
+, aesara
+, arviz
+, buildPythonPackage
+, cachetools
+, cloudpickle
+, fastprogress
+, fetchFromGitHub
+, numpy
+, pythonOlder
+, pythonRelaxDepsHook
+, scipy
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "pymc";
+  version = "4.1.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "pymc-devs";
+    repo = "pymc";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-fqhtfMGopzVgonF5+qyFhm72KV0hX8QE95slI/HBZYU=";
+  };
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+  ];
+
+  propagatedBuildInputs = [
+    aeppl
+    aesara
+    arviz
+    cachetools
+    cloudpickle
+    fastprogress
+    numpy
+    scipy
+    typing-extensions
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace ', "pytest-cov"' ""
+  '';
+
+  pythonRelaxDeps = [
+    "aesara"
+    "aeppl"
+  ];
+
+  # 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";
+    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..08749312580c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymdown-extensions/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, hatchling
+, pytestCheckHook
+, markdown
+, pyyaml
+, pygments
+}:
+
+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 = "9.5";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "facelessuser";
+    repo = "pymdown-extensions";
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-bgvoY+8bbGoG1A93A+Uan1UDpQmEUu/TJu3FOkXechQ=";
+  };
+
+  nativeBuildInputs = [ hatchling ];
+
+  propagatedBuildInputs = [ markdown pygments ];
+
+  checkInputs = [
+    pytestCheckHook
+    pyyaml
+  ];
+
+  pythonImportsCheck = map (ext: "pymdownx.${ext}") extensions;
+
+  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..50ea8c5cef0d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymediainfo/default.nix
@@ -0,0 +1,40 @@
+{ lib, stdenv, fetchPypi, buildPythonPackage
+, libmediainfo
+, setuptools-scm
+, pytest, glibcLocales }:
+
+buildPythonPackage rec {
+  pname = "pymediainfo";
+  version = "5.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d996c69d50081a24d6dca9679abf43ffd2be368b065f953c2c9082e5d649c734";
+  };
+
+  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 ];
+
+  checkInputs = [ glibcLocales pytest ];
+
+  checkPhase = ''
+    export LC_ALL=en_US.UTF-8
+    py.test -k 'not test_parse_url' tests
+  '';
+
+  meta = with lib; {
+    description = "Python wrapper for the mediainfo library";
+    homepage = "https://github.com/sbraz/pymediainfo";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jfrankenau ];
+  };
+}
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/pymeeus/default.nix b/nixpkgs/pkgs/development/python-modules/pymeeus/default.nix
new file mode 100644
index 000000000000..162f3ab55966
--- /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.11";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "bb9d670818d8b0594317b48a7dadea02a0594e5344263bf2054e1a011c8fed55";
+  };
+
+  checkInputs = [ 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..ed06b347b694
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymelcloud/default.nix
@@ -0,0 +1,45 @@
+{ 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
+  ];
+
+  checkInputs = [
+    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..c9d3ef94d778
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymemcache/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, mock
+, six
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pymemcache";
+  version = "3.5.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "pinterest";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-bsiFWZHGJO/07w6mFXzf0JwftJWClE2mTv86h8zT1K0=";
+  };
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  checkInputs = [
+    mock
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    sed -i "/--cov/d" setup.cfg
+  '';
+
+  disabledTests = [
+    # python-memcached is not available (last release in 2017)
+    "TestClientSocketConnect"
+  ];
+
+  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..f66a6ef702b0
--- /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";
+  };
+
+  checkInputs = [ 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/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..db150342a2a3
--- /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
+  ];
+
+  checkInputs = [
+    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..f3dcdf6c45a7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymetno/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, aiohttp
+, async-timeout
+, pytz
+, xmltodict
+}:
+
+buildPythonPackage rec {
+  pname = "pymetno";
+  version = "0.9.0";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "Danielhiversen";
+    repo = "PyMetno";
+    rev = version;
+    sha256 = "sha256-2LNDFQObGqxrzswnqbmvCGLxEI0j+cIdv8o+RZM/7sM=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    async-timeout
+    pytz
+    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/";
+    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..e48966e9da06
--- /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
+  ];
+
+  checkInputs = [
+    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..e6ca92f0e2e4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymicrobot/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, bleak
+, bleak-retry-connector
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pymicrobot";
+  version = "0.0.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchPypi {
+    pname = "PyMicroBot";
+    inherit version;
+    hash = "sha256-lXBL1G/rZrQah/zcVH1dFyKXO5jGB9XhmXmiKKIAbT4=";
+  };
+
+  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/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..32f90d07dcb4
--- /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;
+    sha256 = "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..41babc82175e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymodbus/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, aiohttp
+, asynctest
+, buildPythonPackage
+, click
+, fetchFromGitHub
+, mock
+, prompt-toolkit
+, pygments
+, pyserial
+, pyserial-asyncio
+, pytestCheckHook
+, redis
+, sqlalchemy
+, tornado
+, twisted
+}:
+
+buildPythonPackage rec {
+  pname = "pymodbus";
+  version = "2.5.3";
+
+  src = fetchFromGitHub {
+    owner = "riptideio";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-pf1TU/imBqNVYdG4XX8fnma8O8kQHuOHu6DT3E/PUk4=";
+  };
+
+  # Twisted asynchronous version is not supported due to a missing dependency
+  propagatedBuildInputs = [
+    aiohttp
+    click
+    prompt-toolkit
+    pygments
+    pyserial
+    pyserial-asyncio
+    tornado
+  ];
+
+  checkInputs = [
+    asynctest
+    mock
+    pytestCheckHook
+    redis
+    sqlalchemy
+    twisted
+  ];
+
+  pythonImportsCheck = [ "pymodbus" ];
+
+  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/riptideio/pymodbus";
+    license = with licenses; [ bsd3 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..9ebe37f4b8da
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymongo/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pymongo";
+  version = "4.1.1";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-17jyXJsAQ8uvd7i4lYFOM+ejyAeglzd8B+G9SZRgMNU=";
+  };
+
+  # 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/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/pympler/default.nix b/nixpkgs/pkgs/development/python-modules/pympler/default.nix
new file mode 100644
index 000000000000..6fc917981a7f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pympler/default.nix
@@ -0,0 +1,34 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "Pympler";
+  version = "1.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "993f1a3599ca3f4fcd7160c7545ad06310c9e12f70174ae7ae8d4e25f6c5d3fa";
+  };
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # 'AssertionError: 'function (test.muppy.test_summary.func)' != 'function (muppy.test_summary.func)'
+    # https://github.com/pympler/pympler/issues/134
+    "test_repr_function"
+  ];
+
+  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..760a339b90af
--- /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;
+    sha256 = "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..0f452607518b
--- /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.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "rveachkc";
+    repo = pname;
+    rev = version;
+    sha256 = "03lna3p8qkmsmaz2nzl76dnz6rci08wsybvr151zl8wwpjdj1sam";
+  };
+
+  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..35cbbc31bb02
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymumble/default.nix
@@ -0,0 +1,50 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, isPy27
+, lib
+, opuslib
+, protobuf
+, pytestCheckHook
+, pycrypto
+}:
+
+buildPythonPackage rec {
+  pname = "pymumble";
+  version = "1.6.1";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "azlux";
+    repo = "pymumble";
+    rev = version;
+    sha256 = "1qbsd2zvwd9ksclgiyrl1z79ms0zximm4527mnmhvq36lykgki7s";
+  };
+
+  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
+  ];
+
+  checkInputs = [
+    pycrypto
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pymumble_py3"
+    "pymumble_py3.constants"
+  ];
+
+  meta = with lib; {
+    description = "Python 3 version of pymumble, Mumble library used for multiple uses like making mumble bot.";
+    homepage = "https://github.com/azlux/pymumble";
+    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..f1cc51ec0aab
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymunk/default.nix
@@ -0,0 +1,43 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchPypi
+, python
+, cffi
+, pytestCheckHook
+, ApplicationServices
+}:
+
+buildPythonPackage rec {
+  pname = "pymunk";
+  version = "6.2.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "18ae0f83ec2dc20892b98c84127ce9149ab40fa3c3120097377e1506884b27b8";
+  };
+
+  propagatedBuildInputs = [ cffi ];
+  buildInputs = lib.optionals stdenv.isDarwin [
+    ApplicationServices
+  ];
+
+  preBuild = ''
+    ${python.interpreter} setup.py build_ext --inplace
+  '';
+
+  checkInputs = [ pytestCheckHook ];
+  pytestFlagsArray = [
+    "pymunk/tests"
+  ];
+  pythonImportsCheck = [ "pymunk" ];
+
+  meta = with lib; {
+    description = "2d physics library";
+    homepage = "https://www.pymunk.org";
+    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..daf2197f8337
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymupdf/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, mupdf
+, swig
+, freetype
+, harfbuzz
+, openjpeg
+, jbig2dec
+, libjpeg_turbo
+, gumbo
+}:
+
+buildPythonPackage rec {
+  pname = "pymupdf";
+  version = "1.20.2";
+
+  src = fetchPypi {
+    pname = "PyMuPDF";
+    inherit version;
+    sha256 = "sha256-Au7fAfV8a6+16GZ86gCIotJSJkPEcQDxkIvsOmioSIg=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+        --replace '/usr/include/mupdf' ${mupdf.dev}/include/mupdf
+  '';
+  nativeBuildInputs = [ swig ];
+  buildInputs = [ mupdf freetype harfbuzz openjpeg jbig2dec libjpeg_turbo gumbo ];
+
+  doCheck = false;
+
+  pythonImportsCheck = [ "fitz" ];
+
+  meta = with lib; {
+    description = "Python bindings for MuPDF's rendering library.";
+    homepage = "https://github.com/pymupdf/PyMuPDF";
+    maintainers = with maintainers; [ teto ];
+    license = licenses.agpl3Only;
+    platforms = platforms.linux;
+  };
+}
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..e2c2e8f05a1c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymvglive/default.nix
@@ -0,0 +1,19 @@
+{ lib, buildPythonPackage, fetchPypi, requests }:
+
+buildPythonPackage rec {
+  pname = "PyMVGLive";
+  version = "1.1.4";
+
+  src = fetchPypi {
+    inherit pname 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/pymyq/default.nix b/nixpkgs/pkgs/development/python-modules/pymyq/default.nix
new file mode 100644
index 000000000000..94ff699507e1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymyq/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, aiohttp
+, beautifulsoup4
+, buildPythonPackage
+, fetchFromGitHub
+, pkce
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pymyq";
+  version = "3.1.5";
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "arraylabs";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-/2eWB4rtHPptfc8Tm0CGk0UB+Hq1EmNhWmdrpPiUJcw=";
+  };
+
+  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/arraylabs/pymyq";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..d071743d748d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymysensors/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, click
+, crcmod
+, fetchFromGitHub
+, getmac
+, intelhex
+, paho-mqtt
+, pyserial
+, pyserial-asyncio
+, pytest-sugar
+, pytest-timeout
+, pytestCheckHook
+, pythonOlder
+, voluptuous
+}:
+
+buildPythonPackage rec {
+  pname = "pymysensors";
+  version = "0.23.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "theolind";
+    repo = pname;
+    rev = version;
+    sha256 = "0a09w1bzz2pn0w11f7kx8052914kdpgfb7w6hc9s50x8wl9q604h";
+  };
+
+  propagatedBuildInputs = [
+    click
+    crcmod
+    getmac
+    intelhex
+    paho-mqtt
+    pyserial
+    pyserial-asyncio
+    voluptuous
+  ];
+
+  checkInputs = [
+    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..8c909b868b39
--- /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 ];
+  checkInputs = [ 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..f34956d7280f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pynacl/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+, libsodium
+, cffi
+, hypothesis
+}:
+
+buildPythonPackage rec {
+  pname = "pynacl";
+  version = "1.5.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "PyNaCl";
+    sha256 = "8ac7448f09ab85811607bdd21ec2464495ac8b7c66d146bf545b0f08fb9220ba";
+  };
+
+  buildInputs = [
+    libsodium
+  ];
+
+  propagatedNativeBuildInputs = [
+    cffi
+  ];
+
+  propagatedBuildInputs = [
+    cffi
+  ];
+
+  checkInputs = [
+    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..d3b39457438c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pynamodb/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, botocore
+, fetchPypi
+, mock
+, mypy
+, python-dateutil
+, pytest
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "pynamodb";
+  version = "5.2.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-x6nFV7UjZLwJJX7dADeO68dSWLvaoP4FD8ziNWFJ+Qo=";
+  };
+
+  propagatedBuildInputs = [ python-dateutil botocore ];
+  checkInputs = [ requests mock pytest mypy ];
+
+  meta = with lib; {
+    description = "A Pythonic interface for Amazon’s DynamoDB that supports Python 2 and 3.";
+    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";
+    license = licenses.mit;
+  };
+}
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..43161880e26b
--- /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";
+  };
+
+  checkInputs = [ 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..dd290ad5782a
--- /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;
+    sha256 = "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..e92776e72a29
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pynetbox/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools-scm
+, requests
+, six
+, pytestCheckHook
+, pyyaml
+}:
+
+buildPythonPackage rec {
+  pname = "pynetbox";
+  version = "6.6.2";
+
+  src = fetchFromGitHub {
+    owner = "netbox-community";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-W5ukrhqJTgOXM9MnbZWvNy9TCoEUGrFYfD+zGGNU07w=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    requests
+    six
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    pyyaml
+  ];
+
+  disabledTestPaths = [
+    # requires docker for integration test
+    "tests/integration"
+  ];
+
+  meta = with lib; {
+    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..52860b00174b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pynetdicom/default.nix
@@ -0,0 +1,80 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, 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=";
+  };
+
+  propagatedBuildInputs = [
+    pydicom
+  ];
+
+  checkInputs = [
+    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..09b3426f6d9a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pynetgear/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, requests
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pynetgear";
+  version = "0.10.7";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "MatMaul";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-dYpYUeZClfRGrhd5Rw7MzBQkyGURQTeQVtCc51AqXb4=";
+  };
+
+  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";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..be81bd6e6557
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pynina/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pynina";
+  version = "0.1.8";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "PyNINA";
+    inherit version;
+    sha256 = "sha256-U8/SzkkZJLRBpTQx8NRpFWUlckn4Jr0n9cHR4/plyb0=";
+  };
+
+  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";
+    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..942192c57dc5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pynisher/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, docutils
+, fetchPypi
+, psutil
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pynisher";
+  version = "0.6.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-ER2RqtRxN1wFCakSQV/5AFPvkJEA+s9BJRE4OvEHwSQ=";
+  };
+
+  propagatedBuildInputs = [
+    psutil
+    docutils
+  ];
+
+  # 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/sfalkner/pynisher";
+    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..4a4fbfd4dc6b
--- /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.18.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1b94lhpbgvnknb563dlwvs5vkk7w3ma54sj614ynh2dzgqrd6h73";
+  };
+
+  checkInputs = [ 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..8389a7ae9c1f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pynndescent/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, joblib
+, llvmlite
+, numba
+, scikit-learn
+, scipy
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pynndescent";
+  version = "0.5.7";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-7LOVJV+janSLWHC0ugMA6g99qLGWSGS47dYld6hN/X0=";
+  };
+
+  propagatedBuildInputs = [
+    joblib
+    llvmlite
+    numba
+    scikit-learn
+    scipy
+  ];
+
+  checkInputs = [
+    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..e70010901ef5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pynobo/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+}:
+
+buildPythonPackage rec {
+  pname = "pynobo";
+  version = "1.3.0";
+
+  src = fetchFromGitHub {
+    owner = "echoromeo";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-tcDSI5GODV53o4m35B4CXscVCnwt7gqRu7qohEnvyz8=";
+  };
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "pynobo" ];
+
+  meta = with lib; {
+    description = "Python 3 TCP/IP interface for Nobo Hub/Nobo Energy Control devices";
+    homepage = "https://github.com/echoromeo/pynobo";
+    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..394c6f87b65c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pynput/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, sphinx, setuptools-lint, xlib, evdev }:
+
+buildPythonPackage rec {
+  pname = "pynput";
+  version = "1.7.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3a5726546da54116b687785d38b1db56997ce1d28e53e8d22fc656d8b92e533c";
+  };
+
+  nativeBuildInputs = [ sphinx ];
+
+  propagatedBuildInputs = [ setuptools-lint xlib ]
+  ++ lib.optionals stdenv.isLinux [
+    evdev
+  ];
+
+  doCheck = false;
+
+  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..91cff70bae35
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pynrrd/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, numpy
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pynrrd";
+  version = "0.4.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "mhe";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-4UM2NAKWfsjxAoLQCFSPVKG5GukxqppywqvLM0V/dIs=";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  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..58c7f1df15b7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pynuki/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, requests
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pynuki";
+  version = "1.5.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "pschmitt";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-Uqw1Xa0pBQmQsFEBv/l1gtsPy+owYcTZITOYUmMvT5Y=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'requests = ">=2.27,<3"' 'requests = "*"'
+  '';
+
+  nativeBuildInputs = [ poetry-core ];
+
+  propagatedBuildInputs = [
+    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";
+    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/default.nix b/nixpkgs/pkgs/development/python-modules/pynvim/default.nix
new file mode 100644
index 000000000000..6ae98eff28d3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pynvim/default.nix
@@ -0,0 +1,38 @@
+{ buildPythonPackage
+, fetchPypi
+, lib
+, msgpack
+, greenlet
+, pythonOlder
+, isPyPy
+, pytest-runner
+}:
+
+buildPythonPackage rec {
+  pname = "pynvim";
+  version = "0.4.3";
+  disabled = pythonOlder "3.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-OnlTeL3l6AkvvrOhqZvpxhPSaFVC8dsOXG/UZ+7Vbf8=";
+  };
+
+  nativeBuildInputs = [
+    pytest-runner
+  ];
+
+  # Tests require pkgs.neovim,
+  # which we cannot add because of circular dependency.
+  doCheck = false;
+
+  propagatedBuildInputs = [ msgpack ]
+    ++ lib.optional (!isPyPy) greenlet;
+
+  meta = {
+    description = "Python client for Neovim";
+    homepage = "https://github.com/neovim/python-client";
+    license = lib.licenses.asl20;
+    maintainers = with lib.maintainers; [ ];
+  };
+}
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..63d445e0923f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pynvml/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, cudatoolkit
+}:
+
+buildPythonPackage rec {
+  pname = "pynvml";
+  version = "11.4.1";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b2e4a33b80569d093b513f5804db0c7f40cfc86f15a013ae7a8e99c5e175d5dd";
+  };
+
+  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..eb19d273459b
--- /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.4.1";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "MatthewFlamm";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-hAUD92wlQZ0BZ++e/KdIOgTzavmUkrH3esDhI3mbl5Y=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    metar
+  ];
+
+  checkInputs = [
+    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..0b7ca74468a0
--- /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";
+  disabled = pythonOlder "3.6";
+
+
+  src = fetchFromGitHub {
+    owner = "kk7ds";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-aTwAQnz3my58MgXNe61lStLth6PZXLVLLDI2HUJiNm8=";
+  };
+
+  propagatedBuildInputs = [
+    flask
+    prettytable
+    pyserial
+    requests
+    stevedore
+  ];
+
+  checkInputs = [
+    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..0cc62311f329
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyobihai/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "pyobihai";
+  version = "1.3.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  # GitHub release, https://github.com/dshokouhi/pyobihai/issues/10
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-zhsnJyhXlugK0nJ7FJZZcrq2VDQt1a9uCgsJAIABZ28=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pyobihai"
+  ];
+
+  meta = with lib; {
+    description = "Python package to interact with Obihai devices";
+    homepage = "https://github.com/dshokouhi/pyobihai";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..b8f9564a4ffe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyocr/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, fetchFromGitLab
+, buildPythonPackage
+, pillow
+, setuptools-scm
+, setuptools-scm-git-archive
+, tesseract
+, cuneiform
+, isPy3k
+, substituteAll
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pyocr";
+  version = "0.7.2";
+  disabled = !isPy3k;
+
+  # 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;
+    sha256 = "09ab86bmizpv94w3mdvdqkjyyvk1vafw3jqhkiw5xx7p180xn3il";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./paths.patch;
+      inherit cuneiform tesseract;
+    })
+  ];
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  buildInputs = [ setuptools-scm setuptools-scm-git-archive ];
+
+  propagatedBuildInputs = [ pillow ];
+
+  checkInputs = [ pytestCheckHook ];
+
+  meta = with lib; {
+    inherit (src.meta) homepage;
+    description = "A Python wrapper for Tesseract and Cuneiform";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ ];
+  };
+}
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..55cbf7d48da4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyocr/paths.patch
@@ -0,0 +1,348 @@
+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 a068e73..9ebea5c 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,48 +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):  # pragma: no cover
+-    # 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 = 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.4",
+-        "libtesseract.so.3",
+-    ]
+-
++libnames = [ "@tesseract@/lib/libtesseract.so" ]
+ 
+ g_libtesseract = None
+ 
+@@ -364,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 7c30852..44e8446 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/tests_cuneiform.py b/tests/tests_cuneiform.py
+index 45b7f6a..95f55c6 100644
+--- a/tests/tests_cuneiform.py
++++ b/tests/tests_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
+         )
+ 
+@@ -109,7 +109,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
+         )
+@@ -125,7 +125,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
+@@ -142,7 +142,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
+         )
+@@ -173,7 +173,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
+         )
+@@ -227,7 +227,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
+         )
+@@ -280,7 +280,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/tests_libtesseract.py b/tests/tests_libtesseract.py
+index ad7fdc9..57e7a60 100644
+--- a/tests/tests_libtesseract.py
++++ b/tests/tests_libtesseract.py
+@@ -165,7 +165,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(
+@@ -201,7 +202,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/tests_tesseract.py b/tests/tests_tesseract.py
+index 1a55567..a24d96f 100644
+--- a/tests/tests_tesseract.py
++++ b/tests/tests_tesseract.py
+@@ -36,7 +36,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):
+@@ -156,7 +156,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
+         )
+@@ -171,7 +171,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
+         )
+@@ -248,7 +248,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,
+@@ -271,7 +271,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,
+@@ -302,7 +302,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,
+@@ -338,7 +338,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,
+@@ -371,7 +371,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,
+@@ -399,7 +399,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,
+@@ -433,7 +433,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,
+@@ -467,7 +467,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,
+@@ -500,7 +500,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,
+@@ -527,7 +527,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,
+@@ -561,7 +561,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..a61f38ebc8c2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyoctoprintapi/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+
+# propagated
+, aiohttp
+
+# tests
+, pytest-asyncio
+, pytestCheckHook
+}:
+
+let
+  pname = "pyoctoprintapi";
+  version = "0.1.8";
+in
+buildPythonPackage {
+  inherit pname version;
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "rfleming71";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-TeMgEwKVZd0gq8J0kYsg0/v6A2BVTOE0/VmyiyrjV5c=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  pythonImportsCheck = [
+    "pyoctoprintapi"
+  ];
+
+  checkInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Simple async wrapper around the Octoprint API";
+    homepage = "https://github.com/rfleming71/pyoctoprintapi";
+    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..e62417b2df3a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyodbc/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchPypi, isPyPy, unixODBC }:
+
+buildPythonPackage rec {
+  pname = "pyodbc";
+  version = "4.0.34";
+  disabled = isPyPy; # use pypypdbc instead
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-fqeGlTK5a41Smx8I6oV2X5TffkpY6Wiy+NRVNGoD5Fw=";
+  };
+
+  buildInputs = [ unixODBC ];
+
+  doCheck = false; # tests require a database server
+
+  pythonImportsCheck = [ "pyodbc" ];
+
+  meta = with lib; {
+    description = "Python ODBC module to connect to almost any database";
+    homepage = "https://github.com/mkleehammer/pyodbc";
+    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..3a9a80d57812
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyomo/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, parameterized
+, ply
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyomo";
+  version = "6.4.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    repo = "pyomo";
+    owner = "pyomo";
+    rev = "refs/tags/${version}";
+    hash = "sha256-LwlUib/CeVCCmgpTHtYHcFyxk9Esx1zhZ3yGHeGpugY=";
+  };
+
+  propagatedBuildInputs = [
+    ply
+  ];
+
+  checkInputs = [
+    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";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ costrouc ];
+  };
+}
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..7016478cabd4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyopencl/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, stdenv
+, fetchPypi
+, buildPythonPackage
+, appdirs
+, cffi
+, decorator
+, Mako
+, mesa_drivers
+, numpy
+, ocl-icd
+, opencl-headers
+, platformdirs
+, pybind11
+, pytest
+, pytools
+, six
+}:
+
+let
+  os-specific-buildInputs =
+    if stdenv.isDarwin then [ mesa_drivers.dev ] else [ ocl-icd ];
+in buildPythonPackage rec {
+  pname = "pyopencl";
+  version = "2022.1.6";
+
+  checkInputs = [ pytest ];
+  buildInputs = [ opencl-headers pybind11 ] ++ os-specific-buildInputs;
+
+  propagatedBuildInputs = [
+    appdirs
+    cffi
+    decorator
+    Mako
+    numpy
+    platformdirs
+    pytools
+    six
+  ];
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-+Ih9VOZUWY84VEclQLLrIorFa1aiSRuVvfrI8VvhyUM=";
+  };
+
+  # py.test is not needed during runtime, so remove it from `install_requires`
+  postPatch = ''
+    substituteInPlace setup.py --replace "pytest>=2" ""
+  '';
+
+  preBuild = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  # gcc: error: pygpu_language_opencl.cpp: No such file or directory
+  doCheck = false;
+
+  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..195ec563d50f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyopengl-accelerate/default.nix
@@ -0,0 +1,24 @@
+{ lib
+, buildPythonPackage
+, pythonAtLeast
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "pyopengl-accelerate";
+  version = "3.1.5";
+  disabled = pythonAtLeast "3.10"; # fails to compile
+
+  src = fetchPypi {
+    pname = "PyOpenGL-accelerate";
+    inherit version;
+    sha256 = "01iggy5jwxv7lxnj51zbmlbhag9wcb7dvrbwgi97i90n0a5m3r8j";
+  };
+
+  meta = {
+    description = "This set of C (Cython) extensions provides acceleration of common operations for slow points in PyOpenGL 3.x";
+    homepage = "http://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..7370057ad720
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyopengl/default.nix
@@ -0,0 +1,63 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pkgs
+, pillow
+}:
+
+buildPythonPackage rec {
+  pname = "pyopengl";
+  version = "3.1.6";
+
+  src = fetchPypi {
+    pname = "PyOpenGL";
+    inherit version;
+    sha256 = "sha256-jqbIdzkn7adAW//G9buTvoFWmnsFyMrFDNlOlp3OXic=";
+  };
+
+  propagatedBuildInputs = [ pillow ];
+
+  patchPhase = let
+    ext = stdenv.hostPlatform.extensions.sharedLibrary; in ''
+    # 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}'"
+    substituteInPlace OpenGL/platform/darwin.py \
+      --replace "'OpenGL'" "'${pkgs.libGL}/lib/libGL${ext}'" \
+      --replace "'GLUT'" "'${pkgs.freeglut}/lib/libglut${ext}'"
+
+    # 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;
+
+  meta = with lib; {
+    homepage = "http://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 = "BSD-style";
+    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..1b847100a955
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyopenssl/default.nix
@@ -0,0 +1,80 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, openssl
+, cryptography
+, pytestCheckHook
+, pretend
+, flaky
+}:
+
+buildPythonPackage rec {
+  pname = "pyopenssl";
+  version = "22.0.0";
+
+  src = fetchPypi {
+    pname = "pyOpenSSL";
+    inherit version;
+    sha256 = "sha256-ZgsbFCWqxKG+odlBaKhdmfCzFEyGndQ5DSdinQCH8b8=";
+  };
+
+  outputs = [ "out" "dev" ];
+
+  # Seems to fail unpredictably on Darwin. See https://hydra.nixos.org/build/49877419/nixlog/1
+  # for one example, but I've also seen ContextTests.test_set_verify_callback_exception fail.
+  doCheck = !stdenv.isDarwin;
+
+  nativeBuildInputs = [ openssl ];
+  propagatedBuildInputs = [ cryptography ];
+
+  checkInputs = [ pytestCheckHook pretend flaky ];
+
+  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";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+    # https://github.com/pyca/pyopenssl/issues/873
+    broken = stdenv.isDarwin && stdenv.isAarch64;
+  };
+}
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..17942ca0b19a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyopenuv/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, aiohttp
+, aresponses
+, asynctest
+, backoff
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytest-aiohttp
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyopenuv";
+  version = "2022.04.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "bachya";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-qPk3XA6ciID6h12102AGLxfaTmE63BzKPLvwFn6F1tM=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    backoff
+  ];
+
+  checkInputs = [
+    aresponses
+    asynctest
+    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";
+    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..f4f5bf6c70d4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyopnsense/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fixtures
+, mock
+, pbr
+, pytest-cov
+, pytestCheckHook
+, pythonOlder
+, requests
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "pyopnsense";
+  version = "0.3.0";
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "06rssdb3zhccnm63z96mw5yd38d9i99fgigfcdxn9divalbbhp5a";
+  };
+
+  propagatedBuildInputs = [
+    pbr
+    six
+    requests
+  ];
+
+  checkInputs = [
+    fixtures
+    mock
+    pytest-cov
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "pyopnsense" ];
+
+  meta = with lib; {
+    description = "Python client for the OPNsense API";
+    homepage = "https://github.com/mtreinish/pyopnsense";
+    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/pyosf/default.nix b/nixpkgs/pkgs/development/python-modules/pyosf/default.nix
new file mode 100644
index 000000000000..07c657bf226e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyosf/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, isPy27
+, pytest-runner
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "pyosf";
+  version = "1.0.5";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "psychopy";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1fkpmylpcbqa9ky111mz4qr1n8pik49gs7pblbb5qx6b54fzl5k2";
+  };
+
+  preBuild = "export HOME=$TMP";
+  buildInputs = [ pytest-runner ];  # required via `setup_requires`
+  propagatedBuildInputs = [ requests ];
+
+  doCheck = false;  # requires network access
+  pythonImportsCheck = [ "pyosf" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/psychopy/pyosf";
+    description = "Pure Python library for simple sync with Open Science Framework";
+    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..3401e905a1a0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyosmium/default.nix
@@ -0,0 +1,37 @@
+{ lib, buildPythonPackage, fetchFromGitHub, cmake, python
+, libosmium, protozero, boost, expat, bzip2, zlib, pybind11
+, shapely, pythonOlder, isPyPy, lz4, requests, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pyosmium";
+  version = "3.3.0";
+
+  disabled = pythonOlder "3.4" || isPyPy;
+
+  src = fetchFromGitHub {
+    owner = "osmcode";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-vXxRXr+hRrA9oPf8wAS4qQT258Vz+KRSqYwwD6HrDxk=";
+  };
+
+  nativeBuildInputs = [ cmake ];
+  buildInputs = [ libosmium protozero boost expat bzip2 zlib pybind11 lz4 ];
+  propagatedBuildInputs = [ requests ];
+
+  preBuild = "cd ..";
+
+  checkInputs = [
+    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..790a3af13501
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyotgw/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pyserial-asyncio
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyotgw";
+  version = "2.0.2";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "mvn23";
+    repo = pname;
+    rev = version;
+    hash = "sha256-lmhFQ1HhRuiS++NsELA53YafrJ9uX2UDBQ9Kgyq0N0o=";
+  };
+
+  propagatedBuildInputs = [
+    pyserial-asyncio
+  ];
+
+  checkInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "--asyncio-mode=legacy"
+  ];
+
+  pythonImportsCheck = [ "pyotgw" ];
+
+  meta = with lib; {
+    description = "Python module to interact the OpenTherm Gateway";
+    homepage = "https://github.com/mvn23/pyotgw";
+    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..16916666a0d5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyotp/default.nix
@@ -0,0 +1,21 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27 }:
+
+buildPythonPackage rec {
+  pname = "pyotp";
+  version = "2.6.0";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d28ddfd40e0c1b6a6b9da961c7d47a10261fb58f378cb00f05ce88b26df9c432";
+  };
+
+  pythonImportsCheck = [ "pyotp" ];
+
+  meta = with lib; {
+    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/pyoverkiz/default.nix b/nixpkgs/pkgs/development/python-modules/pyoverkiz/default.nix
new file mode 100644
index 000000000000..6c7d10b42040
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyoverkiz/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, aiohttp
+, attrs
+, backoff
+, boto3
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pyhumps
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, warrant-lite
+}:
+
+buildPythonPackage rec {
+  pname = "pyoverkiz";
+  version = "1.5.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "iMicknl";
+    repo = "python-overkiz-api";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-xshqcAXj6lGpnTIHhx1A2c+Vso1q8kAwZW7v6XIilj0=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    attrs
+    aiohttp
+    backoff
+    pyhumps
+    boto3
+    warrant-lite
+  ];
+
+  checkInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'backoff = "^1.10.0"' 'backoff = "*"'
+  '';
+
+  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";
+    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..b5b8a100ba2f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyowm/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, geojson
+, pysocks
+, pythonOlder
+, requests
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pyowm";
+  version = "3.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "csparpa";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-cSOhm3aDksLBChZzgw1gjUjLQkElR2/xGFMOb9K9RME=";
+  };
+
+  propagatedBuildInputs = [
+    geojson
+    pysocks
+    requests
+  ];
+
+  checkInputs = [
+    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..1eeeb83a9dce
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyp/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, coreutils
+, pythonOlder
+, astunparse
+, jq
+, bc
+}:
+
+buildPythonPackage rec {
+  pname = "pyp";
+  version = "1.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "hauntsaninja";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "09k7y77h7g4dg0x6lg9pn2ga9z7xiy4vlj15fj0991ffsi4ydqgm";
+  };
+
+  propagatedBuildInputs = lib.optionals (pythonOlder "3.9") [
+    astunparse
+  ];
+
+  preCheck = ''
+    export PATH=$out/bin:$PATH
+  '';
+
+  checkInputs = [
+    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..eb7287e4a1b0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pypandoc/default.nix
@@ -0,0 +1,35 @@
+{ lib, substituteAll, buildPythonPackage, fetchFromGitHub
+, pandoc, texlive
+}:
+
+buildPythonPackage rec {
+  pname = "pypandoc";
+  version = "1.8.1";
+
+  src = fetchFromGitHub {
+    owner = "NicklasTegner";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-1vQmONQFJrjptwVVjw25Wyt59loatjScsdnSax+q/f8=";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./static-pandoc-path.patch;
+      pandoc = "${lib.getBin pandoc}/bin/pandoc";
+      pandocVersion = pandoc.version;
+    })
+    ./skip-tests.patch
+  ];
+
+  checkInputs = [
+    texlive.combined.scheme-small
+  ];
+
+  meta = with lib; {
+    description = "Thin wrapper for pandoc";
+    homepage = "https://github.com/NicklasTegner/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..3d10fca06c05
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyparsing/default.nix
@@ -0,0 +1,49 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, lib
+, flit-core
+, jinja2
+, pytestCheckHook
+, railroad-diagrams
+}:
+
+let
+  pyparsing = buildPythonPackage rec {
+    pname = "pyparsing";
+    version = "3.0.9";
+    format = "pyproject";
+
+    src = fetchFromGitHub {
+      owner = "pyparsing";
+      repo = pname;
+      rev = "pyparsing_${version}";
+      sha256 = "sha256-aCRyJQyLf8qQ6NO41q+HC856TjIHzIt0vyVBLV+3teE=";
+    };
+
+    nativeBuildInputs = [
+      flit-core
+    ];
+
+    # circular dependencies with pytest if enabled by default
+    doCheck = false;
+    checkInputs = [
+      jinja2
+      pytestCheckHook
+      railroad-diagrams
+    ];
+
+    pythonImportsCheck = [ "pyparsing" ];
+
+    passthru.tests = {
+      check = pyparsing.overridePythonAttrs (_: { doCheck = true; });
+    };
+
+    meta = with lib; {
+      homepage = "https://github.com/pyparsing/pyparsing";
+      description = "An alternative approach to creating and executing simple grammars, vs. the traditional lex/yacc approach, or the use of regular expressions";
+      license = licenses.mit;
+      maintainers = with maintainers; [ kamadorueda ];
+    };
+  };
+in
+pyparsing
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..1c054defbef3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyparted/default.nix
@@ -0,0 +1,57 @@
+{ lib, stdenv
+, fetchFromGitHub
+, buildPythonPackage
+, isPyPy
+, pkgs
+, python
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "pyparted";
+  version = "3.12.0";
+  disabled = isPyPy;
+
+  src = fetchFromGitHub {
+    repo = pname;
+    owner = "dcantrell";
+    rev = "v${version}";
+    sha256 = "sha256-LfBLR0A/wnfBtXISAAY6Nl4vnk1rtY03F+PT8UIMrEs=";
+  };
+
+  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
+  '';
+
+  patches = [
+    ./fix-test-pythonpath.patch
+  ];
+
+  preConfigure = ''
+    PATH="${pkgs.parted}/sbin:$PATH"
+  '';
+
+  nativeBuildInputs = [ pkgs.pkg-config ];
+  checkInputs = [ six ];
+  propagatedBuildInputs = [ pkgs.parted ];
+
+  checkPhase = ''
+    patchShebangs Makefile
+    make test PYTHON=${python.executable}
+  '';
+
+  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/pyparted/fix-test-pythonpath.patch b/nixpkgs/pkgs/development/python-modules/pyparted/fix-test-pythonpath.patch
new file mode 100644
index 000000000000..740bffbef6d8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyparted/fix-test-pythonpath.patch
@@ -0,0 +1,26 @@
+diff -ur a/Makefile b/Makefile
+--- a/Makefile	1980-01-02 00:00:00.000000000 +0100
++++ b/Makefile	2020-02-18 20:04:14.068243263 +0100
+@@ -39,19 +39,19 @@
+ 	@$(PYTHON) setup.py build
+ 
+ test: all
+-	@env PYTHONPATH=$$(find $$(pwd) -name "*.so" | head -n 1 | xargs dirname):src/parted:src \
++	@env PYTHONPATH=$$(find $$(pwd) -name "*.so" | head -n 1 | xargs dirname):src/parted:src:$$PYTHONPATH \
+ 	$(PYTHON) -m unittest discover -v
+ 
+ coverage: all
+ 	@echo "*** Running unittests with $(COVERAGE) for $(PYTHON) ***"
+-	@env PYTHONPATH=$$(find $$(pwd) -name "*.so" | head -n 1 | xargs dirname):src/parted:src \
++	@env PYTHONPATH=$$(find $$(pwd) -name "*.so" | head -n 1 | xargs dirname):src/parted:src:$$PYTHONPATH \
+ 	$(COVERAGE) run --branch -m unittest discover -v
+ 	$(COVERAGE) report --include="build/lib.*/parted/*" --show-missing
+ 	$(COVERAGE) report --include="build/lib.*/parted/*" > coverage-report.log
+ 
+ check: clean
+ 	env PYTHON=python3 $(MAKE) ; \
+-	env PYTHON=python3 PYTHONPATH=$$(find $$(pwd) -name "*.so" | head -n 1 | xargs dirname):src/parted:src \
++	env PYTHON=python3 PYTHONPATH=$$(find $$(pwd) -name "*.so" | head -n 1 | xargs dirname):src/parted:src:$$PYTHONPATH \
+ 	tests/pylint/runpylint.py
+ 
+ dist:
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..85d6c9d49bb0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pypass/default.nix
@@ -0,0 +1,86 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, click
+, colorama
+, enum34
+, fetchPypi
+, git
+, gnugrep
+, gnupg
+, nose
+, pbr
+, pexpect
+, pythonAtLeast
+, pythonOlder
+, substituteAll
+, tree
+, xclip
+}:
+
+# NOTE: pypass can also be used as an application, but probably the most
+# important usecase is as a library. So, let's use buildPythonPackage and
+# support any Python version instead of defining it as an application with
+# buildPythonApplication.
+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;
+
+  checkInputs = [ 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..fbf6769ab4ca
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pypcap/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, dpkt
+, fetchFromGitHub
+, fetchpatch
+, libpcap
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pypcap";
+  version = "1.2.3";
+
+
+  src = fetchFromGitHub {
+    owner = "pynetwork";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1zscfk10jpqwxgc8d84y8bffiwr92qrg2b24afhjwiyr352l67cf";
+  };
+
+  patches = [
+    # Support for Python 3.9, https://github.com/pynetwork/pypcap/pull/102
+    (fetchpatch {
+      name = "support-python-3.9.patch";
+      url = "https://github.com/pynetwork/pypcap/pull/102/commits/e22f5d25f0d581d19ef337493434e72cd3a6ae71.patch";
+      sha256 = "0n1syh1vcplgsf6njincpqphd2w030s3b2jyg86d7kbqv1w5wk0l";
+    })
+  ];
+
+  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 ];
+
+  checkInputs = [
+    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..c1996ae402a1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pypck/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-asyncio
+, pytest-timeout
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pypck";
+  version = "0.7.15";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "alengwenus";
+    repo = pname;
+    rev = version;
+    hash = "sha256-OuM/r9rxIl4niY87cEcbZ73x2ZIQbaPZqbMrQ7hZE/g=";
+  };
+
+  checkInputs = [
+    pytest-asyncio
+    pytest-timeout
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "--asyncio-mode=legacy"
+  ];
+
+  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";
+    license = with licenses; [ epl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..b87e5d568fa2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pypdf2/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, glibcLocales
+, typing-extensions
+, python
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "PyPDF2";
+  version = "2.10.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-smB4IGIhxkEeyXpaXAiXWuebp+xGdXXRFHepnM5gHrk=";
+  };
+
+  LC_ALL = "en_US.UTF-8";
+  buildInputs = [ glibcLocales ];
+
+  propagatedBuildInputs = lib.optionals (pythonOlder "3.10") [
+    typing-extensions
+  ];
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest discover
+  '';
+
+  # Tests broken on Python 3.x
+  #doCheck = !(isPy3k);
+
+  meta = with lib; {
+    description = "A Pure-Python library built as a PDF toolkit";
+    homepage = "http://mstamy2.github.com/PyPDF2/";
+    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..a4273497e3bc
--- /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;
+    sha256 = "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..e1d9d68e92d8
--- /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.9";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-HouDBlqfokKhbdWWDCfaUJrqIEC5f+sSnVmsrRseFmU=";
+  };
+
+  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..3a0f1a53ffd6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyperf/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, six
+, statistics
+, pythonOlder
+, nose
+, psutil
+, contextlib2
+, mock
+, unittest2
+, isPy27
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "pyperf";
+  version = "2.4.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-OM9ekMVvkGqDIM6CpQv6kskCuTr/1y5NyBWAEV81WFM=";
+  };
+
+  checkInputs = [ nose psutil ] ++
+    lib.optionals isPy27 [ contextlib2 mock unittest2 ];
+  propagatedBuildInputs = [ six ] ++
+    lib.optionals (pythonOlder "3.4") [ statistics ];
+
+  # tests not included in pypi repository
+  doCheck = false;
+
+  checkPhase = ''
+    ${python.interpreter} -m nose
+  '';
+
+  meta = with lib; {
+    description = "Python module to generate and modify perf";
+    homepage = "https://pyperf.readthedocs.io/";
+    license = licenses.mit;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..7bb46b115e00
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyphen/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, flit
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pyphen";
+  version = "0.12.0";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b7d3dfc24b6f2178cdb2b1757ace0bd5d222de3e62c28d22ac578c5f22a13e9b";
+  };
+
+  nativeBuildInputs = [
+    flit
+  ];
+
+  preCheck = ''
+    sed -i '/addopts/d' pyproject.toml
+  '';
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Pure Python module to hyphenate text";
+    homepage = "https://github.com/Kozea/Pyphen";
+    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/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..210e6129199b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pypinyin/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pypinyin";
+  version = "0.46.0";
+
+  src = fetchFromGitHub {
+    owner = "mozillazg";
+    repo = "python-pinyin";
+    rev = "v${version}";
+    sha256 = "sha256-KPyFvO6TR0mg09xcraHFaWklJgzF5oqk3d8H+G4gh3I=";
+  };
+
+  postPatch = ''
+    substituteInPlace pytest.ini --replace \
+      "--cov-report term-missing" ""
+  '';
+
+  checkInputs = [
+    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/master/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..ae7a98cfbe8a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pypiserver/default.nix
@@ -0,0 +1,58 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, lib
+, passlib
+, pytestCheckHook
+, setuptools
+, setuptools-git
+, twine
+, webtest
+}:
+
+buildPythonPackage rec {
+  pname = "pypiserver";
+  version = "1.5.0";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-BK5vQsaWIMOnUqyeofAWJC1nQJPsTvmzl9i2893JCDI=";
+  };
+
+  nativeBuildInputs = [ setuptools-git ];
+
+  propagatedBuildInputs = [ setuptools ];
+
+  preCheck = ''
+    export HOME=$TMPDIR
+  '';
+
+  checkInputs = [
+    passlib
+    pytestCheckHook
+    twine
+    webtest
+  ];
+
+  disabledTests = [
+    # fails to install the package
+    "test_hash_algos"
+    "test_pip_install_authed_succeeds"
+    "test_pip_install_open_succeeds"
+  ];
+
+  disabledTestPaths = [
+    # requires docker service running
+    "docker/test_docker.py"
+  ];
+
+  pythonImportsCheck = [ "pypiserver" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/pypiserver/pypiserver";
+    description = "Minimal PyPI server for use with pip/easy_install";
+    license = with licenses; [ mit zlib ];
+    maintainers = with maintainers; [ austinbutler SuperSandro2000 ];
+  };
+}
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..aff4d54abc4d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyplatec/default.nix
@@ -0,0 +1,23 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "PyPlatec";
+  version = "1.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0kqx33flcrrlipccmqs78d14pj5749bp85b6k5fgaq2c7yzz02jg";
+  };
+
+  meta = with lib; {
+    description = "Library to simulate plate tectonics with Python bindings";
+    homepage    = "https://github.com/Mindwerks/plate-tectonics";
+    license     = licenses.lgpl3;
+    broken      = stdenv.isLinux;
+  };
+
+}
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..968e9310318a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pypng/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pypng";
+  version = "0.0.21";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "drj11";
+    repo = "pypng";
+    rev = "${pname}-${version}";
+    sha256 = "sha256-JU1GCSTm2s6Kczn6aRcF5DizPJVpizNtnAMJxTBi9vo=";
+  };
+
+  pythonImportsCheck = [ "png" ];
+
+  checkInputs = [ 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..bd4a121d35be
--- /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.0";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "fredrike";
+    repo = "pypoint";
+    rev = "v${version}";
+    hash = "sha256-609Zme9IUl8eHNxzrYsRAg7bgZho/OklGM7oI+imyZQ=";
+  };
+
+  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..5c4703193af1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pypoolstation/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, aiohttp
+, backoff
+, buildPythonPackage
+, fetchPypi
+, poetry-core
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pypoolstation";
+  version = "0.4.9";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "PyPoolstation";
+    inherit version;
+    sha256 = "sha256-2smgsR5f2fzmutr4EjhyrFWrO9odTba0ux+0B6k3+9Y=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    backoff
+  ];
+
+  # 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..a1857ec72067
--- /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;
+    sha256 = "sha256-izMaWtJdkLHMQbyq7o7n46xB8dOHXZ5uO0UXt+twjL4=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    appdirs
+    certifi
+    importlib-metadata
+    pyee
+    tqdm
+    urllib3
+    websockets
+  ];
+
+  checkInputs = [
+    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..621850742af2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyprecice/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, cython
+, fetchFromGitHub
+, mpi4py
+, numpy
+, precice
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyprecice";
+  version = "2.4.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "precice";
+    repo = "python-bindings";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-Endy5oiC1OWdtZlVPUkIdkzoDTc1b5TaQ6VEUWq5iSg=";
+  };
+
+  nativeBuildInputs = [
+    cython
+  ];
+
+  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..c21692f7f2a9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pypresence/default.nix
@@ -0,0 +1,21 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "pypresence";
+  version = "4.2.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "691daf98c8189fd216d988ebfc67779e0f664211512d9843f37ab0d51d4de066";
+  };
+
+  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..082ebb2a49b0
--- /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 ];
+
+  checkInputs = [ 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; [ jfrankenau ];
+  };
+}
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..7244438c6e08
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyprof2calltree/default.nix
@@ -0,0 +1,22 @@
+{ 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://pypi.python.org/pypi/pyprof2calltree/";
+    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..f62b70915dc5
--- /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 9ca1d25..4198490 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_LIB", "")
+     prefix_datadir = Path(sys.prefix, "share", "proj")
+ 
+diff --git a/setup.py b/setup.py
+index 6bb0c6c..b3d0321 100644
+--- a/setup.py
++++ b/setup.py
+@@ -12,7 +12,7 @@ from setuptools import Extension, setup
+ PROJ_MIN_VERSION = parse_version("7.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@")
+ 
+ 
+ def get_proj_version(proj_dir: Path) -> str:
+@@ -155,7 +155,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 7a696de..1b9b777 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..bcfb7a0ee1b8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyproj/default.nix
@@ -0,0 +1,94 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, python
+, proj
+, pythonOlder
+, substituteAll
+, cython
+, pytestCheckHook
+, mock
+, certifi
+, numpy
+, shapely
+, pandas
+, xarray
+}:
+
+buildPythonPackage rec {
+  pname = "pyproj";
+  version = "3.3.1";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "pyproj4";
+    repo = "pyproj";
+    rev = "refs/tags/${version}";
+    hash = "sha256-QmpwnOnMjV29Tq+M6FCotDytq6zlhsp0Zgzw3V7nhNQ=";
+  };
+
+  # force pyproj to use ${proj}
+  patches = [
+    (substituteAll {
+      src = ./001.proj.patch;
+      proj = proj;
+      projdev = proj.dev;
+    })
+  ];
+
+  nativeBuildInputs = [ cython ];
+  buildInputs = [ proj ];
+
+  propagatedBuildInputs = [
+     certifi
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    mock
+    numpy
+    shapely
+    pandas
+    xarray
+  ];
+
+  preCheck = ''
+    # We need to build extensions locally to run tests
+    ${python.interpreter} setup.py build_ext --inplace
+    cd test
+  '';
+
+  disabledTestPaths = [
+    "test_doctest_wrapper.py"
+    "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"
+  ];
+
+  meta = {
+    description = "Python interface to PROJ.4 library";
+    homepage = "https://github.com/pyproj4/pyproj";
+    license = with lib.licenses; [ isc ];
+    maintainers = with lib.maintainers; [ lsix ];
+  };
+}
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..4e62265776eb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyprosegur/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, aiofiles
+, aiohttp
+, backoff
+, buildPythonPackage
+, click
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyprosegur";
+  version = "0.0.8";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "dgomes";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-Spxzyn0gZ1TIHrtt7W0j6VwKnm2Km5vLGZZ//HINyBA=";
+  };
+
+  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";
+    license = with licenses; [ mit ];
+    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..7246af07e382
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pypsrp/default.nix
@@ -0,0 +1,79 @@
+{ 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 = "v${version}";
+    hash = "sha256-Pwfc9e39sYPdcHN1cZtxxGEglEYzPp4yOYLD5/4SSiU=";
+  };
+
+  propagatedBuildInputs = [
+    cryptography
+    httpcore
+    httpx
+    psrpcore
+    pyspnego
+    requests
+  ];
+
+  checkInputs = [
+    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"
+  ];
+
+  meta = with lib; {
+    description = "PowerShell Remoting Protocol Client library";
+    homepage = "https://github.com/jborean93/pypsrp";
+    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..fd19167a3e9d
--- /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";
+  };
+
+  checkInputs = [ 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..cfc7fbf2ded3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pypugjs/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchPypi, six, chardet, nose
+, django, jinja2, tornado, pyramid, pyramid_mako, Mako }:
+
+buildPythonPackage rec {
+  pname = "pypugjs";
+  version = "5.9.11";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-kStaT1S8cPJF+iDFk/jLGKi3JVOMmtf7PzeYDKCdD0E=";
+  };
+
+  propagatedBuildInputs = [ six chardet ];
+  checkInputs = [ nose django jinja2 tornado pyramid pyramid_mako Mako ];
+
+  checkPhase = ''
+    nosetests pypugjs
+  '';
+
+  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..72fdb6d3c5b4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pypykatz/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, aesedb
+, aiosmb
+, aiowinreg
+, buildPythonPackage
+, fetchPypi
+, minidump
+, minikerberos
+, msldap
+, pythonOlder
+, winsspi
+}:
+
+buildPythonPackage rec {
+  pname = "pypykatz";
+  version = "0.5.7";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-G+dbP+xtRH8dIU70HbimRJV+e/yYlo2ds5OAIzUcydY=";
+  };
+
+  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";
+    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..e88891172deb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pypytools/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchpatch
+, fetchPypi
+, freezegun
+, numpy
+, py
+, pytestCheckHook
+, 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
+  ];
+
+  checkInputs = [
+    freezegun
+    numpy
+    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";
+      sha256 = "sha256-YoYRZmgueQmxRtGaeP4zEVxuA0U7TB0PmoYHHVI7ICQ=";
+    })
+  ];
+
+  pythonImportsCheck = [
+    "pypytools"
+  ];
+
+  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..a6fd8665fd14
--- /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.2";
+
+  src = fetchFromGitHub {
+    owner = "awslabs";
+    repo = "amazon-qldb-driver-python";
+    rev = "v${version}";
+    sha256 = "sha256-TKf43+k428h8T6ye6mJrnK9D4J1xpIu0QacM7lWJF7w=";
+  };
+
+  propagatedBuildInputs = [ boto3 amazon-ion ionhash ];
+
+  checkInputs = [ 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..5e87e700a55f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyqt-builder/default.nix
@@ -0,0 +1,32 @@
+{ lib, fetchPypi, buildPythonPackage, packaging, sip }:
+
+buildPythonPackage rec {
+  pname = "pyqt-builder";
+  version = "1.13.0";
+
+  src = fetchPypi {
+    pname = "PyQt-builder";
+    inherit version;
+    sha256 = "sha256-SHdYDDjOtTIOEps4HQg7CoYBxoFm2LmXB/CPoKFonu8=";
+  };
+
+  patches = [
+    # use the sip-distinfo executable from PATH instead of trying to guess,
+    # we know it's the right one because it's the _only_ one
+    ./use-sip-distinfo-from-path.patch
+  ];
+
+  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; [ ];
+  };
+}
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/4.x.nix b/nixpkgs/pkgs/development/python-modules/pyqt/4.x.nix
new file mode 100644
index 000000000000..2652b5eb00b3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyqt/4.x.nix
@@ -0,0 +1,69 @@
+{ lib, stdenv, fetchurl, buildPythonPackage, python, dbus-python, sip_4, qt4, pkg-config, lndir, dbus, makeWrapper }:
+
+buildPythonPackage rec {
+  pname = "PyQt-x11-gpl";
+  version = "4.12.3";
+  format = "other";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/pyqt/PyQt4_gpl_x11-${version}.tar.gz";
+    sha256 = "0wnlasg62rm5d39nq1yw4namcx2ivxgzl93r5f2vb9s0yaz5l3x0";
+  };
+
+  postPatch = ''
+    mkdir -p $out
+    lndir ${dbus-python} $out
+    rm -rf "$out/nix-support"
+
+    export PYTHONPATH=$PYTHONPATH:$out/lib/${python.libPrefix}/site-packages
+    ${lib.optionalString stdenv.isDarwin ''
+      export QMAKESPEC="unsupported/macx-clang-libc++" # macOS target after bootstrapping phase \
+    ''}
+
+    substituteInPlace configure.py \
+      --replace 'install_dir=pydbusmoddir' "install_dir='$out/lib/${python.libPrefix}/site-packages/dbus/mainloop'" \
+    ${lib.optionalString stdenv.isDarwin ''
+      --replace "qt_macx_spec = 'macx-g++'" "qt_macx_spec = 'unsupported/macx-clang-libc++'" # for bootstrapping phase \
+    ''}
+
+    chmod +x configure.py
+    sed -i '1i#!${python.interpreter}' configure.py
+  '';
+
+  configureScript = "./configure.py";
+  dontAddPrefix = true;
+  configureFlags = [
+    "--confirm-license"
+    "--bindir=${placeholder "out"}/bin"
+    "--destdir=${placeholder "out"}/${python.sitePackages}"
+    "--plugin-destdir=${placeholder "out"}/lib/qt4/plugins"
+    "--sipdir=${placeholder "out"}/share/sip/PyQt4"
+    "--dbus=${lib.getDev dbus-python}/include/dbus-1.0"
+    "--verbose"
+  ];
+
+  nativeBuildInputs = [ pkg-config lndir makeWrapper qt4 ];
+  buildInputs = [ qt4 dbus ];
+
+  propagatedBuildInputs = [ sip_4 ];
+
+  postInstall = ''
+    for i in $out/bin/*; do
+      wrapProgram $i --prefix PYTHONPATH : "$PYTHONPATH"
+    done
+  '';
+
+  enableParallelBuilding = true;
+
+  passthru = {
+    qt = qt4;
+  };
+
+  meta = with lib; {
+    description = "Python bindings for Qt";
+    license = "GPL";
+    homepage = "http://www.riverbankcomputing.co.uk";
+    maintainers = [ maintainers.sander ];
+    platforms = platforms.mesaPlatforms;
+  };
+}
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..5a4c825770db
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyqt/5.x.nix
@@ -0,0 +1,120 @@
+{ lib
+, buildPythonPackage
+, isPy27
+, fetchPypi
+, pkg-config
+, dbus
+, lndir
+, dbus-python
+, sip
+, pyqt5_sip
+, pyqt-builder
+, libsForQt5
+, withConnectivity ? false
+, withMultimedia ? false
+, withWebKit ? false
+, withWebSockets ? false
+, withLocation ? false
+}:
+
+buildPythonPackage rec {
+  pname = "PyQt5";
+  version = "5.15.7";
+  format = "pyproject";
+
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-dVEhpSs6CMsHJ1wQ67lldtNuMg5XJZHbFs/bxVgQFZQ=";
+  };
+
+  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
+  ];
+
+  # be more verbose
+  postPatch = ''
+    cat >> pyproject.toml <<EOF
+    [tool.sip.project]
+    verbose = true
+    EOF
+  '';
+
+  outputs = [ "out" "dev" ];
+
+  dontWrapQtApps = true;
+
+  nativeBuildInputs = with libsForQt5; [
+    pkg-config
+    qmake
+    lndir
+    sip
+    qtbase
+    qtsvg
+    qtdeclarative
+    qtwebchannel
+  ]
+    ++ lib.optional withConnectivity qtconnectivity
+    ++ lib.optional withMultimedia qtmultimedia
+    ++ lib.optional withWebKit qtwebkit
+    ++ lib.optional withWebSockets qtwebsockets
+    ++ lib.optional withLocation qtlocation
+  ;
+
+  buildInputs = with libsForQt5; [
+    dbus
+    qtbase
+    qtsvg
+    qtdeclarative
+    pyqt-builder
+  ]
+    ++ lib.optional withConnectivity qtconnectivity
+    ++ lib.optional withWebKit qtwebkit
+    ++ lib.optional withWebSockets qtwebsockets
+    ++ lib.optional withLocation qtlocation
+  ;
+
+  propagatedBuildInputs = [
+    dbus-python
+    pyqt5_sip
+  ];
+
+  passthru = {
+    inherit sip pyqt5_sip;
+    multimediaEnabled = withMultimedia;
+    webKitEnabled = withWebKit;
+    WebSocketsEnabled = withWebSockets;
+  };
+
+  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.QtConnectivity"
+    ++ lib.optional withLocation "PyQt5.QtPositioning"
+  ;
+
+  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/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/sip.nix b/nixpkgs/pkgs/development/python-modules/pyqt/sip.nix
new file mode 100644
index 000000000000..6cb1433e3385
--- /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;
+    sha256 = "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/pyqtgraph/default.nix b/nixpkgs/pkgs/development/python-modules/pyqtgraph/default.nix
new file mode 100644
index 000000000000..af5567acc8d3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyqtgraph/default.nix
@@ -0,0 +1,72 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, scipy
+, numpy
+, pyqt5
+, pyopengl
+, qt5
+, pytestCheckHook
+, freefont_ttf
+, makeFontsConf
+, fetchpatch
+}:
+
+let
+  fontsConf = makeFontsConf {
+    fontDirectories = [ freefont_ttf ];
+  };
+in
+buildPythonPackage rec {
+  pname = "pyqtgraph";
+  version = "0.12.2";
+
+  src = fetchFromGitHub {
+    owner = "pyqtgraph";
+    repo = "pyqtgraph";
+    rev = "pyqtgraph-${version}";
+    sha256 = "093kkxwj75nb508vz7px4x7lxrwpaff10pl15m4h74hjwyvbsg3d";
+  };
+
+  # TODO: remove when updating to 0.12.3
+  patches = [
+    (fetchpatch {
+      url = "https://github.com/pyqtgraph/pyqtgraph/commit/2de5cd78da92b48e48255be2f41ae332cf8bb675.patch";
+      sha256 = "1hy86psqyl6ipvbg23zvackkd6f7ajs6qll0mbs0x2zmrj92hk00";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    pyqt5
+    scipy
+    pyopengl
+  ];
+
+  checkInputs = [ 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}
+  '';
+
+  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"
+  ];
+
+  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..12021e52271b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyqtwebengine/default.nix
@@ -0,0 +1,71 @@
+{ lib, pythonPackages, pkg-config
+, qmake, qtbase, qtsvg, qtwebengine
+, wrapQtAppsHook
+}:
+
+let
+  inherit (pythonPackages) buildPythonPackage python isPy27 pyqt5 enum34 sip pyqt-builder;
+in buildPythonPackage rec {
+  pname = "PyQtWebEngine";
+  version = "5.15.4";
+  format = "pyproject";
+
+  disabled = isPy27;
+
+  src = pythonPackages.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
+    sip
+    qtbase
+    qtsvg
+    qtwebengine
+    pyqt-builder
+  ];
+
+  buildInputs = [
+    sip
+    qtbase
+    qtsvg
+    qtwebengine
+  ];
+
+  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;
+    platforms   = lib.lists.intersectLists qtwebengine.meta.platforms platforms.mesaPlatforms;
+  };
+}
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..48c8d991175f
--- /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;
+    sha256 = "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 ];
+
+  checkInputs = [ 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..40139c795677
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyquery/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, cssselect
+, fetchPypi
+, lxml
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyquery";
+  version = "1.4.3";
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "00p6f1dfma65192hc72dxd506491lsq3g5wgxqafi1xpg2w1xia6";
+  };
+
+  propagatedBuildInputs = [
+    cssselect
+    lxml
+  ];
+
+  # circular dependency on webtest
+  doCheck = false;
+  pythonImportsCheck = [ "pyquery" ];
+
+  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..64f2d9c45f92
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyquil/default.nix
@@ -0,0 +1,102 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, importlib-metadata
+, ipython
+, lark
+, networkx
+, numpy
+, poetry-core
+, pytest-asyncio
+, pytest-freezegun
+, pytest-httpx
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+, qcs-api-client
+, retry
+, respx
+, rpcq
+, scipy
+}:
+
+buildPythonPackage rec {
+  pname = "pyquil";
+  version = "3.3.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "rigetti";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-lifenGICnllPe/W9xmyp1Jkh7dRfph6u2+2uNvlARMw=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    lark
+    networkx
+    numpy
+    qcs-api-client
+    retry
+    rpcq
+    scipy
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  checkInputs = [
+    pytest-asyncio
+    pytest-freezegun
+    pytest-httpx
+    pytest-mock
+    pytestCheckHook
+    respx
+    ipython
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'lark = "^0.11.1"' 'lark = "*"' \
+      --replace 'qcs-api-client = ">=0.8.1,<0.21.0"' 'qcs-api-client = "*"'
+  '';
+
+  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"
+  ];
+
+  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";
+    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..0e12b339c07c
--- /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
+  ];
+
+  checkInputs = [
+    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/pyrabbit2/default.nix b/nixpkgs/pkgs/development/python-modules/pyrabbit2/default.nix
new file mode 100644
index 000000000000..96f5d66cf650
--- /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 = [ maintainers.costrouc ];
+  };
+}
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..c8fb0310548d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyrad/default.nix
@@ -0,0 +1,62 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, lib
+, poetry-core
+, netaddr
+, six
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "pyrad";
+  version = "2.4";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "pyradius";
+    repo = pname;
+    rev = version;
+    sha256 = "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):"
+  '';
+
+  checkPhase = ''
+    runHook preCheck
+    ${python.interpreter} -m unittest discover
+    runHook postCheck
+  '';
+
+  pythonImportsCheck = [
+    "pyrad"
+  ];
+
+  meta = with lib; {
+    description = "Python RADIUS Implementation";
+    homepage = "https://github.com/pyradius/pyrad";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ globin ];
+  };
+}
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..15677945b0d6
--- /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 = "1.0.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-O30ExmvWu4spwDytFVPWGjR8w3XSTaWd2Z0LGQibq9g=";
+  };
+
+  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..74f0ed630a26
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyrainbird/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, parameterized
+, pycryptodome
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, requests
+, responses
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "pyrainbird";
+  version = "0.4.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "jbarrancos";
+    repo = pname;
+    rev = version;
+    hash = "sha256-uRHknWvoPKPu3B5MbSEUlWqBKwAbNMwsgXuf6PZxhkU=";
+  };
+
+  propagatedBuildInputs = [
+    pycryptodome
+    pyyaml
+    requests
+    setuptools
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    parameterized
+    responses
+  ];
+
+  postPatch = ''
+    substituteInPlace requirements.txt \
+      --replace "datetime" ""
+    substituteInPlace pytest.ini \
+      --replace "--cov=pyrainbird --cov-report=term-missing --pep8 --flakes --mccabe" ""
+  '';
+
+  pythonImportsCheck = [
+    "pyrainbird"
+  ];
+
+  meta = with lib; {
+    description = "Module to interact with Rainbird controllers";
+    homepage = "https://github.com/jbarrancos/pyrainbird/";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..fb1feb767315
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyramid/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, webtest
+, zope_component
+, hupper
+, pastedeploy
+, plaster
+, plaster-pastedeploy
+, repoze_lru
+, translationstring
+, venusian
+, webob
+, zope_deprecation
+, zope_interface
+}:
+
+buildPythonPackage rec {
+  pname = "pyramid";
+  version = "2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "45431b387587ed0fac6213b54d6e9f0936f0cc85238a8f5af7852fc9484c5c77";
+  };
+
+  checkInputs = [ webtest zope_component ];
+
+  propagatedBuildInputs = [ hupper pastedeploy plaster plaster-pastedeploy repoze_lru translationstring venusian webob zope_deprecation zope_interface ];
+
+  pythonImportsCheck = [ "pyramid" ];
+
+  meta = with lib; {
+    description = "The Pyramid Web Framework, a Pylons project";
+    homepage = "https://trypyramid.com/";
+    license = licenses.bsd0;
+    maintainers = with maintainers; [ domenkozar ];
+  };
+
+}
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..9a529214c2e8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyramid_beaker/default.nix
@@ -0,0 +1,28 @@
+{ lib, buildPythonPackage, fetchPypi, pytest, beaker, pyramid }:
+
+buildPythonPackage rec {
+  pname = "pyramid_beaker";
+  version = "0.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0hflx3qkcdml1mwpq53sz46s7jickpfn0zy0ns2c7j445j66bp3p";
+  };
+
+  checkPhase = ''
+    # https://github.com/Pylons/pyramid_beaker/issues/29
+    py.test -k 'not test_includeme' pyramid_beaker/tests.py
+  '';
+
+  checkInputs = [ 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..87ccc32a3aa8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyramid_chameleon/default.nix
@@ -0,0 +1,56 @@
+{ 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;
+    sha256 = "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";
+      sha256 = "sha256-cPS7JhcS8nkBS1T0OdZke25jvWHT0qkPFjyPUDKHBGU=";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    chameleon
+    pyramid
+    setuptools
+    zope_interface
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pyramid_chameleon"
+  ];
+
+  meta = with lib; {
+    broken = (stdenv.isLinux && stdenv.isAarch64) || stdenv.isDarwin;
+    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..2d23256ff844
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyramid_exclog/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pyramid
+}:
+
+buildPythonPackage rec {
+  pname = "pyramid_exclog";
+  version = "1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "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_hawkauth/default.nix b/nixpkgs/pkgs/development/python-modules/pyramid_hawkauth/default.nix
new file mode 100644
index 000000000000..4a21f6771ef7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyramid_hawkauth/default.nix
@@ -0,0 +1,34 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchFromGitHub
+, pyramid
+, hawkauthlib
+, tokenlib
+, webtest
+}:
+
+buildPythonPackage rec {
+  pname = "pyramid_hawkauth";
+  version = "0.1.0";
+
+  src = fetchFromGitHub {
+    owner = "mozilla-services";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "038ign7qlavlmvrhb2y8bygbxvy4j7bx2k1zg0i3wblg2ja50w7h";
+  };
+
+  propagatedBuildInputs = [ pyramid hawkauthlib tokenlib ];
+  buildInputs = [ webtest ];
+
+  pythonImportsCheck = [ "pyramid_hawkauth" ];
+
+  meta = with lib; {
+    broken = (stdenv.isLinux && stdenv.isAarch64) || stdenv.isDarwin;
+    homepage = "https://github.com/mozilla-services/pyramid_hawkauth";
+    description = "A Pyramid authentication plugin for HAWK";
+    license = licenses.mpl20;
+    maintainers = with maintainers; [ ];
+  };
+}
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..8543a950a8cd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyramid_jinja2/default.nix
@@ -0,0 +1,62 @@
+{ stdenv
+, 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
+  ];
+
+  checkInputs = [
+    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; {
+    broken = (stdenv.isLinux && stdenv.isAarch64) || stdenv.isDarwin;
+    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..a4de687eed24
--- /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..22e32aa4d1ee
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyramid_multiauth/default.nix
@@ -0,0 +1,24 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pyramid
+}:
+
+buildPythonPackage rec {
+  pname = "pyramid_multiauth";
+  version = "1.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "6d8785558e1d0bbe0d0da43e296efc0fbe0de5071d1f9b1091e891f0e4ec9682";
+  };
+
+  propagatedBuildInputs = [ pyramid ];
+
+  meta = with lib; {
+    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/pyrect/default.nix b/nixpkgs/pkgs/development/python-modules/pyrect/default.nix
new file mode 100644
index 000000000000..54566658443c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyrect/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, tox
+, pytestCheckHook
+, pygame
+}:
+buildPythonPackage rec {
+  pname = "PyRect";
+  version = "0.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-9lFV9t+bkptnyv+9V8CUfFrlRJ07WA0XgHS/+0egm3g=";
+  };
+
+  checkInputs = [ tox pytestCheckHook pygame ];
+  pythonImportsCheck = [ "pyrect" ];
+  preCheck = ''
+    export LC_ALL="en_US.UTF-8"
+  '';
+
+  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..6d33e18e4f91
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyregion/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, pyparsing
+, numpy
+, cython
+, astropy
+, astropy-helpers
+, pytestCheckHook
+, pytest-astropy
+}:
+
+buildPythonPackage rec {
+  pname = "pyregion";
+  version = "2.0";
+
+  # pypi src contains cython-produced .c files which don't compile
+  # with python3.9
+  src = fetchFromGitHub {
+    owner = "astropy";
+    repo = pname;
+    rev = version;
+    sha256 = "1izar7z606czcyws9s8bjbpb1xhqshpv5009rlpc92hciw7jv4kg";
+  };
+
+  propagatedBuildInputs = [
+    pyparsing
+    numpy
+    astropy
+  ];
+
+  # Upstream patch needed for the test to pass
+  patches = [
+    (fetchpatch {
+      name = "conftest-astropy-3-fix.patch";
+      url = "https://github.com/astropy/pyregion/pull/136.patch";
+      sha256 = "13yxjxiqnhjy9gh24hvv6pnwx7qic2mcx3ccr1igjrc3f881d59m";
+    })
+  ];
+
+  nativeBuildInputs = [ astropy-helpers cython ];
+
+  checkInputs = [ pytestCheckHook pytest-astropy ];
+
+  # Disable automatic update of the astropy-helper module
+  postPatch = ''
+    substituteInPlace setup.cfg --replace "auto_use = True" "auto_use = False"
+  '';
+
+  # Tests must be run in the build directory
+  preCheck = ''
+    pushd build/lib.*
+  '';
+  postCheck = ''
+    popd
+  '';
+
+  meta = with lib; {
+    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/pyres/default.nix b/nixpkgs/pkgs/development/python-modules/pyres/default.nix
new file mode 100644
index 000000000000..a5b618d56902
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyres/default.nix
@@ -0,0 +1,33 @@
+{ lib, stdenv, fetchPypi, buildPythonPackage, fetchFromGitHub, simplejson, redis, setproctitle, nose, pkgs }:
+
+buildPythonPackage rec {
+  pname = "pyres";
+  version = "1.5";
+
+  propagatedBuildInputs = [ simplejson setproctitle redis pkgs.ps ];
+  checkInputs = [ nose pkgs.redis ];
+
+  # PyPI tarball doesn't contain tests so let's use GitHub
+  src = fetchFromGitHub {
+    owner = "binarydud";
+    repo = pname;
+    rev = version;
+    sha256 = "1rkpv7gbjxl9h9g7kncmsrgmi77l7pgfq8d7dbnsr3ia2jmjqb8y";
+  };
+
+  # started redis-server makes this hang on darwin
+  doCheck = !stdenv.isDarwin;
+
+  checkPhase = ''
+    redis-server &
+    nosetests . --exclude test_worker_pids
+  '';
+
+  meta = with lib; {
+    description = "Python resque clone";
+    homepage = "https://github.com/binarydud/pyres";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jluttine ];
+    broken = true; # not compatible with latest redis
+  };
+}
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..74fdc68c07e8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyrevolve/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, contexttimer
+, versioneer
+, cython
+, numpy
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "pyrevolve";
+  version = "2.2";
+
+  src = fetchFromGitHub {
+    owner = "devitocodes";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-5a4zvyf2vfz8aI6vFMI2vxekYrcUi/YuPFvZnUOx+Zs=";
+  };
+
+  nativeBuildInputs = [ versioneer cython ];
+  propagatedBuildInputs = [ contexttimer numpy ];
+
+  checkInputs = [ pytest ];
+  # Using approach bellow bcs the tests fail with the pytestCheckHook, throwing the following error
+  # ImportError: cannot import name 'crevolve' from partially initialized module 'pyrevolve'
+  # (most likely due to a circular import)
+  checkPhase = ''
+    pytest
+  '';
+
+  pythonImportsCheck = [ "pyrevolve" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/devitocodes/pyrevolve";
+    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..3c69d56a6ae1
--- /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.0";
+
+  src = fetchFromGitHub {
+    owner = "Danielhiversen";
+    repo = "pyRFXtrx";
+    rev = "refs/tags/${version}";
+    hash = "sha256-ntnZITj8upzUzlrSTjQxY9xNTU+gJ2rE9PN35cpWwvM=";
+  };
+
+  propagatedBuildInputs = [
+    pyserial
+  ];
+
+  checkInputs = [
+    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/pyrisco/default.nix b/nixpkgs/pkgs/development/python-modules/pyrisco/default.nix
new file mode 100644
index 000000000000..b6442c82bacd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyrisco/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyrisco";
+  version = "0.5.2";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "OnFreund";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-gRAQARdVZWpFHx0nE4xRktIP2p4ggp9/95VO9nNd/1w=";
+  };
+
+  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..e7674fd3ea77
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyrituals/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyrituals";
+  version = "0.0.6";
+  format = "pyproject";
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "milanmeu";
+    repo = pname;
+    rev = version;
+    sha256 = "0ynjz7khp67bwxjp580w3zijxr9yn44nmnbvkxjxq9scyb2mjf6g";
+  };
+
+  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..e76152e218d4
--- /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.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "cgtobi";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0m74m3dhxmbv10hsvs7cpshzs3pg66va5lyq94i5j1nxrl9i7spb";
+  };
+
+  nativeBuildInputs = [
+    flit
+  ];
+
+  propagatedBuildInputs = [
+    async-timeout
+    httpx
+    lxml
+  ];
+
+  checkInputs = [
+    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";
+      sha256 = "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..7bc6ac00925d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyro-ppl/default.nix
@@ -0,0 +1,73 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, graphviz
+, jupyter
+, matplotlib
+, networkx
+, opt-einsum
+, pandas
+, pillow
+, pyro-api
+, pythonOlder
+, pytorch
+, scikit-learn
+, seaborn
+, torchvision
+, tqdm
+, wget
+}:
+
+buildPythonPackage rec {
+  pname = "pyro-ppl";
+  version = "1.8.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit version pname;
+    hash = "sha256-18BJ6y50haYStN2ZwkwwnMhgx8vGsZczhwNPVDbRyNY=";
+  };
+
+  propagatedBuildInputs = [
+    pyro-api
+    pytorch
+    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";
+    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..96b0e08a56d9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyro4/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, serpent
+, dill
+, cloudpickle
+, msgpack
+, isPy27
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pyro4";
+  version = "4.82";
+  format = "setuptools";
+
+  disabled = isPy27;
+
+  src = fetchPypi {
+    pname = "Pyro4";
+    inherit version;
+    hash = "sha256-UR9bCATpLdd9wzrfnJR3h+P56cWpaxIWLwVXp8TOIfs=";
+  };
+
+  propagatedBuildInputs = [
+    serpent
+  ];
+
+  buildInputs = [
+    dill
+    cloudpickle
+    msgpack
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  # add testsupport.py to PATH
+  preCheck = "PYTHONPATH=tests/PyroTests:$PYTHONPATH";
+
+
+  pytestFlagsArray = [
+    # ignore network related tests, which fail in sandbox
+    "--ignore=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";
+    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..4e56bb49f5fd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyro5/default.nix
@@ -0,0 +1,37 @@
+{ buildPythonPackage
+, fetchPypi
+, lib
+, stdenv
+, serpent
+, pythonOlder
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "Pyro5";
+  version = "5.13.1";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "2be9da379ae0ec4cf69ffb3c5c589b698eea00e614a9af7945b87fa9bb09baf2";
+  };
+
+  propagatedBuildInputs = [ serpent ];
+
+  checkInputs = [ pytestCheckHook ];
+
+  # ignore network related tests, which fail in sandbox
+  disabledTests = [ "StartNSfunc" "Broadcast" "GetIP" "TestNameServer" "TestBCSetup" ]
+  ++ lib.optionals stdenv.hostPlatform.isDarwin [
+    "Socket"
+  ];
+
+  meta = with lib; {
+    description = "Distributed object middleware for Python (RPC)";
+    homepage = "https://github.com/irmen/Pyro5";
+    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..f17e42b5d46f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyrogram/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, pyaes
+, pysocks
+, async-lru
+, tgcrypto
+, pytestCheckHook
+, pytest-asyncio
+}:
+
+buildPythonPackage rec {
+  pname = "pyrogram";
+  version = "2.0.30";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "pyrogram";
+    repo = "pyrogram";
+    rev = "v${version}";
+    hash = "sha256-EG9LafZHqCC4klYm5gAlShnznGoaDOGsak4cEOh2OA4=";
+  };
+
+  propagatedBuildInputs = [
+    pyaes
+    pysocks
+    async-lru
+    tgcrypto
+  ];
+
+  checkInputs = [
+    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..f5c4d936aebd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyroute2/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, importlib-metadata
+, mitogen
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyroute2";
+  version = "0.7.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-hahWY7BIO8c6DmCgG+feZdNikbYWycFCl0E6P1uEQ/M=";
+  };
+
+  propagatedBuildInputs = [
+    mitogen
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  # Requires root privileges, https://github.com/svinota/pyroute2/issues/778
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pyroute2"
+    "pr2modules.common"
+    "pr2modules.config"
+    "pr2modules.ethtool"
+    "pr2modules.ipdb"
+    "pr2modules.ipset"
+    "pr2modules.ndb"
+    "pr2modules.nftables"
+    "pr2modules.nslink"
+    "pr2modules.protocols"
+    "pr2modules.proxy"
+  ];
+
+  meta = with lib; {
+    description = "Python Netlink library";
+    homepage = "https://github.com/svinota/pyroute2";
+    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..cb1da5238681
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyrr/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools
+, multipledispatch
+, numpy
+}:
+
+buildPythonPackage rec {
+  version = "0.10.3";
+  pname = "pyrr";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3c0f7b20326e71f706a610d58f2190fff73af01eef60c19cb188b186f0ec7e1d";
+  };
+
+  buildInputs = [ setuptools ];
+  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..5a1b66bfa26c
--- /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.18.1";
+
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-1NYfi5k6clW6cU3zrKUnAPgSUon4T3BM+AkWUXxG65Y=";
+  };
+
+  propagatedBuildInputs = [ six ];
+
+  checkInputs = [ 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..4a7dc788caaa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyrss2gen/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "PyRSS2Gen";
+  version = "1.1";
+
+  src = fetchPypi {
+    inherit pname 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..ad40aa6f05eb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyrtlsdr/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, rtl-sdr
+, m2r
+}:
+
+buildPythonPackage rec {
+  pname = "pyrtlsdr";
+  version = "0.2.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "7942fe2e7821d09206002ea7e820e694094b3f964885123eb6eee1167f39b8da";
+  };
+
+  # Replace pypandoc dependency by m2r
+  # See https://github.com/roger-/pyrtlsdr/pull/78
+  patches = [
+    (fetchpatch {
+      url = "${meta.homepage}/commit/2b7df0b.patch";
+      sha256 = "04h5z80969jgdgrf98b9ps56sybms09xacvmj6rwcfrmanli8rgf";
+    })
+    (fetchpatch {
+      url = "${meta.homepage}/commit/97dc3d0.patch";
+      sha256 = "1v1j0n91jwpsiam2j34yj71z4h39cvk4gi4565zgjrzsq6xr93i0";
+    })
+  ];
+
+  nativeBuildInputs = [ m2r ];
+
+  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";
+    license = licenses.gpl3;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ bjornfor ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyruckus/default.nix b/nixpkgs/pkgs/development/python-modules/pyruckus/default.nix
new file mode 100644
index 000000000000..336be72a9239
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyruckus/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pexpect
+, python-slugify
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyruckus";
+  version = "0.16";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "gabe565";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-SVE5BrCCQgCrhOC0CSGgbZ9TEY3iZ9Rp/xMUShPAxxM=";
+  };
+
+  propagatedBuildInputs = [
+    pexpect
+    python-slugify
+  ];
+
+  # Tests requires network features
+  doCheck = false;
+  pythonImportsCheck = [ "pyruckus" ];
+
+  meta = with lib; {
+    description = "Python client for Ruckus Unleashed";
+    homepage = "https://github.com/gabe565/pyruckus";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..d8a38dff9084
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysam/default.nix
@@ -0,0 +1,114 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, bzip2
+, bcftools
+, curl
+, cython
+, htslib
+, libdeflate
+, xz
+, pytest
+, samtools
+, zlib
+}:
+
+buildPythonPackage rec {
+  pname   = "pysam";
+  version = "0.19.1";
+
+  # 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}";
+    sha256 = "sha256-fbvfobffLha1eFatnHvh0tOYcuMRLTmy/BJ9QXFHx2o=";
+  };
+
+  nativeBuildInputs = [ samtools ];
+  buildInputs = [
+    bzip2
+    curl
+    cython
+    libdeflate
+    xz
+    zlib
+  ];
+
+  # 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
+  '';
+
+  checkInputs = [
+    pytest
+    bcftools
+    htslib
+  ];
+
+  # See https://github.com/NixOS/nixpkgs/pull/100823 for why we aren't using
+  # disabledTests and pytestFlagsArray through pytestCheckHook
+  checkPhase = ''
+    # Needed to avoid /homeless-shelter error
+    export HOME=$(mktemp -d)
+
+    # To avoid API incompatibilities, these should ideally show the same version
+    echo "> samtools --version"
+    samtools --version
+    echo "> htsfile --version"
+    htsfile --version
+    echo "> bcftools --version"
+    bcftools --version
+
+    # Create auxiliary test data
+    make -C tests/pysam_data
+    make -C tests/cbcf_data
+
+    # Delete pysam folder in current directory to avoid importing it during testing
+    rm -rf pysam
+
+    # Deselect tests that are known to fail due to upstream issues
+    # See https://github.com/pysam-developers/pysam/issues/961
+    py.test \
+      --deselect tests/AlignmentFileHeader_test.py::TestHeaderBAM::test_dictionary_access_works \
+      --deselect tests/AlignmentFileHeader_test.py::TestHeaderBAM::test_header_content_is_as_expected \
+      --deselect tests/AlignmentFileHeader_test.py::TestHeaderCRAM::test_dictionary_access_works \
+      --deselect tests/AlignmentFileHeader_test.py::TestHeaderCRAM::test_header_content_is_as_expected \
+      --deselect tests/AlignmentFile_test.py::TestDeNovoConstruction::testBAMWholeFile \
+      --deselect tests/AlignmentFile_test.py::TestEmptyHeader::testEmptyHeader \
+      --deselect tests/AlignmentFile_test.py::TestHeaderWithProgramOptions::testHeader \
+      --deselect tests/AlignmentFile_test.py::TestIO::testBAM2BAM \
+      --deselect tests/AlignmentFile_test.py::TestIO::testBAM2CRAM \
+      --deselect tests/AlignmentFile_test.py::TestIO::testBAM2SAM \
+      --deselect tests/AlignmentFile_test.py::TestIO::testFetchFromClosedFileObject \
+      --deselect tests/AlignmentFile_test.py::TestIO::testOpenFromFilename \
+      --deselect tests/AlignmentFile_test.py::TestIO::testSAM2BAM \
+      --deselect tests/AlignmentFile_test.py::TestIO::testWriteUncompressedBAMFile \
+      --deselect tests/AlignmentFile_test.py::TestIteratorRowAllBAM::testIterate \
+      --deselect tests/StreamFiledescriptors_test.py::StreamTest::test_text_processing \
+      --deselect tests/compile_test.py::BAMTest::testCount \
+      tests/
+  '';
+
+  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 = [ "i686-linux" "x86_64-linux" ];
+  };
+}
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..fcac04101e4c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysaml2/default.nix
@@ -0,0 +1,100 @@
+{ lib
+, buildPythonPackage
+, cryptography
+, defusedxml
+, fetchFromGitHub
+, fetchPypi
+, importlib-resources
+, mock
+, pyasn1
+, pymongo
+, pyopenssl
+, pytestCheckHook
+, python-dateutil
+, pythonOlder
+, pytz
+, requests
+, responses
+, setuptools
+, six
+, substituteAll
+, xmlschema
+, xmlsec
+}:
+
+let
+  pymongo3 = pymongo.overridePythonAttrs(old: rec {
+    version = "3.12.3";
+    src = fetchPypi {
+      pname = "pymongo";
+      inherit version;
+      sha256 = "sha256-ConK3ABipeU2ZN3gQ/bAlxcrjBxfAJRJAJUoL/mZWl8=";
+    };
+  });
+in buildPythonPackage rec {
+  pname = "pysaml2";
+  version = "7.1.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "IdentityPython";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-nyQcQ1OO9PuuQROg+km2vIRF1sZ22MZhiHpmVXWl+is=";
+  };
+
+  propagatedBuildInputs = [
+    cryptography
+    defusedxml
+    pyopenssl
+    python-dateutil
+    pytz
+    requests
+    setuptools
+    six
+    xmlschema
+  ] ++ lib.optionals (pythonOlder "3.9") [
+    importlib-resources
+  ];
+
+  checkInputs = [
+    mock
+    pyasn1
+    pymongo3
+    pytestCheckHook
+    responses
+  ];
+
+  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
+  '';
+
+  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";
+    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..d984c55a8a7f
--- /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('Cannot find {binary}'.format(binary=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..8c1401c2a7cc
--- /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;
+    sha256 = "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 ];
+
+  checkInputs = [ 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..b85d1f6cd531
--- /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";
+  };
+
+  checkInputs = [ 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..9efc461cec2b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyscard/default.nix
@@ -0,0 +1,48 @@
+{ lib, stdenv, fetchpatch, fetchPypi, buildPythonPackage, swig, pcsclite, PCSC }:
+
+let
+  # Package does not support configuring the pcsc library.
+  withApplePCSC = stdenv.isDarwin;
+in
+
+buildPythonPackage rec {
+  version = "2.0.2";
+  pname = "pyscard";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "05de0579c42b4eb433903aa2fb327d4821ebac262434b6584da18ed72053fd9e";
+  };
+
+  patches = [
+    # present in master - remove after 2.0.2
+    (fetchpatch {
+      name = "darwin-typo-test-fix.patch";
+      url = "https://github.com/LudovicRousseau/pyscard/commit/ce842fcc76fd61b8b6948d0b07306d82ad1ec12a.patch";
+      sha256 = "0wsaj87wp9d2vnfzwncfxp2w95m0zhr7zpkmg5jccn06z52ihis3";
+    })
+  ];
+
+  postPatch = if withApplePCSC then ''
+    substituteInPlace smartcard/scard/winscarddll.c \
+      --replace "/System/Library/Frameworks/PCSC.framework/PCSC" \
+                "${PCSC}/Library/Frameworks/PCSC.framework/PCSC"
+  '' else ''
+    substituteInPlace smartcard/scard/winscarddll.c \
+      --replace "libpcsclite.so.1" \
+                "${lib.getLib pcsclite}/lib/libpcsclite${stdenv.hostPlatform.extensions.sharedLibrary}"
+  '';
+
+  NIX_CFLAGS_COMPILE = lib.optionalString (! withApplePCSC)
+    "-I ${lib.getDev pcsclite}/include/PCSC";
+
+  propagatedBuildInputs = if withApplePCSC then [ PCSC ] else [ pcsclite ];
+  nativeBuildInputs = [ swig ];
+
+  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..5b2f3941b2b4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyscf/default.nix
@@ -0,0 +1,109 @@
+{ buildPythonPackage
+, lib
+, fetchFromGitHub
+, cmake
+, blas
+, libcint
+, libxc
+, xcfun
+, cppe
+, h5py
+, numpy
+, scipy
+, nose
+, nose-exclude
+}:
+
+buildPythonPackage rec {
+  pname = "pyscf";
+  version = "2.0.1";
+
+  src = fetchFromGitHub {
+    owner = "pyscf";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-nwnhaqSn/9WHBjUPaEabK4x23fJ83WwEYvz6aCcvsDw=";
+  };
+
+  # 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
+  ];
+
+  checkInputs = [ nose nose-exclude ];
+
+  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
+  '';
+  # As defined for the PySCF CI at https://github.com/pyscf/pyscf/blob/master/.github/workflows/run_tests.sh
+  # minus some additionally numerically instable tests, that are sensitive to BLAS, FFTW, etc.
+  checkPhase = ''
+    runHook preCheck
+
+    nosetests pyscf/ -v \
+      --exclude-dir=examples --exclude-dir=pyscf/pbc/grad \
+      --exclude-dir=pyscf/x2c \
+      --exclude-dir=pyscf/adc \
+      --exclude-dir=pyscf/pbc/tdscf \
+      -e test_bz \
+      -e h2o_vdz \
+      -e test_mc2step_4o4e \
+      -e test_ks_noimport \
+      -e test_jk_hermi0 \
+      -e test_j_kpts \
+      -e test_k_kpts \
+      -e high_cost \
+      -e skip \
+      -e call_in_background \
+      -e libxc_cam_beta_bug \
+      -e test_finite_diff_rks_eph \
+      -e test_finite_diff_uks_eph \
+      -e test_pipek \
+      -e test_n3_cis_ewald \
+      -I test_kuccsd_supercell_vs_kpts\.py \
+      -I test_kccsd_ghf\.py \
+      -I test_h_.*\.py \
+      --exclude-test=pyscf/pbc/gw/test/test_kgw_slow_supercell.DiamondTestSupercell3 \
+      --exclude-test=pyscf/pbc/gw/test/test_kgw_slow_supercell.DiamondKSTestSupercell3 \
+      --exclude-test=pyscf/pbc/gw/test/test_kgw_slow.DiamondTestSupercell3 \
+      --exclude-test=pyscf/pbc/gw/test/test_kgw_slow.DiamondKSTestSupercell3 \
+      --exclude-test=pyscf/pbc/tdscf/test/test_krhf_slow_supercell.DiamondTestSupercell3 \
+      --exclude-test=pyscf/pbc/tdscf/test/test_kproxy_hf.DiamondTestSupercell3 \
+      --exclude-test=pyscf/pbc/tdscf/test/test_kproxy_ks.DiamondTestSupercell3 \
+      --exclude-test=pyscf/pbc/tdscf/test/test_kproxy_supercell_hf.DiamondTestSupercell3 \
+      --exclude-test=pyscf/pbc/tdscf/test/test_kproxy_supercell_ks.DiamondTestSupercell3 \
+      -I .*_slow.*py -I .*_kproxy_.*py -I test_proxy.py tdscf/*_slow.py gw/*_slow.py
+
+    runHook postCheck
+  '';
+
+  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..c387bdef4b8c
--- /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 = [ maintainers.costrouc ];
+  };
+}
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..c7034d11cdca
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyschemes/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonAtLeast
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pyschemes";
+  version = "unstable-2017-11-08";
+  format = "setuptools";
+
+  disabled = pythonAtLeast "3.10";
+
+  src = fetchFromGitHub {
+    owner = "spy16";
+    repo = pname;
+    rev = "ca6483d13159ba65ba6fc2f77b90421c40f2bbf2";
+    hash = "sha256-PssucudvlE8mztwVme70+h+2hRW/ri9oV9IZayiZhdU=";
+  };
+
+  checkInputs = [
+    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/pyscreenshot/default.nix b/nixpkgs/pkgs/development/python-modules/pyscreenshot/default.nix
new file mode 100644
index 000000000000..8fbd0801dd69
--- /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.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "dd4fdfaeb617483913a6b16845b9f428de5db28758979f4b6cf8f236d292b908";
+  };
+
+  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; [ costrouc ];
+  };
+}
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..ddca8e72c23f
--- /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";
+    sha256 = "sha256-gn3ydjf/msdhIhngGlhK+jhEyFy0qGeDr58E7kM2YZs=";
+  };
+
+  pythonImportsCheck = [ "pyscreeze" ];
+  checkInputs = [ 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..5153663c6e88
--- /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}";
+    sha256 = "sha256-z0y4z+/JE6rZWHAvps/taDZvutyVhxxs2gMujV5rNu4=";
+  };
+
+  checkInputs = [ 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..37b318ebb7c7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysdl2/PySDL2-dll.patch
@@ -0,0 +1,127 @@
+diff --git a/sdl2/dll.py b/sdl2/dll.py
+index 6e30259..12e1f7d 100644
+--- a/sdl2/dll.py
++++ b/sdl2/dll.py
+@@ -145,7 +145,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
+@@ -157,11 +157,12 @@ class DLL(object):
+             "SDL2_image": 2001,
+             "SDL2_gfx": 1003
+         }
+-        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 = _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)
+@@ -185,19 +186,19 @@ 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"])
++        #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
+         function. If the version of the loaded library is older than the
+         version where the function was added, an informative exception will
+         be raised if the bound function is called.
+         
+         Args:
+             funcname (str): The name of the function to bind.
+             args (List or None, optional): The data types of the C function's 
+                 arguments. Should be 'None' if function takes no arguments.
+             returns (optional): The return type of the bound C function. Should
+                 be 'None' if function returns 'void'.
+@@ -288,7 +289,7 @@ def nullfunc(*args):
+     return
+ 
+ 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 090752e..a8a7488 100644
+--- a/sdl2/sdlgfx.py
++++ b/sdl2/sdlgfx.py
+@@ -50,8 +50,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 a6884e8..95d96df 100644
+--- a/sdl2/sdlimage.py
++++ b/sdl2/sdlimage.py
+@@ -32,15 +32,14 @@ __all__ = [
+     "IMG_LoadXCF_RW", "IMG_LoadWEBP_RW", "IMG_LoadXPM_RW",
+     "IMG_LoadXV_RW", "IMG_ReadXPMFromArray",
+     "IMG_GetError", "IMG_SetError", "IMG_SaveJPG", "IMG_SaveJPG_RW",
+-    
++
+     # Python Functions
+     "get_dll_file"
+ ]
+ 
+ 
+ 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 9ad9b85..1c36289 100644
+--- a/sdl2/sdlmixer.py
++++ b/sdl2/sdlmixer.py
+@@ -76,8 +76,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 9c2d951..bd5a16a 100644
+--- a/sdl2/sdlttf.py
++++ b/sdl2/sdlttf.py
+@@ -54,8 +54,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..1f1d97f19fa5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysdl2/default.nix
@@ -0,0 +1,40 @@
+{ stdenv, lib, substituteAll, fetchPypi, buildPythonPackage, SDL2, SDL2_ttf, SDL2_image, SDL2_gfx, SDL2_mixer }:
+
+buildPythonPackage rec {
+  pname = "PySDL2";
+  version = "0.9.11";
+  # 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;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "93e51057d39fd583b80001d42b21d5a3f71e30d489d85924d944b2c7350e2da6";
+  };
+
+  # 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..f5817917c9ab
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysensibo/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pysensibo";
+  version = "1.0.18";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "andrey-git";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-sFEeN72+h6yFQFluhOQfxoVJPB5lCpFnlJfLnRxVjFg=";
+  };
+
+  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";
+    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..8cff62b89c1f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysensors/default.nix
@@ -0,0 +1,32 @@
+{ lib, buildPythonPackage, python, 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;
+
+  checkPhase = ''
+    cd tests
+    ${python.interpreter} -m unittest discover
+  '';
+
+  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/pyserial-asyncio/default.nix b/nixpkgs/pkgs/development/python-modules/pyserial-asyncio/default.nix
new file mode 100644
index 000000000000..93ec0535b892
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyserial-asyncio/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, pyserial
+}:
+
+buildPythonPackage rec {
+  pname = "pyserial-asyncio";
+  version = "0.6";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-tgMpI+BenXXsF6WvmphCnEbSg5rfr4BgTVLg+qzXoy8=";
+  };
+
+  propagatedBuildInputs = [
+    pyserial
+  ];
+
+  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; [ ];
+    platforms = platforms.linux;
+  };
+}
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..e6b8edb784aa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyserial/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, python
+, 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
+
+  checkPhase = ''
+    runHook preCheck
+    ${python.interpreter} -m unittest discover -s test
+    runHook postCheck
+  '';
+
+  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/pysha3/default.nix b/nixpkgs/pkgs/development/python-modules/pysha3/default.nix
new file mode 100644
index 000000000000..8bdbb8601954
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysha3/default.nix
@@ -0,0 +1,18 @@
+{ lib, buildPythonPackage, fetchPypi, pythonOlder }:
+
+buildPythonPackage rec {
+  pname = "pysha3";
+  version = "1.0.2";
+  disabled = pythonOlder "2.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "17kkjapv6sr906ib0r5wpldmzw7scza08kv241r98vffy9rqx67y";
+  };
+
+  meta = {
+    description = "Backport of hashlib.sha3 for 2.7 to 3.5";
+    homepage = "https://github.com/tiran/pysha3";
+    license = lib.licenses.psfl;
+  };
+}
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..cadd47ca07b1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyshark/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, appdirs
+, lxml
+, packaging
+, py
+, pytestCheckHook
+, pythonOlder
+, wireshark-cli
+}:
+
+buildPythonPackage rec {
+  pname = "pyshark";
+  version = "0.5.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "KimiNewt";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-byll2GWY2841AAf8Xh+KfaCOtMGVKabTsLCe3gCdZ1o=";
+  };
+
+  sourceRoot = "${src.name}/src";
+
+  propagatedBuildInputs = [
+    appdirs
+    py
+    lxml
+    packaging
+  ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  checkInputs = [
+    pytestCheckHook
+    wireshark-cli
+  ];
+
+  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/";
+    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..ce4d09ba1748
--- /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=";
+  };
+
+  checkInputs = [
+    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..c06e1ed32ac8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysiaalarm/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, dataclasses-json
+, pycryptodome
+, setuptools-scm
+, pytest-asyncio
+, pytest-cases
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pysiaalarm";
+  version = "3.0.2";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-hS0OaafYjRdPVSCOHfb2zKp0tEOl1LyMJpwnpvsvALs=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "==" ">="
+    substituteInPlace pytest.ini \
+      --replace "--cov pysiaalarm --cov-report term-missing" ""
+  '';
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    dataclasses-json
+    pycryptodome
+  ];
+
+  checkInputs = [
+    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";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyside/apiextractor.nix b/nixpkgs/pkgs/development/python-modules/pyside/apiextractor.nix
new file mode 100644
index 000000000000..058414747440
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyside/apiextractor.nix
@@ -0,0 +1,34 @@
+{ lib, stdenv, fetchFromGitHub, cmake, libxml2, libxslt, python3, qt4 }:
+
+# This derivation does not provide any Python module and should therefore be called via `all-packages.nix`.
+let
+  pythonEnv = python3.withPackages (ps: with ps; [ sphinx ]);
+in
+stdenv.mkDerivation rec {
+  pname = "pyside-apiextractor";
+  version = "0.10.10";
+
+  src = fetchFromGitHub {
+    owner = "PySide";
+    repo = "Apiextractor";
+    rev = version;
+    sha256 = "sha256-YH8aYyzv59xiIglZbdNgOPnmEQwNE2GmotAFFfFdMlg=";
+  };
+
+  outputs = [ "out" "dev" ];
+
+  preConfigure = ''
+    cmakeFlagsArray=("-DCMAKE_INSTALL_PREFIX=$dev")
+  '';
+
+  nativeBuildInputs = [ cmake pythonEnv ];
+  buildInputs = [ qt4 libxml2 libxslt ];
+
+  meta = with lib; {
+    description = "Eases the development of bindings of Qt-based libraries for high level languages by automating most of the process";
+    license = licenses.gpl2;
+    homepage = "http://www.pyside.org/docs/apiextractor/";
+    maintainers = [ ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyside/default.nix b/nixpkgs/pkgs/development/python-modules/pyside/default.nix
new file mode 100644
index 000000000000..451c71e7eb43
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyside/default.nix
@@ -0,0 +1,34 @@
+{ lib, fetchFromGitHub, cmake, buildPythonPackage, pysideGeneratorrunner, pysideShiboken, qt4, mesa, libGL }:
+
+buildPythonPackage rec {
+  pname = "pyside";
+  version = "1.2.4";
+  format = "other";
+
+  src = fetchFromGitHub {
+    owner = "PySide";
+    repo = "PySide";
+    rev = version;
+    sha256 = "sha256-14XbihJRMk9WaeK6NUBV/4OMFZF8EBIJgEJEaCU8Ecg=";
+  };
+
+  outputs = [ "out" "dev" ];
+
+  preConfigure = ''
+    cmakeFlagsArray=("-DCMAKE_INSTALL_PREFIX=$dev")
+  '';
+
+  nativeBuildInputs = [ cmake pysideGeneratorrunner pysideShiboken qt4 ];
+
+  buildInputs = [ mesa libGL ];
+
+  makeFlags = [ "QT_PLUGIN_PATH=${pysideShiboken}/lib/generatorrunner" ];
+
+  dontWrapQtApps = true;
+
+  meta = {
+    description = "LGPL-licensed Python bindings for the Qt cross-platform application and UI framework";
+    license = lib.licenses.lgpl21;
+    homepage = "http://www.pyside.org";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyside/gcc6.patch b/nixpkgs/pkgs/development/python-modules/pyside/gcc6.patch
new file mode 100644
index 000000000000..440e94508c57
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyside/gcc6.patch
@@ -0,0 +1,18 @@
+--- Shiboken-1.2.4.org/tests/libsample/simplefile.cpp	2017-08-26 09:06:27.216859143 +0100
++++ Shiboken-1.2.4/tests/libsample/simplefile.cpp	2017-08-26 09:05:40.037029652 +0100
+@@ -90,13 +90,13 @@
+ SimpleFile::exists() const
+ {
+     std::ifstream ifile(p->m_filename);
+-    return ifile;
++    return (bool)ifile;
+ }
+ 
+ bool
+ SimpleFile::exists(const char* filename)
+ {
+     std::ifstream ifile(filename);
+-    return ifile;
++    return (bool)ifile;
+ }
+ 
diff --git a/nixpkgs/pkgs/development/python-modules/pyside/generatorrunner.nix b/nixpkgs/pkgs/development/python-modules/pyside/generatorrunner.nix
new file mode 100644
index 000000000000..f1e002daf4c5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyside/generatorrunner.nix
@@ -0,0 +1,33 @@
+{ lib, stdenv, fetchFromGitHub, cmake, pysideApiextractor, python3, qt4 }:
+
+# This derivation does not provide any Python module and should therefore be called via `all-packages.nix`.
+let
+  pythonEnv = python3.withPackages(ps: with ps; [ sphinx ]);
+in stdenv.mkDerivation rec {
+  pname = "pyside-generatorrunner";
+  version = "0.6.16";
+
+  src = fetchFromGitHub {
+    owner = "PySide";
+    repo = "Generatorrunner";
+    rev = version;
+    sha256 = "sha256-JAghKY033RTD5b2elitzVQbbN3PMmT3BHwpqx8N5EYg=";
+  };
+
+  outputs = [ "out" "dev" ];
+
+  preConfigure = ''
+    cmakeFlagsArray=("-DCMAKE_INSTALL_PREFIX=$dev")
+  '';
+
+  nativeBuildInputs = [ cmake pythonEnv ];
+  buildInputs = [ pysideApiextractor qt4 ];
+
+  meta = with lib; {
+    description = "Eases the development of binding generators for C++ and Qt-based libraries by providing a framework to help automating most of the process";
+    license = licenses.gpl2;
+    homepage = "http://www.pyside.org/docs/generatorrunner/";
+    maintainers = [ ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyside/shiboken.nix b/nixpkgs/pkgs/development/python-modules/pyside/shiboken.nix
new file mode 100644
index 000000000000..9bad569806a6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyside/shiboken.nix
@@ -0,0 +1,66 @@
+{ lib, fetchFromGitHub, buildPythonPackage
+, cmake
+, fetchurl
+, isPy3k
+, libxml2
+, libxslt
+, pkg-config
+, pysideApiextractor
+, pysideGeneratorrunner
+, python
+, pythonAtLeast
+, qt4
+, sphinx
+}:
+
+buildPythonPackage rec {
+  pname = "pyside-shiboken";
+  version = "1.2.4";
+  format = "other";
+
+  src = fetchFromGitHub {
+    owner = "PySide";
+    repo = "Shiboken";
+    rev = version;
+    sha256 = "0x2lyg52m6a0vn0665pgd1z1qrydglyfxxcggw6xzngpnngb6v5v";
+  };
+
+  nativeBuildInputs = [ cmake pkg-config pysideApiextractor pysideGeneratorrunner sphinx qt4 ];
+
+  buildInputs = [ python libxml2 libxslt ];
+
+  outputs = [ "out" "dev" ];
+
+  preConfigure = ''
+    cmakeFlagsArray=("-DCMAKE_INSTALL_PREFIX=$dev")
+    echo "preConfigure: Fixing shiboken_generator install target."
+    substituteInPlace generator/CMakeLists.txt --replace \
+      \"$\{GENERATORRUNNER_PLUGIN_DIR}\" lib/generatorrunner/
+  '';
+
+  patches = [
+    # gcc6 patch was also sent upstream: https://github.com/pyside/Shiboken/pull/86
+    ./gcc6.patch
+    (lib.optional (pythonAtLeast "3.5") ./shiboken_py35.patch)
+    (fetchurl {
+      # https://github.com/pyside/Shiboken/pull/90
+      name = "fix-build-with-python-3.9.patch";
+      url = "https://github.com/pyside/Shiboken/commit/d1c901d4c0af581003553865360ba964cda041e8.patch";
+      sha256 = "1f7slz8n8rps5r67hz3hi4rr82igc3l166shfy6647ivsb2fnxwy";
+    })
+  ];
+
+  cmakeFlags = lib.optionals isPy3k [
+    "-DUSE_PYTHON3=TRUE"
+    "-DPYTHON3_INCLUDE_DIR=${lib.getDev python}/include/${python.libPrefix}"
+    "-DPYTHON3_LIBRARY=${lib.getLib python}/lib"
+  ];
+
+  meta = with lib; {
+    description = "Plugin (front-end) for pyside-generatorrunner, that generates bindings for C++ libraries using CPython source code";
+    license = licenses.gpl2;
+    homepage = "http://www.pyside.org/";
+    maintainers = [ ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyside/shiboken_py35.patch b/nixpkgs/pkgs/development/python-modules/pyside/shiboken_py35.patch
new file mode 100644
index 000000000000..fb095cf991cf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyside/shiboken_py35.patch
@@ -0,0 +1,12 @@
+diff --git a/cmake/Modules/FindPython3Libs.cmake b/cmake/Modules/FindPython3Libs.cmake
+--- a/cmake/Modules/FindPython3Libs.cmake
++++ b/cmake/Modules/FindPython3Libs.cmake
+@@ -27,7 +27,7 @@ INCLUDE(CMakeFindFrameworks)
+ # Search for the python framework on Apple.
+ # CMAKE_FIND_FRAMEWORKS(Python)
+ 
+-FOREACH(_CURRENT_VERSION 3.4 3.3 3.2 3.1 3.0)
++FOREACH(_CURRENT_VERSION 3.7 3.6 3.5 3.4 3.3 3.2 3.1 3.0)
+   IF(_CURRENT_VERSION GREATER 3.1)
+       SET(_32FLAGS "m" "u" "mu" "dm" "du" "dmu" "")
+   ELSE()
diff --git a/nixpkgs/pkgs/development/python-modules/pyside/tools.nix b/nixpkgs/pkgs/development/python-modules/pyside/tools.nix
new file mode 100644
index 000000000000..cc52a0502f28
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyside/tools.nix
@@ -0,0 +1,34 @@
+{ lib, buildPythonPackage, fetchFromGitHub, cmake, qt4, pyside, pysideShiboken }:
+
+buildPythonPackage rec {
+  pname = "pyside-tools";
+  version = "0.2.15";
+  format = "other";
+
+  src = fetchFromGitHub {
+    owner = "PySide";
+    repo = "Tools";
+    rev = version;
+    sha256 = "017i2yxgjrisaifxqnl3ym8ijl63l2yl6a3474dsqhlyqz2nx2ll";
+  };
+
+  outputs = [ "out" "dev" ];
+
+  preConfigure = ''
+    cmakeFlagsArray=("-DCMAKE_INSTALL_PREFIX=$dev")
+  '';
+
+  nativeBuildInputs = [ cmake ];
+
+  buildInputs = [ qt4 ];
+
+  propagatedBuildInputs = [ pyside pysideShiboken ];
+
+  meta = with lib; {
+    description = "Development tools (pyside-uic/rcc/lupdate) for PySide, the LGPL-licensed Python bindings for the Qt framework";
+    license = licenses.gpl2;
+    homepage = "https://wiki.qt.io/PySide";
+    maintainers = [ ];
+    platforms = platforms.all;
+  };
+}
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..81df3cbe94c6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyside2/default.nix
@@ -0,0 +1,49 @@
+{ python, fetchurl, lib, stdenv,
+  cmake, ninja, qt5, shiboken2 }:
+
+stdenv.mkDerivation rec {
+  pname = "pyside2";
+  version = "5.15.5";
+
+  src = fetchurl {
+    url = "https://download.qt.io/official_releases/QtForPython/pyside2/PySide2-${version}-src/pyside-setup-opensource-src-${version}.tar.xz";
+    sha256 = "0cwvw6695215498rsbm2xzkwaxdr3w7zfvy4kc62c01k6pxs881r";
+  };
+
+  patches = [
+    ./dont_ignore_optional_modules.patch
+  ];
+
+  postPatch = ''
+    cd sources/pyside2
+  '';
+
+  cmakeFlags = [
+    "-DBUILD_TESTS=OFF"
+    "-DPYTHON_EXECUTABLE=${python.interpreter}"
+  ];
+
+  nativeBuildInputs = [ cmake ninja qt5.qmake python ];
+  buildInputs = (with qt5; [
+    qtbase qtxmlpatterns qtmultimedia qttools qtx11extras qtlocation qtscript
+    qtwebsockets qtwebengine qtwebchannel qtcharts qtsensors qtsvg
+  ]) ++ [
+    python.pkgs.setuptools
+  ];
+  propagatedBuildInputs = [ shiboken2 ];
+
+  dontWrapQtApps = true;
+
+  postInstall = ''
+    cd ../../..
+    ${python.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/pysigma-backend-elasticsearch/default.nix b/nixpkgs/pkgs/development/python-modules/pysigma-backend-elasticsearch/default.nix
new file mode 100644
index 000000000000..7ec64df2e1b8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysigma-backend-elasticsearch/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pysigma
+, pytestCheckHook
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "pysigma-backend-elasticsearch";
+  version = "0.1.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "SigmaHQ";
+    repo = "pySigma-backend-elasticsearch";
+    rev = "v${version}";
+    hash = "sha256-BEvYz0jTJifsNBrA4r16JkiFaERDj/zWKd9MbhcuCS8=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    pysigma
+  ];
+
+  checkInputs = [
+    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";
+    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..c373a2fc6776
--- /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.1.7";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "SigmaHQ";
+    repo = "pySigma-backend-insightidr";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-5uWSXUKLSJbkJHvMmFGrS/yukBO/ax8seg+0ZqAHdaE=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+    pythonRelaxDepsHook
+  ];
+
+  propagatedBuildInputs = [
+    pysigma
+  ];
+
+  pythonRelaxDeps = [
+    "pysigma"
+  ];
+
+  checkInputs = [
+    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..36e44c629855
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysigma-backend-opensearch/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pysigma
+, pysigma-backend-elasticsearch
+, pytestCheckHook
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "pysigma-backend-opensearch";
+  version = "0.1.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "SigmaHQ";
+    repo = "pySigma-backend-opensearch";
+    rev = "v${version}";
+    hash = "sha256-5+/LOi7GHu8h9WhjpZ7bBc4aM41NiXrSrdGhbXdYMvw=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    pysigma
+    pysigma-backend-elasticsearch
+  ];
+
+  checkInputs = [
+    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";
+    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..348dd6991a5b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysigma-backend-qradar/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pysigma
+, pysigma-pipeline-sysmon
+, pytestCheckHook
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "pysigma-backend-qradar";
+  version = "0.1.9";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "nNipsx-Sec";
+    repo = "pySigma-backend-qradar";
+    rev = "v${version}";
+    hash = "sha256-b3e8cVrVFZgihhEk6QlUnRZigglczHUa/XeMvMzNYLk=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    pysigma
+  ];
+
+  checkInputs = [
+    pysigma-pipeline-sysmon
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "sigma.backends.qradar"
+  ];
+
+  meta = with lib; {
+    description = "Library to support Qradar for pySigma";
+    homepage = "https://github.com/nNipsx-Sec/pySigma-backend-qradar";
+    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..b44baae526b0
--- /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 = "0.3.6";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "SigmaHQ";
+    repo = "pySigma-backend-splunk";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-6XvKytODJll9BPeAhk6girwLibNJk+QEn2AV/WNqnyI=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    pysigma
+  ];
+
+  checkInputs = [
+    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..d6207f7082a2
--- /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 = "0.1.7";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "SigmaHQ";
+    repo = "pySigma-pipeline-crowdstrike";
+    rev = "v${version}";
+    hash = "sha256-cALpOAn+zf1w7KYExBVFebRwNYMjiQPE7fdB1x7gHZw=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    pysigma
+  ];
+
+  checkInputs = [
+    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..23c9b5eef4d5
--- /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.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "SigmaHQ";
+    repo = "pySigma-pipeline-sysmon";
+    rev = "v${version}";
+    hash = "sha256-OwWUt1O8436kmuaqv8Ec6485NLkVztLjGIWF2SPRtKA=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    pysigma
+  ];
+
+  checkInputs = [
+    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..98808b6090a2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysigma-pipeline-windows/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pysigma
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pysigma-pipeline-windows";
+  version = "1.0.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "SigmaHQ";
+    repo = "pySigma-pipeline-windows";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-/DUhgvcGhk28HRDCi96K1NH6MHNB1WogfuMVCgNbot4=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    pysigma
+  ];
+
+  checkInputs = [
+    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";
+    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..b75df650acdf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysigma/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, poetry-core
+, pyparsing
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+}:
+
+buildPythonPackage rec {
+  pname = "pysigma";
+  version = "0.7.3";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "SigmaHQ";
+    repo = "pySigma";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-yXzYNBD39dPd2f5Gvmo5p0cVlTy38q1jnBL+HjAxmB8=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    pyparsing
+    pyyaml
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "sigma"
+  ];
+
+  meta = with lib; {
+    description = "Library to parse and convert Sigma rules into queries";
+    homepage = "https://github.com/SigmaHQ/pySigma";
+    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..023b6dde3eb8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysignalclirestapi/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, requests
+, future
+}:
+
+buildPythonPackage rec {
+  pname = "pysignalclirestapi";
+  version = "0.3.18";
+
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "bbernhard";
+    repo = "pysignalclirestapi";
+    rev = version;
+    hash = "sha256-BF4BmnQVfrj7f0N+TN/d7GNuDTbDQfwsCkUn2pVmMWo=";
+  };
+
+  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/pysimplegui/default.nix b/nixpkgs/pkgs/development/python-modules/pysimplegui/default.nix
new file mode 100644
index 000000000000..4b6f61b8114d
--- /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.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    pname = "PySimpleGUI";
+    inherit version;
+    sha256 = "sha256-dexGaU3JdcDka+jFendOA4QztTCVgh1nvjsiGso/1o0=";
+  };
+
+  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/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..6f60fec79f2f
--- /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;
+    sha256 = "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..abfb8838207e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyskyqremote/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, requests
+, websocket-client
+, xmltodict
+}:
+
+buildPythonPackage rec {
+  pname = "pyskyqremote";
+  version = "0.3.15";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "RogerSelwyn";
+    repo = "skyq_remote";
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-K21ASxMcFsT0qevjXDPmVIQjdW56UT8QMOuyT7e2yDc=";
+  };
+
+  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";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..248ccc41033b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyslurm/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, pythonOlder
+, fetchFromGitHub
+, buildPythonPackage
+, cython
+, slurm
+}:
+
+buildPythonPackage rec {
+  pname = "pyslurm";
+  version = "21.08.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    repo = "pyslurm";
+    owner = "PySlurm";
+    rev = "v${version}";
+    hash = "sha256-9ZYTBO8g+5B9D8Ll5JjkJYFyh0RQNIjxg958UZoCNmA=";
+  };
+
+  buildInputs = [ cython slurm ];
+
+  setupPyBuildFlags = [ "--slurm-lib=${slurm}/lib" "--slurm-inc=${slurm.dev}/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..5ec0aa44995e
--- /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.6.12";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-uxMxqx5qbahMvTm3akiOTODhKLNVhHzBAUsOcZo/35I=";
+  };
+
+  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..3bd5fa50a133
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysmart/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, smartmontools
+, humanfriendly
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pysmart";
+  version = "1.1.0";
+
+  src = fetchFromGitHub {
+    owner = "truenas";
+    repo = "py-SMART";
+    rev = "v${version}";
+    sha256 = "sha256-e46ALiYg0Db/gOzqLmVc1vi9ObhfxzqwfQk9/9pz+r0=";
+  };
+
+  postPatch = ''
+    substituteInPlace pySMART/utils.py \
+      --replace "which('smartctl')" '"${smartmontools}/bin/smartctl"'
+  '';
+
+  propagatedBuildInputs = [ humanfriendly ];
+
+  checkInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "pySMART" ];
+
+  meta = with lib; {
+    description = "Wrapper for smartctl (smartmontools)";
+    homepage = "https://github.com/truenas/py-SMART";
+    maintainers = with maintainers; [ nyanloutre ];
+    license = licenses.lgpl21Only;
+  };
+}
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..a4ab8e58382c
--- /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.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "andrewsayre";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-zYjv7wRxQTS4PnNaY69bw9xE6I4DZMocwUzEICBfwqM=";
+  };
+
+  propagatedBuildInputs = [
+    httpsig
+  ];
+
+  checkInputs = [
+    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/pysmartthings/default.nix b/nixpkgs/pkgs/development/python-modules/pysmartthings/default.nix
new file mode 100644
index 000000000000..8e97570a2c78
--- /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.7";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "andrewsayre";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-AzAiMn88tRRPwMpwSnKoS1XUERHbKz0sVm/TjcbTsGs=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  checkInputs = [
+    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..01f30bf2d5f1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysmb/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pyasn1
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pysmb";
+  version = "1.2.8";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    format = "setuptools";
+    extension = "zip";
+    hash = "sha256-OwfbFiF0ZQOdDCVpTAcFuDZjyoIlniCfNWbVd1Nqc5U=";
+  };
+
+  propagatedBuildInputs = [
+    pyasn1
+  ];
+
+  # 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; {
+    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..93aa6606c7d5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysmbc/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, samba
+, pkg-config
+}:
+
+buildPythonPackage rec {
+  pname = "pysmbc";
+  version = "1.0.23";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1y0n1n6jkzf4mr5lqfc73l2m0qp56gvxwfjnx2vj8c0hh5i1gnq8";
+  };
+
+  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..3b350954eae3
--- /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 = "http://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..3ff7bee167cb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysml/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, async-timeout
+, bitstring
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pyserial-asyncio
+}:
+
+buildPythonPackage rec {
+  pname = "pysml";
+  version = "0.0.8";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "mtdcr";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-Qw2irvj94cBquYeVUhqOq8lw85oP5TqtA2XTT2z5/as=";
+  };
+
+  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..3f003aa9fb05
--- /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=";
+  };
+
+  checkInputs = [
+    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..3caccf688b8c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysnmp-pyasn1/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, poetry-core
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pysnmp-pyasn1";
+  version = "1.1.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "pysnmp";
+    repo = "pyasn1";
+    rev = "v${version}";
+    hash = "sha256-R4reMwVcJBTfTEHUk6sSUugsEPuKIziH1WbjMakP/dA=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pyasn1"
+  ];
+
+  meta = with lib; {
+    description = "Python ASN.1 encoder and decoder";
+    homepage = "https://github.com/pysnmp/pyasn1";
+    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..aa847ea4fdc3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysnmplib/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pycryptodomex
+, pysnmp-pyasn1
+, pysnmp-pysmi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pysnmplib";
+  version = "5.0.17";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "pysnmp";
+    repo = "pysnmp";
+    rev = "v${version}";
+    hash = "sha256-RG8EJmNDXRozlFx76c7p4wILwkatHg/eAhVojp807uQ=";
+  };
+
+  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";
+    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..370ed373da55
--- /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.1.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "PySnooper";
+    hash = "sha256-0X3JHMoVk8ECMNzkXkax0/8PiRDww46UHt9roSYLOCA=";
+  };
+
+  checkInputs = [
+    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/pysnow/default.nix b/nixpkgs/pkgs/development/python-modules/pysnow/default.nix
new file mode 100644
index 000000000000..36e45d9d8695
--- /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
+  ];
+
+  checkInputs = [
+    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";
+      sha256 = "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/pysolcast/default.nix b/nixpkgs/pkgs/development/python-modules/pysolcast/default.nix
new file mode 100644
index 000000000000..fea0b68dcce9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysolcast/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, isodate
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, requests
+, responses
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "pysolcast";
+  version = "1.0.7";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "mcaulifn";
+    repo = "solcast";
+    rev = "v${version}";
+    sha256 = "J4D7W89Qz1Nv4DeqOmHVAWfmThlY5puBjSClRkfwhVw=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    isodate
+    pyyaml
+    requests
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    responses
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "pytest-runner" ""
+  '';
+
+  pythonImportsCheck = [
+    "pysolcast"
+  ];
+
+  meta = with lib; {
+    description = "Python library for interacting with the Solcast API";
+    homepage = "https://github.com/mcaulifn/solcast";
+    # No license statement present
+    # https://github.com/mcaulifn/solcast/issues/70
+    license = with licenses; [ unfree ];
+    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..a7f34b9c13a1
--- /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 ];
+
+  checkInputs = [ 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..beba51305780
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysoma/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "pysoma";
+  version = "0.0.11";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-U/kLaO/GBpOa9mHHlYQiWSw7sVNPaMneDURoJBqqojo=";
+  };
+
+  # 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..132c904dc3ef
--- /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}";
+    sha256 = "sha256-gBOknYHL5nQWFVhCbLN0Ah+1fovcNY4P2myryZnUadk=";
+  };
+
+  propagatedBuildInputs = [
+    ifaddr
+    requests
+    xmltodict
+  ];
+
+  checkInputs = [
+    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..dfce66ee52df
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyspark/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, py4j
+}:
+
+buildPythonPackage rec {
+  pname = "pyspark";
+  version = "3.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-fr6OlQVke00STVqC/KYN/TiRAhz4rWxeyId37uzpLPc=";
+  };
+
+  # pypandoc is broken with pandoc2, so we just lose docs.
+  postPatch = ''
+    sed -i "s/'pypandoc'//" setup.py
+
+    substituteInPlace setup.py \
+      --replace py4j==0.10.9.3 'py4j>=0.10.9,<0.11'
+  '';
+
+  propagatedBuildInputs = [
+    py4j
+  ];
+
+  # 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 = [ maintainers.shlevy ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysparse/default.nix b/nixpkgs/pkgs/development/python-modules/pysparse/default.nix
new file mode 100644
index 000000000000..02c1c36d0837
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysparse/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, numpy
+, blas
+, lapack
+, isPy27
+, python
+}:
+
+buildPythonPackage {
+  pname = "pysparse";
+  version = "1.3-dev";
+  disabled = !isPy27;
+
+  src = fetchFromGitHub {
+    owner = "PythonOptimizers";
+    repo = "pysparse";
+    rev = "f8430bd99ac2a6209c462657c5792d10033888cc";
+    sha256 = "19xcq8214yndra1xjhna3qjm32wprsqck97dlnw3xcww7rfy6hqh";
+  };
+
+  hardeningDisable = [ "all" ];
+
+  propagatedBuildInputs = [
+    numpy
+    blas
+    lapack
+  ];
+
+  # Include patches from working version of PySparse 1.3-dev in
+  # Conda-Forge,
+  # https://github.com/conda-forge/pysparse-feedstock/tree/b69266911a2/recipe
+  # Thanks to https://github.com/guyer
+  patches = [ ./dropPackageLoader.patch ];
+
+  checkPhase = ''
+    cd test
+    ${python.interpreter} -c "import pysparse"
+    ${python.interpreter} test_sparray.py
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/PythonOptimizers/pysparse";
+    description = "A Sparse Matrix Library for Python";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ costrouc ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysparse/dropPackageLoader.patch b/nixpkgs/pkgs/development/python-modules/pysparse/dropPackageLoader.patch
new file mode 100644
index 000000000000..b2526645f890
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysparse/dropPackageLoader.patch
@@ -0,0 +1,88 @@
+diff --git a/pysparse/__init__.py b/pysparse/__init__.py
+index 6d09b00..ff39084 100644
+--- a/pysparse/__init__.py
++++ b/pysparse/__init__.py
+@@ -1,9 +1,42 @@
+-"PySparse: A Fast Sparse Matrix Library for Python"
++"""
++PySparse: A Fast Sparse Matrix Library for Python
++=================================================
++
++Documentation is available in the docstrings and
++online at http://pysparse.sourceforge.net/.
++
++Contents
++--------
++Pysparse imports
++::
++ spmatrix                     --- sparse matrix types
++
++and, in addition, provides:
++    
++Subpackages
++-----------
++Using any of these subpackages requires an explicit import.  For example,
++``import pysparse.itsolvers``.
++
++::
++
++ itsolvers                    --- Iterative linear algebra solvers
++ precon                       --- Preconditioners
++ direct                       --- Direct solvers
++ direct.superlu               --- Wrappers to SuperLU library
++ direct.umfpack               --- Wrappers to UMFPACK library
++ eigen.jdsym                  --- Jacobi davidson eigenvalue solver for symmetric matrices
++ 
++Utility tools
++-------------
++::
++
++ __version__       --- pysparse version string
++"""
++
+ 
+ __docformat__ = 'restructuredtext'
+ 
+-# Imports
+-from numpy._import_tools import PackageLoader
+ try:
+     from version import version as __version__
+ except ImportError:
+@@ -11,31 +44,6 @@ except ImportError:
+     __version__ = 'undefined'
+     
+ from sparse import spmatrix
+-#from sparse import *
+-from misc import get_include
+-
+-pkgload = PackageLoader()
+-pkgload(verbose=False,postpone=True)
+-
+-if __doc__:
+-    __doc__ += """
+-
+-Available subpackages
+----------------------
+-"""
+-if __doc__:
+-    __doc__ += pkgload.get_pkgdocs()
+-
+-__all__ = filter(lambda s: not s.startswith('_'), dir())
+-__all__ += '__version__'
+-
+-__doc__ += """
+-
+-Miscellaneous
+--------------
+-
+-    __version__  :  pysparse version string
+-"""
+ 
+ from pysparse.misc import Deprecated
+ 
+@@ -47,3 +55,5 @@ class _superlu:
+         return self.factorizeFnc(*args, **kwargs)
+     
+ superlu = _superlu()
++
++__all__ = ['spmatrix', 'superlu', '__version__']
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..b847240869ac
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyspcwebgw/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, aiohttp
+, aioresponses
+, asynccmd
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyspcwebgw";
+  version = "0.6.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "mbrrg";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-Pjv8AxXuwi48Z8U+LSZZ+OhXrE3KlX7jlmnXTBLxXOs=";
+  };
+
+  propagatedBuildInputs = [
+    asynccmd
+    aiohttp
+  ];
+
+  checkInputs = [
+    aioresponses
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "--asyncio-mode=legacy"
+  ];
+
+  pythonImportsCheck = [ "pyspcwebgw" ];
+
+  meta = with lib; {
+    description = "Python module for the SPC Web Gateway REST API";
+    homepage = "https://github.com/mbrrg/pyspcwebgw";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..966fb6679237
--- /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.5.3";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "jborean93";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-awlS1VHXj6n9Ee4qUI1x5tEdkMF/ZEr9NPKh4ICkv3g=";
+  };
+
+  propagatedBuildInputs = [
+    cryptography
+    gssapi
+    krb5
+    ruamel-yaml
+  ];
+
+  checkInputs = [
+    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..e229648bc75d
--- /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.1.21";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-AZUDI9AL57tXz7VzPGF9uEeKW4/6JsaBUiFkigl640Q=";
+  };
+
+  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/pysqlcipher3/default.nix b/nixpkgs/pkgs/development/python-modules/pysqlcipher3/default.nix
new file mode 100644
index 000000000000..9c98664af1ca
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysqlcipher3/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildPythonPackage, fetchPypi, pythonAtLeast, sqlcipher }:
+
+buildPythonPackage rec {
+  pname = "pysqlcipher3";
+  version = "1.0.4";
+
+  disabled = pythonAtLeast "3.9";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "75d6b9d023d7ab76c841f97fd9d108d87516e281268e61518411d08cb7062663";
+  };
+
+  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; [ SuperSandro2000 ];
+  };
+}
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..67344d8a5744
--- /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.6.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "rajlaud";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-0ArKVRy4H0NWShlQMziKvbHp9OjpAkEKp4zrvpVlXOk=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  checkInputs = [
+    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..4f295dfc7c27
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysrim/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, pytest-runner
+, numpy
+, pyyaml
+}:
+
+buildPythonPackage rec {
+  pname = "pysrim";
+  version = "0.5.10";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ada088f73f7e1a3bf085206e81e0f83ed89c1d0b23a789ecd0ba0a250724aee8";
+  };
+
+  buildInputs = [ pytest-runner ];
+  propagatedBuildInputs = [ numpy pyyaml ];
+
+  # Tests require git lfs download of repository
+  doCheck = false;
+
+  meta = {
+    description = "Srim Automation of Tasks via Python";
+    homepage = "https://gitlab.com/costrouc/pysrim";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ costrouc ];
+  };
+}
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..1099bffc40f0
--- /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";
+  };
+
+  checkInputs = [ 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..cdbbfeabf887
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyssim/default.nix
@@ -0,0 +1,32 @@
+{ lib, buildPythonPackage, fetchFromGitHub, numpy, scipy, pillow }:
+
+buildPythonPackage rec {
+  pname = "pyssim";
+  version = "0.4";
+
+  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 = "0rnj3xdhma1fc0fg0jjsdy74ar0hgr3w8kygbnijqjdms7m3asqm";
+  };
+
+  # 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..67ee0063827f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pystache/default.nix
@@ -0,0 +1,29 @@
+{ lib, buildPythonPackage, python, fetchPypi, isPy3k, glibcLocales }:
+
+buildPythonPackage rec {
+  pname = "pystache";
+  version = "0.6.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "93bf92b2149a4c4b58d12142e2c4c6dd5c08d89e4c95afccd4b6efe2ee1d470d";
+  };
+
+  LC_ALL = "en_US.UTF-8";
+
+  buildInputs = [ glibcLocales ];
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest discover
+  '';
+
+  # SyntaxError Python 3
+  # https://github.com/defunkt/pystache/issues/181
+  doCheck = !isPy3k;
+
+  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;
+  };
+}
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..763ac34c5171
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pystemd/default.nix
@@ -0,0 +1,38 @@
+{ stdenv
+, buildPythonPackage
+, lib
+, python
+, systemd
+, pytest
+, mock
+, pkg-config }:
+
+buildPythonPackage rec {
+  pname = "pystemd";
+  version = "0.10.0";
+  src = python.pkgs.fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-10qBS/2gEIXbGorZC+PLJ9ryOlGrawPn4p7IEfoq6Fk=";
+  };
+
+  disabled = python.pythonOlder "3.4";
+
+  buildInputs = [ systemd ];
+
+  nativeBuildInputs = [ pkg-config ];
+
+  checkInputs = [ pytest mock ];
+
+  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..120867f389cc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pystemmer/default.nix
@@ -0,0 +1,28 @@
+{ lib, python, fetchPypi, buildPythonPackage, cython }:
+
+buildPythonPackage rec {
+  pname = "PyStemmer";
+  version = "2.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9b81c35302f1d2a5ad9465b85986db246990db93d97d3e8f129269ed7102788e";
+  };
+
+  nativeBuildInputs = [ cython ];
+
+  preBuild = ''
+    cython src/Stemmer.pyx
+  '';
+
+  checkPhase = ''
+    ${python.interpreter} runtests.py
+  '';
+
+  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..c3cf0a9841fa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pystray/default.nix
@@ -0,0 +1,32 @@
+{ lib, buildPythonPackage, fetchFromGitHub
+, pillow, xlib, six, xvfb-run, sphinx }:
+
+buildPythonPackage rec {
+  pname = "pystray";
+  version = "0.19.2";
+
+  src = fetchFromGitHub {
+    owner = "moses-palmer";
+    repo = "pystray";
+    rev = "v${version}";
+    sha256 = "sha256-8B178MSe4ujlnGBmQhIu+BoAh1doP9V5cL0ermLQTvs=";
+  };
+
+  nativeBuildInputs = [ sphinx ];
+  propagatedBuildInputs = [ pillow xlib six ];
+  checkInputs = [ 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/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..37e3490a54c7
--- /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.12";
+  format = "other";
+
+  src = fetchurl {
+    url = "https://pysvn.barrys-emacs.org/source_kits/${pname}-${version}.tar.gz";
+    sha256 = "sRPa4wNyjDmGdF1gTOgLS0pnrdyZwkkH4/9UCdh/R9Q=";
+  };
+
+  buildInputs = [ bash subversion apr aprutil expat neon openssl ]
+    ++ lib.optionals stdenv.isLinux [ e2fsprogs ]
+    ++ lib.optionals stdenv.isDarwin [ gcc ];
+
+  postPatch = ''
+    sed -i "117s|append(|insert(0, |" Tests/benchmark_diff.py
+  '';
+
+  preConfigure = ''
+    cd Source
+    ${python.interpreter} setup.py backport
+    ${python.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
+  '' + (lib.optionalString (stdenv.isDarwin && !isPy3k) ''
+    sed -i -e 's|libpython2.7.dylib|lib/libpython2.7.dylib|' Makefile
+  '');
+
+  checkInputs = [ 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
+
+    ${python.interpreter} -c "import pysvn"
+
+    runHook postCheck
+  '';
+
+  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 = "http://pysvn.tigris.org/";
+    license = licenses.asl20;
+    # g++: command not found
+    broken = stdenv.isDarwin;
+  };
+}
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..1f42d140d564
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyswitchbot/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, bleak
+, bleak-retry-connector
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyswitchbot";
+  version = "0.18.10";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Danielhiversen";
+    repo = "pySwitchbot";
+    rev = "refs/tags/${version}";
+    hash = "sha256-tK5U94rHPz/LHU4qAj1yv8CtMhjpAIQ1ktFooVIIqiw=";
+  };
+
+  propagatedBuildInputs = [
+    bleak
+    bleak-retry-connector
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "switchbot"
+  ];
+
+  meta = with lib; {
+    description = "Python library to control Switchbot IoT devices";
+    homepage = "https://github.com/Danielhiversen/pySwitchbot";
+    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..ae670c709a32
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysyncobj/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+}:
+
+buildPythonPackage rec {
+  pname = "pysyncobj";
+  version = "0.3.11";
+
+  src = fetchFromGitHub {
+    owner = "bakwc";
+    repo = "PySyncObj";
+    rev = version;
+    sha256 = "sha256-MsyEDRla+okamffm78hoC2OwhjHLvCDQeZCzPZPbGy4=";
+  };
+
+  # Tests require network features
+  doCheck = false;
+  pythonImportsCheck = [ "pysyncobj" ];
+
+  meta = with lib; {
+    description = "Python library for replicating your class";
+    homepage = "https://github.com/bakwc/PySyncObj";
+    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/pytado/default.nix b/nixpkgs/pkgs/development/python-modules/pytado/default.nix
new file mode 100644
index 000000000000..fcff8365ffd9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytado/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "pytado";
+  version = "0.13.0";
+
+  src = fetchFromGitHub {
+    owner = "wmalgadey";
+    repo = "PyTado";
+    # Upstream hasn't tagged 0.13.0 yet
+    rev = "2a243174e9ae01ef7adae940ecc6e340992ab28d";
+    sha256 = "Y1FxEzs/AF0ZTPdOK/1v+2U2fidfu+AmZbPddJCWIFc=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "PyTado"
+  ];
+
+  meta = with lib; {
+    description = "Python binding for Tado web API";
+    homepage = "https://github.com/wmalgadey/PyTado";
+    license = licenses.gpl3;
+    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..cd51421fbc74
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytaglib/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, taglib
+, cython
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pytaglib";
+  version = "1.5.0-1";
+
+  src = fetchFromGitHub {
+    owner = "supermihi";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1nssiqzlzvzdd3pc5xd1qwgwgkyazynmq8qiljz0dhy0c8j6mkfp";
+  };
+
+  buildInputs = [
+    cython
+    taglib
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "taglib" ];
+
+  meta = with lib; {
+    description = "Python bindings for the Taglib audio metadata library";
+    homepage = "https://github.com/supermihi/pytaglib";
+    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..3823f0270381
--- /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.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "johnthagen";
+    repo = "pytap2";
+    rev = "v${version}";
+    hash = "sha256-/t0Seg+8ZrOWOHBu9ftE1xkrnDeoYdHopXBvJTMGYRI=";
+  };
+
+  propagatedBuildInputs = [
+    nettools
+  ];
+
+  checkInputs = [
+    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/pytautulli/default.nix b/nixpkgs/pkgs/development/python-modules/pytautulli/default.nix
new file mode 100644
index 000000000000..aee51ae764f8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytautulli/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, aiohttp
+, aresponses
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pytautulli";
+  version = "21.11.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "ludeeus";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-zODU3aN+8Fdw/GQ/EfZhn6kOuLDARKgLULzRw2+b2BM=";
+  };
+
+  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
+  ];
+
+  checkInputs = [
+    aresponses
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "--asyncio-mode=legacy"
+  ];
+
+  pythonImportsCheck = [
+    "pytautulli"
+  ];
+
+  meta = with lib; {
+    description = "Python module to get information from Tautulli";
+    homepage = "https://github.com/ludeeus/pytautulli";
+    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..e703a934466c
--- /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;
+    sha256 = "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 ];
+
+  checkInputs = [ 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..4a411c7685d7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytenable/default.nix
@@ -0,0 +1,76 @@
+{ lib
+, appdirs
+, buildPythonPackage
+, defusedxml
+, fetchFromGitHub
+, marshmallow
+, pytest-datafiles
+, pytest-vcr
+, pytestCheckHook
+, python-box
+, python-dateutil
+, pythonOlder
+, requests
+, requests-pkcs12
+, responses
+, restfly
+, semver
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "pytenable";
+  version = "1.4.7";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "tenable";
+    repo = "pyTenable";
+    rev = "refs/tags/${version}";
+    hash = "sha256-w6IM82nxv6rg3XbrHZfoN517usOOo/ly1GGgjnIdcEw=";
+  };
+
+  propagatedBuildInputs = [
+    semver
+  ];
+
+  buildInputs = [
+    appdirs
+    defusedxml
+    marshmallow
+    python-box
+    python-dateutil
+    requests
+    requests-pkcs12
+    restfly
+    typing-extensions
+  ];
+
+  checkInputs = [
+    responses
+    pytest-datafiles
+    pytest-vcr
+    pytestCheckHook
+  ];
+
+  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"
+  ];
+
+  pythonImportsCheck = [
+    "tenable"
+  ];
+
+  meta = with lib; {
+    description = "Python library for the Tenable.io and TenableSC API";
+    homepage = "https://github.com/tenable/pyTenable";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..a2fa23834a6e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytesseract/default.nix
@@ -0,0 +1,41 @@
+{ buildPythonPackage, fetchFromGitHub, lib, packaging, pillow, tesseract, substituteAll
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pytesseract";
+  version = "0.3.10";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "madmaze";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-CyKXtaIE/8iPLqi0GHVUgTeJDYZyWBjkRvOKJJKCxZo=";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./tesseract-binary.patch;
+      drv = tesseract;
+    })
+  ];
+
+  buildInputs = [
+    tesseract
+  ];
+
+  propagatedBuildInputs = [
+    packaging
+    pillow
+  ];
+
+  checkInputs = [ 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..09c278a70e10
--- /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.4.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "klen";
+    repo = "pytest-aio";
+    rev = version;
+    sha256 = "pLH0yXe/KS9ohI8+hWSprP1OA3Qjki2BPqeApMPMGDs=";
+  };
+
+  postPatch = ''
+    sed -i '/addopts/d' setup.cfg
+  '';
+
+  buildInputs = [
+    pytest
+  ];
+
+  checkInputs = [
+    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..bc9d4c37a876
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-aiohttp/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools-scm
+, aiohttp
+, pytest
+, pytest-asyncio
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-aiohttp";
+  version = "1.0.4";
+
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "39ff3a0d15484c01d1436cbedad575c6eafbf0f57cdf76fb94994c97b5b8c5a4";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  buildInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    pytest-asyncio
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/aio-libs/pytest-aiohttp/";
+    changelog = "https://github.com/aio-libs/pytest-aiohttp/blob/v${version}/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..d73e3b8f8e6a
--- /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.isLinux && stdenv.isAarch64) || stdenv.isDarwin;
+    description = "Generate PyAnnotate annotations from your pytest tests";
+    homepage = "https://github.com/kensho-technologies/pytest-annotate";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ costrouc ];
+  };
+}
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..ee8d7caf779a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-ansible/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, ansible
+, pytest
+, mock
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-ansible";
+  version = "2.2.4";
+
+  src = fetchFromGitHub {
+    owner = "ansible";
+    repo = "pytest-ansible";
+    rev = "v${version}";
+    sha256 = "0vr015msciwzz20zplxalfmfx5hbg8rkf8vwjdg3z12fba8z8ks4";
+  };
+
+  patchPhase = ''
+    sed -i "s/'setuptools-markdown'//g" setup.py
+  '';
+
+  buildInputs = [ pytest ];
+
+  # requires pandoc < 2.0
+  # buildInputs = [ setuptools-markdown ];
+  checkInputs =  [ mock ];
+  propagatedBuildInputs = [ ansible ];
+
+  # tests not included with release, even on github
+  doCheck = false;
+
+  checkPhase = ''
+    HOME=$TMPDIR pytest tests/
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/jlaska/pytest-ansible";
+    description = "Plugin for py.test to simplify calling ansible modules from tests or fixtures";
+    license = licenses.mit;
+    maintainers = [ maintainers.costrouc ];
+    # https://github.com/ansible-community/pytest-ansible/blob/v2.2.4/setup.py#L124
+    broken = lib.versionAtLeast ansible.version "2.10";
+  };
+}
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..95e22510d8a0
--- /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; [ costrouc ];
+  };
+}
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..acc555035822
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-astropy-header/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, pytest
+, pytest-cov
+, pytestCheckHook
+, numpy
+, astropy
+, scipy
+, h5py
+, scikitimage
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-astropy-header";
+  version = "0.1.2";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1y87agr324p6x5gvhziymxjlw54pyn4gqnd49papbl941djpkp5g";
+  };
+  patches = [ (fetchpatch {
+      url = "https://github.com/astropy/pytest-astropy-header/pull/16.patch";
+      sha256 = "11ln63zq0kgsdx1jw3prlzpcdbxmc99p9cwr18s0x6apy0k6df31";
+    })
+    (fetchpatch {
+      url = "https://github.com/astropy/pytest-astropy-header/pull/29.patch";
+      sha256 = "18l434c926r5z1iq3b6lpnp0lrssszars9y1y9hs6216r60jgjpl";
+    })
+  ];
+
+  buildInputs = [
+    pytest
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    pytest-cov
+    numpy
+    scipy
+    h5py
+    scikitimage
+    astropy
+  ];
+
+  meta = with lib; {
+    description = "Plugin to add diagnostic information to the header of the test output";
+    homepage = "https://astropy.org";
+    license = licenses.bsd3;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..45ad26ab279e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-astropy/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, hypothesis
+, pytest
+, pytest-arraydiff
+, pytest-astropy-header
+, 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;
+    sha256 = "sha256-hePGbO7eTOZo9HOzzzd/yyqjxI4k8oqqN3roYATM4hE=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  buildInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    hypothesis
+    pytest-arraydiff
+    pytest-astropy-header
+    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; [ costrouc ];
+  };
+}
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..6eac9bf333be
--- /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.19.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "pytest-dev";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-A8ngASbSRwY4RjanalnWBGgskZMDO50ffOf6wMNqOvA=";
+  };
+
+  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/${src.rev}/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..17e60e4369bd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-asyncio/tests.nix
@@ -0,0 +1,28 @@
+{ buildPythonPackage
+, flaky
+, hypothesis
+, pytest-asyncio
+, pytest-trio
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-asyncio-tests";
+  inherit (pytest-asyncio) version;
+
+  src = pytest-asyncio.testout;
+
+  dontBuild = true;
+  dontInstall = true;
+
+  propagatedBuildInputs = [
+    pytest-asyncio
+  ];
+
+  checkInputs = [
+    flaky
+    hypothesis
+    pytest-trio
+    pytestCheckHook
+  ];
+}
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..cfae0cb2bf95
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-bdd/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, execnet
+, glob2
+, Mako
+, mock
+, parse
+, parse-type
+, py
+, pytest
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-bdd";
+  version = "6.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "pytest-dev";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-1dyAhvEw8gUe78qDpgrcwl6grWKiwPgSe/QeFAjBzZg=";
+  };
+
+  buildInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    glob2
+    Mako
+    parse
+    parse-type
+    py
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    execnet
+    mock
+  ];
+
+  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..b9def8d834af
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-benchmark/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pathlib
+, py-cpuinfo
+, pytest
+, pythonOlder
+, statistics
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-benchmark";
+  version = "3.4.1";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "ionelmc";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-qc/8Epax5bPUZvhq42xSj6NUq0T4gbO5dDDS6omWBOU=";
+  };
+
+  buildInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    py-cpuinfo
+  ] ++ lib.optionals (pythonOlder "3.4") [
+    pathlib
+    statistics
+  ];
+
+  # Circular dependency
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pytest_benchmark"
+  ];
+
+  meta = with lib; {
+    description = "Pytest fixture for benchmarking code";
+    homepage = "https://github.com/ionelmc/pytest-benchmark";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ costrouc ];
+  };
+}
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..6697db4746e5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-cases/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, makefun
+, decopatch
+, pythonOlder
+, pytest
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-cases";
+  version = "3.6.13";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-e1hEMyMSgLFqdPNNm6H1CrzGuXPTujrakFPCxBoR+3c=";
+  };
+
+  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 dependecies.
+  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";
+    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..9efd9f49f2b4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-celery/default.nix
@@ -0,0 +1,31 @@
+{ lib, buildPythonPackage, fetchFromGitHub }:
+
+buildPythonPackage rec {
+  pname = "pytest-celery";
+  version = "0.1.0";
+
+  format = "flit";
+
+  src = fetchFromGitHub {
+    owner = "celery";
+    repo = "pytest-celery";
+    rev = "v${version}";
+    sha256 = "sha256-vzWwkOS3BLOInaFDk+PegvEmC88ZZ1sG1CmHwhn7r9w=";
+  };
+
+  postPatch = ''
+    # avoid infinite recursion with celery
+    substituteInPlace pyproject.toml \
+      --replace '"celery >= 4.4.0"' ""
+  '';
+
+  # 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..c690e01778b6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-check/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-check";
+  version = "1.0.5";
+  format = "flit";
+
+  src = fetchPypi {
+    pname = "pytest_check";
+    inherit version;
+    sha256 = "sha256-ucjbax3uPB5mFivQebgcCDKWy3Ex6YQVGcKKQIGKSHU=";
+  };
+
+  buildInputs = [ pytest ];
+  checkInputs = [ 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..767d300f7dd9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-cid/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, pythonOlder
+, py-cid
+, pytestCheckHook
+, pytest-cov
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-cid";
+  version = "1.1.1";
+  format = "flit";
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "ntninja";
+    repo = pname;
+    rev = "1ff9ec43ac9eaf76352ea7e7a060cd081cb8b68a"; # Version has no git tag
+    sha256 = "sha256-H2RtMGYWukowTTfqZSx+hikxzkqw1v5bA4AfZfiVl8U=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "pytest >= 5.0, < 7.0" "pytest >= 5.0"
+  '';
+
+  propagatedBuildInputs = [
+    py-cid
+  ];
+
+  checkInputs = [
+    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..82e6409c9b7f
--- /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}";
+    sha256 = "sha256-A/RF+SgPu2yYF3eHEFiZwKJW2VwQ185Ln6S3wn2cS0k=";
+  };
+
+  buildInputs = [ pytest ];
+
+  propagatedBuildInputs = [
+    click
+  ];
+
+  checkInputs = [ 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; [ costrouc ];
+  };
+}
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..32ccd22c9692
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-console-scripts/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, python
+, mock
+, setuptools-scm
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-console-scripts";
+  version = "1.3.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-XGw9qunPn77Q5lUHISiThgAZPcACpc8bGHJIZEugKFc=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  checkInputs = [
+    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..971b12dc01c7
--- /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 = "3.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "e7f0f5b1617d2210a2cabc266dfe2f4c75a8d32fb89eafb7ad9d06f6d076d470";
+  };
+
+  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..55ee719cd20f
--- /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";
+
+  checkInputs = [ 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..d53734618b3e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-datadir/default.nix
@@ -0,0 +1,32 @@
+{ lib, buildPythonPackage, fetchFromGitHub
+, setuptools-scm, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-datadir";
+  version = "1.3.1";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "gabrielcnr";
+    repo = pname;
+    rev = version;
+    sha256 = "0kwgp6sqnqnmww5r0dkmyfpi0lmw0iwxz3fnwn2fs8w6bvixzznf";
+  };
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  preBuild = ''
+    export SETUPTOOLS_SCM_PRETEND_VERSION="${version}"
+  '';
+
+  checkInputs = [ pytest ];
+  checkPhase = "pytest";
+
+  meta = with lib; {
+    homepage = "https://github.com/gabrielcnr/pytest-datadir";
+    description = "pytest plugin for manipulating test data directories and files";
+    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..fb960c13de51
--- /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 = "2.0.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "omarkohl";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-M0Lnsqi05Xs0uN6LlafNS7HJZOut+nrMZyvGPMMhIkc=";
+  };
+
+  buildInputs = [
+    py
+    pytest
+  ];
+
+  checkInputs = [
+    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..c583288b406f
--- /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";
+      sha256 = "sha256-xRreoIz8+yW0mAUb4FvKVlPjALzMAZDmdpbmDKRISE0=";
+    })
+  ];
+
+  buildInputs = [ pytest ];
+
+  checkInputs = [ 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..7f5fbf361597
--- /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.0.1";
+in
+buildPythonPackage {
+  inherit pname version;
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-5cuqMRafAGA0itXKAZECfl8fQfPyf97vIINl4JxV65o=";
+  };
+
+  buildInputs = [
+    pytest
+  ];
+
+  checkInputs = [
+    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..c4668def279e
--- /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 ];
+  checkInputs = [ 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..5752bca4f66f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-doctestplus/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, buildPythonPackage
+, fetchpatch
+, fetchPypi
+, packaging
+, pytest
+, pytestCheckHook
+, pythonOlder
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-doctestplus";
+  version = "0.11.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f393adf659709a5f111d6ca190871c61808a6f3611bd0a132e27e93b24dd3448";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  buildInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    packaging
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  patches = [
+    # Removal of distutils, https://github.com/astropy/pytest-doctestplus/pull/172
+    (fetchpatch {
+      name = "distutils-removal.patch";
+      url = "https://github.com/astropy/pytest-doctestplus/commit/ae2ee14cca0cde0fab355936995fa083529b00ff.patch";
+      sha256 = "sha256-uryKV7bWw2oz0glyh2lpGqtDPFvRTo8RmI1N1n15/d4=";
+    })
+  ];
+
+  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; [ costrouc ];
+  };
+}
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..3ae89e6a5197
--- /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 ];
+
+  checkInputs = [ 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-env/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-env/default.nix
new file mode 100644
index 000000000000..72df18c88475
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-env/default.nix
@@ -0,0 +1,20 @@
+{ lib, buildPythonPackage, fetchPypi, pytest }:
+
+buildPythonPackage rec {
+  pname = "pytest-env";
+  version = "0.6.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1hl0ln0cicdid4qjk7mv90lw9xkb0v71dlj7q7rn89vzxxm9b53y";
+  };
+
+  checkInputs = [ pytest ];
+
+  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..60d3f16a1c97
--- /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 ];
+
+  checkInputs = [ 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-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..eea6c61a7274
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-factoryboy/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, factory_boy
+, fetchFromGitHub
+, inflection
+, mock
+, pytest
+, pytestcache
+, pytestCheckHook
+, pytest-cov
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-factoryboy";
+  version = "2.1.0";
+
+  src = fetchFromGitHub {
+    owner = "pytest-dev";
+    repo = "pytest-factoryboy";
+    rev = version;
+    sha256 = "0v6b4ly0p8nknpnp3f4dbslfsifzzjx2vv27rfylx04kzdhg4m9p";
+  };
+
+  buildInputs = [ pytest ];
+
+  propagatedBuildInputs = [
+    factory_boy
+    inflection
+  ];
+
+  checkInputs = [
+    mock
+    pytestCheckHook
+    pytestcache
+    pytest-cov
+  ];
+
+  pytestFlagsArray = [ "--ignore=docs" ];
+  pythonImportsCheck = [ "pytest_factoryboy" ];
+
+  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..5df0aa976f1f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-filter-subpackage/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+, pytest-cov
+, pytest-doctestplus
+, pytestCheckHook
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-filter-subpackage";
+  version = "0.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1s4s2kd31yc65rfvl4xhy8xx806xhy59kc7668h6b6wq88xgrn5p";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  buildInputs = [ pytest ];
+
+  propagatedBuildInputs = [
+    pytest-doctestplus
+    pytest-cov
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  # missing some files
+  disabledTests = [ "with_rst" ];
+
+  meta = with lib; {
+    description = "Meta-package containing dependencies for testing";
+    homepage = "https://astropy.org";
+    license = licenses.bsd3;
+  };
+}
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..7d1b29fbd34b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-flake8/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, 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";
+  };
+
+  propagatedBuildInputs = [
+    flake8
+  ];
+
+  checkInputs = [
+    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 = true;  # https://github.com/tholo/pytest-flake8/issues/87
+  };
+}
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..afa04dfe937a
--- /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 ];
+  checkInputs = [ 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..5fdd5c757d41
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-flask/default.nix
@@ -0,0 +1,30 @@
+{ lib, buildPythonPackage, fetchPypi, pytest, flask, werkzeug, setuptools-scm, isPy27 }:
+
+buildPythonPackage rec {
+  pname = "pytest-flask";
+  version = "1.2.0";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "46fde652f77777bf02dc91205aec4ce20cdf2acbbbd66a918ab91f5c14693d3d";
+  };
+
+  doCheck = false;
+
+  buildInputs = [ pytest ];
+
+  propagatedBuildInputs = [
+    flask
+    werkzeug
+  ];
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  meta = with lib; {
+    homepage = "https://github.com/pytest-dev/pytest-flask/";
+    license = licenses.mit;
+    description = "A set of py.test fixtures to test Flask applications";
+    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..594a5efaa894
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-forked/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, setuptools-scm
+, py
+, pytest
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-forked";
+  version = "1.4.0";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-i2dYfI+Yy7rf3YBFOe1UVbbtA4AiA0hd0vU8FCLXRA4=";
+  };
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  buildInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    py
+  ];
+
+  checkInputs = [ pytestCheckHook ];
+
+  meta = {
+    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-freezegun/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-freezegun/default.nix
new file mode 100644
index 000000000000..3ba67867a1aa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-freezegun/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, freezegun
+, pytest
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-freezegun";
+  version = "0.4.2";
+
+  src = fetchFromGitHub {
+    owner = "ktosiek";
+    repo = "pytest-freezegun";
+    rev = version;
+    sha256 = "10c4pbh03b4s1q8cjd75lr0fvyf9id0zmdk29566qqsmaz28npas";
+  };
+
+  buildInputs = [ pytest ];
+
+  propagatedBuildInputs = [
+    freezegun
+  ];
+
+  checkInputs = [
+    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-helpers-namespace/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-helpers-namespace/default.nix
new file mode 100644
index 000000000000..f7d6ce312640
--- /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 ];
+
+  checkInputs = [ 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..78b2de292f1d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-html/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildPythonPackage, fetchPypi, pythonOlder
+, pytest, pytest-metadata, setuptools-scm }:
+
+buildPythonPackage rec {
+  pname = "pytest-html";
+  version = "3.1.1";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3ee1cf319c913d19fe53aeb0bc400e7b0bc2dbeb477553733db1dad12eb75ee3";
+  };
+
+  nativeBuildInputs = [ setuptools-scm ];
+  buildInputs = [ pytest ];
+  propagatedBuildInputs = [ pytest-metadata ];
+
+  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..c83724fa8036
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-httpbin/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, httpbin
+, pytest
+, pytestCheckHook
+, pythonOlder
+, requests
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-httpbin";
+  version = "1.0.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "kevin1024";
+    repo = "pytest-httpbin";
+    rev = "v${version}";
+    hash = "sha256-S4ThQx4H3UlKhunJo35esPClZiEn7gX/Qwo4kE1QMTI=";
+  };
+
+  buildInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    httpbin
+    six
+  ];
+
+  preCheck = ''
+    # Remove assertion that doesn't hold for Flask 2.1.0
+    substituteInPlace tests/test_server.py \
+      --replace "assert response.headers['Location'].startswith('https://')" ""
+  '';
+
+  checkInputs = [
+    pytestCheckHook
+    requests
+  ];
+
+  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..eb04881455d7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-httpserver/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest-cov
+, pytestCheckHook
+, requests
+, werkzeug
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-httpserver";
+  version = "1.0.4";
+
+  src = fetchPypi {
+    pname = "pytest_httpserver";
+    inherit version;
+    sha256 = "6de464ba5f74628d6182ebbdcb56783edf2c9b0caf598dc35c11f014f24a3f0d";
+  };
+
+  propagatedBuildInputs = [ werkzeug ];
+
+  checkInputs = [
+    pytest-cov
+    pytestCheckHook
+    requests
+  ];
+
+  pythonImportsCheck = [ "pytest_httpserver" ];
+
+  meta = with lib; {
+    description = "HTTP server for pytest to test HTTP clients";
+    homepage = "https://www.github.com/csernazs/pytest-httpserver";
+    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..6a66727b1ebb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-httpx/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, httpx
+, pytest
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-httpx";
+  version = "0.21.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "Colin-b";
+    repo = "pytest_httpx";
+    rev = "v${version}";
+    hash = "sha256-mUzmtZCguaab4fAE7VcUhv+NQVYiPpxxHpiVVlzwrIo=";
+  };
+
+  buildInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    httpx
+  ];
+
+  checkInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pytest_httpx"
+  ];
+
+  meta = with lib; {
+    description = "Send responses to httpx";
+    homepage = "https://github.com/Colin-b/pytest_httpx";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..f9942dd5bcd3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-instafail/default.nix
@@ -0,0 +1,24 @@
+{ buildPythonPackage
+, fetchPypi
+, lib
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-instafail";
+  version = "0.4.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "10lpr6mjcinabqynj6v85bvb1xmapnhqmg50nys1r6hg7zgky9qr";
+  };
+
+  checkInputs = [ pytestCheckHook ];
+  pythonImportsCheck = [ "pytest_instafail" ];
+  meta = {
+    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";
+    license = lib.licenses.bsd3;
+    maintainers = [ lib.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..234742f2e6d7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-isort/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, importlib-metadata
+, isort
+, poetry-core
+, pytest
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-isort";
+  version = "3.0.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "stephrdev";
+    repo = pname;
+    rev = version;
+    hash = "sha256-gbEO3HBDeZ+nUACzpeV6iVuCdNHS5956wFzIYkbam+M=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  buildInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    isort
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  patches = [
+    # Can be removed with the next release, https://github.com/stephrdev/pytest-isort/pull/44
+    (fetchpatch {
+      name = "switch-to-poetry-core.patch";
+      url = "https://github.com/stephrdev/pytest-isort/commit/f17ed2d294ae90e415d051e1c720982e3dd01bff.patch";
+      sha256 = "sha256-PiOs0c61BNx/tZN11DYblOd7tNzGthNnlkmYMTI9v18=";
+    })
+  ];
+
+  pythonImportsCheck = [
+    "pytest_isort"
+  ];
+
+  meta = with lib; {
+    description = "Pytest plugin to perform isort checks (import ordering)";
+    homepage = "https://github.com/moccu/pytest-isort/";
+    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..95a0bcb325f1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-json-report/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytest
+, pytest-metadata
+, pytest-xdist
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-json-report";
+  version = "1.5.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "numirias";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-hMB/atDuo7CjwhHFUOxVfgJ7Qp4AA9J428iv7hyQFcs=";
+  };
+
+  buildInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    pytest-metadata
+  ];
+
+  checkInputs = [
+    pytest-xdist
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # pytest-flaky is not available at the moment
+    "test_bug_31"
+  ];
+
+  pythonImportsCheck = [
+    "pytest_jsonreport"
+  ];
+
+  meta = with lib; {
+    description = "Pytest plugin to report test results as JSON";
+    homepage = "https://github.com/numirias/pytest-json-report";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..2b9c57b99d8a
--- /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";
+  };
+
+  checkInputs = [
+    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..b64f3365dd6f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-localserver/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, aiosmtpd
+, buildPythonPackage
+, fetchPypi
+, werkzeug
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-localserver";
+  version = "0.6.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-3cR5q6lqfaDnocx9OjA+UFgtbVBYA+j2e4JyGPn+D2U=";
+  };
+
+  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";
+    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..c626a1cfac9e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-logdog/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytest
+, pytestCheckHook
+, pythonOlder
+, 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
+  ];
+
+
+  checkInputs = [
+    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-metadata/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-metadata/default.nix
new file mode 100644
index 000000000000..321aacb5c704
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-metadata/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+, pythonOlder
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-metadata";
+  version = "2.0.2";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-/NL0FvFb4pWUNSezyLoWpErlpxQZOckMPcXOnRZ88qU=";
+  };
+
+  nativeBuildInputs = [ setuptools-scm ];
+  buildInputs = [ pytest ];
+
+  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..ed25a10d3a4e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-mock/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, pytest
+, pytest-asyncio
+, pytestCheckHook
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-mock";
+  version = "3.8.2";
+
+  disabled = pythonOlder "3.7";
+
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-d/A/RVQ5JVhwApXgWu0LEJaiDUpgpPPdzeWLDDHI/KI=";
+  };
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  buildInputs = [
+    pytest
+  ];
+
+  checkInputs = [
+    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-mockservers/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-mockservers/default.nix
new file mode 100644
index 000000000000..4022befcb14d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-mockservers/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, 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;
+    sha256 = "0xql0fnw7m2zn103601gqbpyd761kzvgjj2iz9hjsv56nr4z1g9i";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "poetry.masonry.api" "poetry.core.masonry.api"
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  buildInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    pytest-asyncio
+  ];
+
+  checkInputs = [
+    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..e5bf251def6c
--- /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;
+    sha256 = "sha256-LVcWgRJOj/X04rnA0EfTfQSZ1rbY8vSaG1DN2ZMQRGk=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  buildInputs = [
+    pytest
+  ];
+
+  SETUPTOOLS_SCM_PRETEND_VERSION=version;
+
+  propagatedBuildInputs = [
+    jinja2
+    matplotlib
+    nose
+    pillow
+  ];
+
+  checkInputs = [
+    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 = [ maintainers.costrouc ];
+  };
+}
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..806c12c0e4ff
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-mypy-plugins/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, chevron
+, decorator
+, fetchFromGitHub
+, mypy
+, pytest
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, regex
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-mypy-plugins";
+  version = "1.9.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "typeddjango";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-4hG3atahb+dH2dRGAxguJW3vvEf0TUGUJ3G5ymrf3Vg=";
+  };
+
+  buildInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    chevron
+    pyyaml
+    mypy
+    decorator
+    regex
+  ];
+
+  checkInputs = [
+    mypy
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    export PATH="$PATH:$out/bin";
+  '';
+
+  pythonImportsCheck = [
+    "pytest_mypy_plugins"
+  ];
+
+  meta = with lib; {
+    description = "Pytest plugin for testing mypy types, stubs, and plugins";
+    homepage = "https://github.com/TypedDjango/pytest-mypy-plugins";
+    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..bec0ee59d0c5
--- /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.9.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-n/o79AXBLFxr6ekuIr67arLJG5wy9FsPDJOvRzJpq1w=";
+  };
+
+  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 = [ maintainers.costrouc ];
+  };
+}
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..573dbf275117
--- /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
+  ];
+
+  checkInputs = [ pytestCheckHook ];
+
+  meta = with lib; {
+    description = "Pytest plugin for detecting inadvertent open file handles";
+    homepage = "https://astropy.org";
+    license = licenses.bsd3;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..e40e0671bc03
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-order/default.nix
@@ -0,0 +1,35 @@
+{ buildPythonPackage
+, fetchPypi
+, lib
+, pytest
+, pytest-xdist
+, pytest-dependency
+, pytest-mock
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-order";
+  version = "1.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-Xda5KfvX6qbQ7gdYb2XGI7q7Cv5ytIQ8XxUFXWs7Gx8=";
+  };
+
+  buildInputs = [ pytest ];
+
+  checkInputs = [
+    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-ordering/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-ordering/default.nix
new file mode 100644
index 000000000000..c5e8a786b5ef
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-ordering/default.nix
@@ -0,0 +1,32 @@
+{ lib, fetchFromGitHub, buildPythonPackage
+, pytest }:
+
+buildPythonPackage rec {
+  pname = "pytest-ordering";
+  version = "unstable-2019-06-19";
+
+  # Pypi lacks tests/
+  # Resolves PytestUnknownMarkWarning from pytest
+  src = fetchFromGitHub {
+    owner = "ftobia";
+    repo = pname;
+    rev = "492697ee26633cc31d329c1ceaa468375ee8ee9c";
+    sha256 = "1xim0kj5g37p1skgvp8gdylpx949krmx60w3pw6j1m1h7sakmddn";
+  };
+
+  checkInputs = [
+    pytest
+  ];
+
+  checkPhase = ''
+    pytest tests
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/ftobia/pytest-ordering";
+    description = "Pytest plugin to run your tests in a specific order";
+    license = licenses.mit;
+    broken = true;  # See https://github.com/NixOS/nixpkgs/pull/122264
+    maintainers = with maintainers; [ eadwu ];
+  };
+}
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..c2ed3da53640
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-param-files/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, flit-core
+, pytest
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-param-files";
+  version = "0.3.4";
+
+  src = fetchFromGitHub {
+    owner = "chrisjsewell";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-Q7wWoggJN2w2a2umQHx5TsVcugqpovBEtOKruNMZQ8A=";
+  };
+
+  format = "flit";
+
+  nativeBuildInputs = [ flit-core ];
+
+  buildInputs = [
+    pytest
+  ];
+
+  pythonImportsCheck = [ "pytest_param_files" ];
+
+  checkInputs = [
+    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-pylint/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-pylint/default.nix
new file mode 100644
index 000000000000..e03e0fbe626c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-pylint/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, pytest
+, pylint
+, six
+, pytest-runner
+, toml
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-pylint";
+  version = "0.18.0";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "790c7a8019fab08e59bd3812db1657a01995a975af8b1c6ce95b9aa39d61da27";
+  };
+
+  nativeBuildInputs = [ pytest-runner ];
+
+  buildInputs = [ pytest ];
+
+  propagatedBuildInputs = [
+    pylint
+    six
+    toml
+  ];
+
+  # tests not included with release
+  doCheck = false;
+
+  meta = with lib; {
+    description = "pytest plugin to check source code with pylint";
+    homepage = "https://github.com/carsongee/pytest-pylint";
+    license = licenses.mit;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..51e834fe9628
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-qt/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools-scm
+, pytest
+, pyqt5
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-qt";
+  version = "4.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-An89P13QSvBTDYRs9Q+4WPcZ9+h8LkocaGq9Tg9yFyo=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  buildInputs = [
+    pytest
+  ];
+
+  checkInputs = [
+    pyqt5
+  ];
+
+  # 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; [ costrouc ];
+  };
+}
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..99d65ec28669
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-quickcheck/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+, pytest-flakes
+, tox
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-quickcheck";
+  version = "0.8.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3ef9bde7ba1fe6470c5b61631440186d1254e276c67a527242d91451ab7994e5";
+  };
+
+  buildInputs = [ pytest ];
+
+  propagatedBuildInputs = [ pytest-flakes tox ];
+
+  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 ];
+    # Pytest support > 6.0 missing
+    # https://github.com/t2y/pytest-quickcheck/issues/17
+    broken = true;
+  };
+}
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..7891437909ed
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-raises/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-raises";
+  version = "0.11";
+
+  src = fetchFromGitHub {
+    owner = "Lemmons";
+    repo = pname;
+    rev = version;
+    sha256 = "0gbb4kml2qv7flp66i73mgb4qihdaybb6c96b5dw3mhydhymcsy2";
+  };
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "pytest_raises" ];
+
+  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..1dc250da2ac7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-raisin/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, flit-core
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-raisin";
+  version = "0.4";
+  format = "flit";
+
+  src = fetchFromGitHub {
+    owner = "wimglenn";
+    repo = "pytest-raisin";
+    rev = "v${version}";
+    sha256 = "sha256-BI0SWy671DYDTPH4iO811ku6SzpH4ho7eQFUA8PmxW8=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  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..d95af8651f34
--- /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.0.4";
+  pname = "pytest-random-order";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "6b2159342a4c8c10855bc4fc6d65ee890fc614cb2b4ff688979b008a82a0ff52";
+  };
+
+  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..8bb8c6d06374
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-randomly/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, factory_boy
+, faker
+, fetchFromGitHub
+, importlib-metadata
+, numpy
+, pytest-xdist
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-randomly";
+  version = "3.12.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    repo = pname;
+    owner = "pytest-dev";
+    rev = version;
+    hash = "sha256-n/Xp/HghqcQUreez+QbR3Mi5hE1U4zoOJCdFqD+pVBk=";
+  };
+
+  propagatedBuildInputs = lib.optionals (pythonOlder "3.10") [
+    importlib-metadata
+  ];
+
+  checkInputs = [
+    factory_boy
+    faker
+    numpy
+    pytest-xdist
+    pytestCheckHook
+  ];
+
+  # needs special invocation, copied from tox.ini
+  pytestFlagsArray = [
+    "-p"
+    "no:randomly"
+  ];
+
+  pythonImportsCheck = [
+    "pytest_randomly"
+  ];
+
+  meta = with lib; {
+    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-regressions/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-regressions/default.nix
new file mode 100644
index 000000000000..99099d3ac924
--- /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.3.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-s+xM2zTo9idgYnXYuDTGXmDhowc+MmuzcnpCcnPQIh0=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  buildInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    pandas
+    pillow
+    pytest-datadir
+    pyyaml
+  ];
+
+
+  checkInputs = [
+    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..13838eb326c9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-relaxed/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+, six
+, decorator
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  version = "1.1.5";
+  pname = "pytest-relaxed";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "e39a7e5b14e14dfff0de0ad720dfffa740c128d599ab14cfac13f4deb34164a6";
+  };
+
+  # newer decorator versions are incompatible and cause the test suite to fail
+  # but only a few utility functions are used from this package which means it has no actual impact on test execution in paramiko and Fabric
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "decorator>=4,<5" "decorator>=4" \
+      --replace "pytest>=3,<5" "pytest>=3"
+  '';
+
+  buildInputs = [ pytest ];
+
+  propagatedBuildInputs = [ six decorator ];
+
+  checkInputs = [ pytestCheckHook ];
+
+  # lots of assertion errors mainly around decorator
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://pytest-relaxed.readthedocs.io/";
+    description = "Relaxed test discovery/organization for pytest";
+    license = licenses.bsd0;
+    maintainers = [ maintainers.costrouc ];
+    # see https://github.com/bitprophet/pytest-relaxed/issues/12
+    broken = true;
+  };
+}
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..fc9b5e6f9c1b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-remotedata/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+, pytestCheckHook
+, pythonOlder
+, setuptools-scm
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-remotedata";
+  version = "0.3.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "66920bf1c62928b079d0e611379111a0d49f10a9509ced54c8269514ccce6ee3";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  buildInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  checkInputs = [
+    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";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ costrouc ];
+  };
+}
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..1b3721282159
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-repeat/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools-scm
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-repeat";
+  version = "0.9.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5cd3289745ab3156d43eb9c8e7f7d00a926f3ae5c9cf425bec649b2fe15bad5b";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  checkInputs = [
+    pytest
+  ];
+
+  checkPhase = ''
+    pytest
+  '';
+
+  meta = with lib; {
+    description = "Pytest plugin for repeating tests";
+    homepage = "https://github.com/pytest-dev/pytest-repeat";
+    license = licenses.mpl20;
+    maintainers = with maintainers; [ costrouc ];
+  };
+}
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..9b16760b23b8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-rerunfailures/default.nix
@@ -0,0 +1,28 @@
+{ lib, buildPythonPackage, pythonOlder, fetchPypi, pytest, mock }:
+
+buildPythonPackage rec {
+  pname = "pytest-rerunfailures";
+  version = "10.2";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9e1e1bad51e07642c5bbab809fc1d4ec8eebcb7de86f90f1a26e6ef9de446697";
+  };
+
+  buildInputs = [ pytest ];
+
+  checkInputs = [ mock pytest ];
+
+  checkPhase = ''
+    py.test test_pytest_rerunfailures.py
+  '';
+
+  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..7476801794c3
--- /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
+  ];
+
+  checkInputs = [
+    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-runner/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-runner/default.nix
new file mode 100644
index 000000000000..baca23d77491
--- /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;
+    sha256 = "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-sanic/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-sanic/default.nix
new file mode 100644
index 000000000000..2bce8eaecb71
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-sanic/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, aiohttp
+, async_generator
+, buildPythonPackage
+, fetchFromGitHub
+, httpx
+, pytest
+, pytestCheckHook
+, sanic
+, websockets
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-sanic";
+  version = "1.9.1";
+
+  src = fetchFromGitHub {
+    owner = "yunstanford";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-82Xq/jyxTXyZVHqn7G+S9K++InDdORCO9oFqgaIgY7s=";
+  };
+
+  buildInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    async_generator
+    httpx
+    pytest
+    websockets
+  ];
+
+  checkInputs = [
+    sanic
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pytest_sanic"
+  ];
+
+  meta = with lib; {
+    description = "A pytest plugin for Sanic";
+    homepage = "https://github.com/yunstanford/pytest-sanic/";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ costrouc ];
+    broken = true; # 2021-11-04
+  };
+}
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..e3b2277fa99b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-shutil/default.nix
@@ -0,0 +1,33 @@
+{ lib, isPyPy, buildPythonPackage, fetchPypi
+, pytest, cmdline, pytest-cov, coverage, setuptools-git, mock, path, execnet
+, contextlib2, termcolor, six }:
+
+buildPythonPackage rec {
+  pname = "pytest-shutil";
+  version = "1.7.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0q8j0ayzmnvlraml6i977ybdq4xi096djhf30n2m1rvnvrhm45nq";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "path.py" "path"
+  '';
+
+  buildInputs = [ pytest ];
+  checkInputs = [ cmdline pytest ];
+  propagatedBuildInputs = [ pytest-cov coverage setuptools-git mock path execnet contextlib2 termcolor six ];
+
+  checkPhase = ''
+    py.test ${lib.optionalString isPyPy "-k'not (test_run or 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..0d24f8fa202e
--- /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}";
+    sha256 = "sha256-0PZu9wL29iEppLxxbl4D0E4WfOHe61KUUld003cRBRU=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  buildInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    packaging
+  ];
+
+  checkInputs = [
+    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; [ SuperSandro2000 ];
+  };
+}
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..bcd4abb4d410
--- /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.5.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "miketheman";
+    repo = pname;
+    rev = version;
+    hash = "sha256-QKHnuq2pqWMVUhF9nnhJggEK6SSyp6zBEfQX9tGND2E=";
+  };
+
+  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; [ costrouc ];
+  };
+}
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..cc890096f796
--- /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.4.1";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "aklajnert";
+    repo = "pytest-subprocess";
+    rev = version;
+    hash = "sha256-xNkOXBCQ4AH/JVmxFzI3VSouA6jkCbUom7AdckfjGiE=";
+  };
+
+  buildInputs = [
+    pytest
+  ];
+
+  checkInputs = [
+    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..6981fcb454f2
--- /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;
+    sha256 = "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..4b88991bb741
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-subtests/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-subtests";
+  version = "0.8.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-Rus3YCLpJpUIFszCNQLeMnetzBOWZS3bMyjOAokFLE0=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  checkInputs = [
+    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..9b59eb2e55b8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-sugar/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, termcolor
+, pytest
+, packaging
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-sugar";
+  version = "0.9.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-7qeLbxW2NSd9PZAoDNOG2P7qHKsPm+dZR6Ym6LArR30=";
+  };
+
+  buildInputs = [ pytest ];
+
+  propagatedBuildInputs = [
+    termcolor
+    packaging
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "A plugin that changes the default look and feel of py.test";
+    homepage = "https://github.com/Frozenball/pytest-sugar";
+    license = licenses.bsd3;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..51e9972cbad3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-test-utils/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, 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=";
+  };
+
+  buildInputs = [
+    pytest
+  ];
+
+  checkInputs = [
+    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-testmon/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-testmon/default.nix
new file mode 100644
index 000000000000..9652e0289464
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-testmon/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, coverage
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-testmon";
+  version = "1.3.4";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-jr+uKjtm5nFYHrZpG63VNK/wO93TQJh1x4SoTxJtlw0=";
+  };
+
+  propagatedBuildInputs = [ pytest coverage ];
+
+  # The project does not include tests since version 1.3.0
+  doCheck = false;
+  pythonImportsCheck = [ "testmon" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/tarpas/pytest-testmon/";
+    description = "This is a py.test plug-in which automatically selects and re-executes only tests affected by recent changes";
+    license = licenses.mit;
+    maintainers = [ 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..e380068c59d3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-timeout/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+, pytestCheckHook
+, pexpect
+, pytest-cov
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-timeout";
+  version = "2.1.0";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-wHygdATGEvirviIpSyPDaOLlEEtSHBeQGVVh834aw9k=";
+  };
+
+  buildInputs = [
+    pytest
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    pexpect
+    pytest-cov
+  ];
+
+  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 costrouc ];
+  };
+}
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..bd1ce2a597b1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-tornado/default.nix
@@ -0,0 +1,30 @@
+{ 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;
+    maintainers = with maintainers; [ ixxie ];
+  };
+}
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..f037ab86d5f6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-tornasync/default.nix
@@ -0,0 +1,39 @@
+{ 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
+  ];
+
+  checkInputs = [
+    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..e42ed5c68386
--- /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.7.0";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "python-trio";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0bhh2nknhp14jzsx4zzpqm4qnfaihyi65cjf6kf6qgdhc0ax6nf4";
+  };
+
+  buildInputs = [ pytest ];
+
+  propagatedBuildInputs = [
+    trio
+    async_generator
+    outcome
+  ];
+
+  checkInputs = [
+    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..789af6769415
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-twisted/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, greenlet
+, pytest
+, decorator
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-twisted";
+  version = "1.13.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "cee2320becc5625050ab221b8f38533e636651a24644612f4726891fdf1f1847";
+  };
+
+  buildInputs = [ pytest ];
+
+  propagatedBuildInputs = [ greenlet decorator ];
+
+  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..5dc0916991c9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-unordered/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-unordered";
+  version = "0.4.1";
+
+  src = fetchFromGitHub {
+    owner = "utapyngo";
+    repo = pname;
+    rev = "972012a984b1e9fb3e98f9e8fe9e2ada16ad8110";
+    hash = "sha256-mCcR6WZb2+V5n0PwgsjvnChWnANkIyQ0YtqwTKBYtaA=";
+  };
+
+  checkInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "pytest_unordered" ];
+
+  meta = with lib; {
+    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..c4a66cc48e5d
--- /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";
+  };
+
+  checkInputs = [ 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-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..b17b6f2f763a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-xdist/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, setuptools-scm
+, pytestCheckHook
+, filelock
+, execnet
+, pytest
+, pytest-forked
+, psutil
+, pexpect
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-xdist";
+  version = "2.5.0";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-RYDeyj/wTdsqxT66Oddstd1e3qwFDLb7x2iw3XErTt8=";
+  };
+
+  nativeBuildInputs = [ setuptools-scm ];
+  buildInputs = [
+    pytest
+  ];
+  checkInputs = [ pytestCheckHook filelock pexpect ];
+  propagatedBuildInputs = [ execnet pytest-forked psutil ];
+
+  pytestFlagsArray = [
+    # pytest can already use xdist at this point
+    "--numprocesses=$NIX_BUILD_CORES"
+    "--forked"
+  ];
+
+  # 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; {
+    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..5523a7f360f5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-xdist/setup-hook.sh
@@ -0,0 +1,18 @@
+pytestXdistHook() {
+    pytestFlagsArray+=(
+        "--numprocesses=$NIX_BUILD_CORES"
+        "--forked"
+    )
+}
+
+# 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..1b45c06969d3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-xprocess/default.nix
@@ -0,0 +1,37 @@
+{ lib, buildPythonPackage, fetchPypi
+, psutil
+, pytest
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-xprocess";
+  version = "0.19.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-GCDFSdZx7bLInCX/HjjHDs2g/v4oDxPEWiyMbWbXtQ4=";
+  };
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  buildInputs = [ pytest ];
+
+  propagatedBuildInputs = [ psutil ];
+
+  # Remove test QoL package from install_requires
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "'pytest-cache', " ""
+  '';
+
+  # 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..c3dabe7f6e30
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-xvfb/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+, virtual-display
+, isPy27
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-xvfb";
+  version = "2.0.0";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1kyq5rg27dsnj7dc6x9y7r8vwf8rc88y2ppnnw6r96alw0nn9fn4";
+  };
+
+  buildInputs = [ pytest ];
+
+  propagatedBuildInputs = [
+    virtual-display
+  ];
+
+  meta = with lib; {
+    description = "A pytest plugin to run Xvfb for tests";
+    homepage = "https://github.com/The-Compiler/pytest-xvfb";
+    license = licenses.mit;
+    maintainers = with maintainers; [ costrouc ];
+  };
+}
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..1523326de0bf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest/default.nix
@@ -0,0 +1,89 @@
+{ lib
+, buildPythonPackage
+, callPackage
+, pythonOlder
+, fetchPypi
+, isPyPy
+, writeText
+
+# build
+, setuptools-scm
+
+# propagates
+, attrs
+, iniconfig
+, packaging
+, pluggy
+, py
+, tomli
+}:
+
+buildPythonPackage rec {
+  pname = "pytest";
+  version = "7.1.2";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-oGoEJUU4ZKJwvEXnH3gzMKdCje+0Iw+15qcx/eBuzUU=";
+  };
+
+  outputs = [
+    "out"
+    "testout"
+  ];
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    attrs
+    iniconfig
+    packaging
+    pluggy
+    py
+    tomli
+  ];
+
+  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.1.2/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..76581b1f3d77
--- /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;
+
+  checkInputs = [
+    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-awair/default.nix b/nixpkgs/pkgs/development/python-modules/python-awair/default.nix
new file mode 100644
index 000000000000..913d91c0901c
--- /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.3";
+  format = "pyproject";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "ahayworth";
+    repo = "python_awair";
+    rev = version;
+    sha256 = "sha256-Roqmwamv/2/O87jfyymCGgRlw/woUhCNIuM9MLT3+Cw=";
+  };
+
+  nativeBuildInputs = [ poetry-core ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    voluptuous
+  ];
+
+  checkInputs = [
+    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..5d64f933b691
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-barcode/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, setuptools-scm
+, pillow
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "python-barcode";
+  version = "0.14.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-JBs0qlxctqmImIL5QJsBgpA6LF0ZtCGL42Cc271f/fk=";
+  };
+
+  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" ""
+  '';
+
+  checkInputs = [
+    pytestCheckHook
+  ] ++ passthru.optional-dependencies.images;
+
+  pythonImportsCheck = [ "barcode" ];
+
+  meta = with lib; {
+    description = "Create standard barcodes with Python";
+    homepage = "https://github.com/WhyNotHugo/python-barcode";
+    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..96601c6750ac
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-benedict/default.nix
@@ -0,0 +1,81 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, ftfy
+, mailchecker
+, orjson
+, phonenumbers
+, pytestCheckHook
+, python-dateutil
+, python-fsutil
+, pythonOlder
+, python-slugify
+, pyyaml
+, requests
+, six
+, toml
+, xmltodict
+}:
+
+buildPythonPackage rec {
+  pname = "python-benedict";
+  version = "0.25.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "fabiocaccamo";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-WSsT+p23VctVt9A+WFKNHcgUHFijfT775eMF3RzaXDA=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "mailchecker >= 4.1.0, < 5.0.0" "mailchecker >= 4.1.0"
+  '';
+
+  propagatedBuildInputs = [
+    mailchecker
+    phonenumbers
+    python-dateutil
+    python-fsutil
+    python-slugify
+    pyyaml
+    ftfy
+    orjson
+    requests
+    six
+    toml
+    xmltodict
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  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_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";
+    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..f5cd9b29f520
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-binance/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, dateparser
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, requests
+, requests-mock
+, six
+, ujson
+, websockets
+}:
+
+buildPythonPackage rec {
+  pname = "python-binance";
+  version = "1.0.16";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "sammchardy";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-2v3qeykjQR/CUOC6F0Xomm49Q+wrYJS8vmL3+u6ew0M=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    dateparser
+    requests
+    six
+    ujson
+    websockets
+  ];
+
+  checkInputs = [
+    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..01805c6a2d22
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-box/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, msgpack
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, ruamel-yaml
+, toml
+}:
+
+buildPythonPackage rec {
+  pname = "python-box";
+  version = "6.0.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "cdgriffith";
+    repo = "Box";
+    rev = version;
+    hash = "sha256-IE2qyRzvrOTymwga+hCwE785sAVTqQtcN1DL/uADpbQ=";
+  };
+
+  propagatedBuildInputs = [
+    msgpack
+    pyyaml
+    ruamel-yaml
+    toml
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "box"
+  ];
+
+  meta = with lib; {
+    description = "Python dictionaries with advanced dot notation access";
+    homepage = "https://github.com/cdgriffith/Box";
+    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..4b33fbfec831
--- /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.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-oiV6si2kRyRJ3cdSVRNBIm2iv8FrZ9mGnN6vRbqGv6o=";
+  };
+
+  propagatedBuildInputs = [
+    simplejson
+    keystoneauth1
+    oslo-i18n
+    oslo-utils
+    pbr
+    prettytable
+    requests
+    stevedore
+  ];
+
+  checkInputs = [
+    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..715a982d9fe2
--- /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;
+    sha256 = "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..e6fcc4f8ab7a
--- /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";
+  };
+
+  checkInputs = [ 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-crfsuite/default.nix b/nixpkgs/pkgs/development/python-modules/python-crfsuite/default.nix
new file mode 100644
index 000000000000..f4f0f107f539
--- /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.8";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-DgPPbro2KHF8zwbfoPSiuoYohgrbF0y/0lCnpGkoZaE=";
+  };
+
+  preCheck = ''
+    # make sure import the built version, not the source one
+    rm -r pycrfsuite
+  '';
+
+  checkInputs = [
+    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..9de0801d5375
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-crontab/default.nix
@@ -0,0 +1,31 @@
+{ lib, buildPythonPackage, fetchPypi, python-dateutil, pytestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "python-crontab";
+  version = "2.6.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1e35ed7a3cdc3100545b43e196d34754e6551e7f95e4caebbe0e1c0ca41c2f1b";
+  };
+
+  checkInputs = [ pytestCheckHook ];
+  disabledTests = [
+    "test_07_non_posix_shell"
+    # doctest that assumes /tmp is writeable, awkward to patch
+    "test_03_usage"
+  ];
+
+  propagatedBuildInputs = [ python-dateutil ];
+
+  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://pypi.org/project/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..e6f22d37b55d
--- /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 = "source/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..6ef8a757093f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-ctags3/default.nix
@@ -0,0 +1,17 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "python-ctags3";
+  version = "1.5.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a2cb0b35f0d67bab47045d803dce8291a1500af11832b154f69b3785f2130daa";
+  };
+
+  meta = with lib; {
+    description = "Ctags indexing python bindings";
+    homepage = "https://github.com/jonashaag/python-ctags3";
+    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..cc12b14aa153
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-daemon/default.nix
@@ -0,0 +1,90 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, docutils
+, lockfile
+, pytestCheckHook
+, testscenarios
+, testtools
+, twine
+, python
+, pythonOlder
+, fetchpatch
+}:
+
+buildPythonPackage rec {
+  pname = "python-daemon";
+  version = "2.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "bda993f1623b1197699716d68d983bb580043cf2b8a66a01274d9b8297b0aeaf";
+  };
+
+  nativeBuildInputs = [
+    twine
+  ];
+
+  propagatedBuildInputs = [
+    docutils
+    lockfile
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    testscenarios
+    testtools
+  ];
+
+  patches = [
+    # Should be fixed in the next release
+    (fetchpatch {
+      url = "https://src.fedoraproject.org/rpms/python-daemon/raw/rawhide/f/python-daemon-safe_hasattr.patch";
+      sha256 = "sha256-p5epAlM/sdel01oZkSI1vahUZYX8r90WCJuvBnfMaus=";
+    })
+    (fetchpatch {
+      url = "https://src.fedoraproject.org/rpms/python-daemon/raw/rawhide/f/tests-remove-duplicate-mocking.patch";
+      sha256 = "sha256-5b/dFR3Z8xaPw8AZU95apDZd4ZfmMQhAmavWkVaJog8=";
+    })
+  ];
+
+  disabledTestPaths = [
+    # requires removed distutils.command
+    "test_version.py"
+  ];
+
+  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"
+    "daemon.runner"
+  ];
+
+  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..4b0366ae4da5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-datemath/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, arrow
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+, unittest2
+}:
+
+buildPythonPackage rec {
+  pname = "python-datemath";
+  version = "1.5.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "nickmaccarthy";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-WVWGhyBguE1+KEMQu0N5QxO7IC4rPEJ/2L3VWUCQNi4=";
+  };
+
+  propagatedBuildInputs = [
+    arrow
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    unittest2
+  ];
+
+  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..cc8181e7325c
--- /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.28.4";
+
+  src = fetchFromGitHub {
+    owner = "martinpitt";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-gsGg9zHVyDTCVZmFUI8qqXDt0ui+o3hPwjRlsYUmShg=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    dbus-python
+  ];
+
+  checkInputs = [
+    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-didl-lite/default.nix b/nixpkgs/pkgs/development/python-modules/python-didl-lite/default.nix
new file mode 100644
index 000000000000..f58da984f8c9
--- /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;
+    sha256 = "sha256-laKmWGDEzlBVJCUSKxekjPEXVlAz4MIzM7dNJfta/ek=";
+  };
+
+  propagatedBuildInputs = [
+    defusedxml
+  ];
+
+  checkInputs = [
+    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-docx/default.nix b/nixpkgs/pkgs/development/python-modules/python-docx/default.nix
new file mode 100644
index 000000000000..fd22adc37744
--- /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";
+  };
+
+  checkInputs = [ 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..a805c3e6c623
--- /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 = "0.20.0";
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-t+OwSllpPELDb5qxzCrMRvpd+MeOF4/DOo1M0FyNSY8=";
+  };
+
+  propagatedBuildInputs = [ click ];
+
+  checkInputs = [
+    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..d1769806e283
--- /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.15";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "91929b0dda6acc2af6661d0fb539eb6375323d7529d3d64b67915efb1dc1a6ca";
+  };
+
+  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..beca9b848944
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-efl/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, fetchurl
+, buildPythonPackage
+, pkg-config
+, python
+, dbus-python
+, packaging
+, enlightenment
+}:
+
+# Should be bumped along with EFL!
+
+buildPythonPackage rec {
+  pname = "python-efl";
+  version = "1.26.0";
+
+  src = fetchurl {
+    url = "http://download.enlightenment.org/rel/bindings/python/${pname}-${version}.tar.xz";
+    sha256 = "0dj6f24n33hkpy0bkdclnzpxhvs8vpaxqaf7hkw0di19pjwrq25h";
+  };
+
+  nativeBuildInputs = [ pkg-config ];
+
+  buildInputs = [ enlightenment.efl ];
+
+  propagatedBuildInputs = [ dbus-python packaging ];
+
+  preConfigure = ''
+    NIX_CFLAGS_COMPILE="$(pkg-config --cflags efl evas) $NIX_CFLAGS_COMPILE"
+  '';
+
+  preBuild = ''
+    ${python.interpreter} setup.py build_ext
+  '';
+
+  installPhase = ''
+    ${python.interpreter} setup.py install --prefix=$out --single-version-externally-managed
+  '';
+
+  doCheck = false;
+
+  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..c9b344e5acf9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-engineio/default.nix
@@ -0,0 +1,72 @@
+{ lib
+, stdenv
+, aiohttp
+, buildPythonPackage
+, eventlet
+, fetchFromGitHub
+, iana-etc
+, libredirect
+, mock
+, pytestCheckHook
+, pythonOlder
+, requests
+, tornado
+, websocket-client
+}:
+
+buildPythonPackage rec {
+  pname = "python-engineio";
+  version = "4.3.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "miguelgrinberg";
+    repo = "python-engineio";
+    rev = "v${version}";
+    sha256 = "sha256-fymO9WqkYaRsHKCJHQJpySHqZor2t8BfVrfYUfYoJno=";
+  };
+
+  checkInputs = [
+    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/";
+    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-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-flirt/Cargo.lock b/nixpkgs/pkgs/development/python-modules/python-flirt/Cargo.lock
new file mode 100644
index 000000000000..d6ad3d6aef61
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-flirt/Cargo.lock
@@ -0,0 +1,1465 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 3
+
+[[package]]
+name = "addr2line"
+version = "0.17.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b9ecd88a8c8378ca913a680cd98f0f13ac67383d35993f86c90a70e3f137816b"
+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.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca972c2ea5f742bfce5687b9aef75506a764f61d37f8f649047846a9686ddb66"
+dependencies = [
+ "memchr 0.1.11",
+]
+
+[[package]]
+name = "aho-corasick"
+version = "0.7.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f"
+dependencies = [
+ "memchr 2.5.0",
+]
+
+[[package]]
+name = "ansi_term"
+version = "0.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2"
+dependencies = [
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "anyhow"
+version = "1.0.58"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bb07d2053ccdbe10e2af2995a2f116c1330396493dc1269f6a91d0ae82e19704"
+
+[[package]]
+name = "atty"
+version = "0.2.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8"
+dependencies = [
+ "hermit-abi",
+ "libc",
+ "winapi 0.3.9",
+]
+
+[[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.66"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cab84319d616cfb654d03394f38ab7e6f0919e181b1b57e1fd15e7fb4077d9a7"
+dependencies = [
+ "addr2line",
+ "cc",
+ "cfg-if",
+ "libc",
+ "miniz_oxide",
+ "object",
+ "rustc-demangle",
+]
+
+[[package]]
+name = "better-panic"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3d12a680cc74d8c4a44ee08be4a00dedf671b089c2440b2e3fdaa776cd468476"
+dependencies = [
+ "backtrace",
+ "console",
+]
+
+[[package]]
+name = "bitflags"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1370e9fc2a6ae53aea8b7a5110edbd08836ed87c88736dfabccade1c2b44bff4"
+
+[[package]]
+name = "bitflags"
+version = "1.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
+
+[[package]]
+name = "bitvec"
+version = "0.22.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5237f00a8c86130a0cc317830e558b966dd7850d48a953d998c813f01a41b527"
+dependencies = [
+ "funty",
+ "radium",
+ "tap",
+ "wyz",
+]
+
+[[package]]
+name = "bstr"
+version = "0.2.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ba3569f383e8f1598449f1a423e72e99569137b47740b1da11ef19af3d5c3223"
+dependencies = [
+ "lazy_static",
+ "memchr 2.5.0",
+ "regex-automata",
+ "serde",
+]
+
+[[package]]
+name = "build-helper"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bdce191bf3fa4995ce948c8c83b4640a1745457a149e73c6db75b4ffe36aad5f"
+dependencies = [
+ "semver",
+]
+
+[[package]]
+name = "bumpalo"
+version = "3.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "37ccbd214614c6783386c1af30caf03192f17891059cecc394b4fb119e363de3"
+
+[[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.73"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11"
+
+[[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.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73"
+dependencies = [
+ "libc",
+ "num-integer",
+ "num-traits",
+ "time",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "clap"
+version = "2.34.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c"
+dependencies = [
+ "ansi_term",
+ "atty",
+ "bitflags 1.3.2",
+ "strsim",
+ "term_size",
+ "textwrap",
+ "unicode-width",
+ "vec_map",
+]
+
+[[package]]
+name = "clicolors-control"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "90082ee5dcdd64dc4e9e0d37fbf3ee325419e39c0092191e0393df65518f741e"
+dependencies = [
+ "atty",
+ "lazy_static",
+ "libc",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "cmake"
+version = "0.1.48"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e8ad8cef104ac57b68b89df3208164d228503abbdce70f6880ffa3d970e7443a"
+dependencies = [
+ "cc",
+]
+
+[[package]]
+name = "console"
+version = "0.9.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "45e0f3986890b3acbc782009e2629dfe2baa430ac091519ce3be26164a2ae6c0"
+dependencies = [
+ "clicolors-control",
+ "encode_unicode",
+ "lazy_static",
+ "libc",
+ "regex 1.6.0",
+ "termios",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "criterion"
+version = "0.3.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b01d6de93b2b6c65e17c634a26653a29d107b3c98c607c765bf38d041531cd8f"
+dependencies = [
+ "atty",
+ "cast",
+ "clap",
+ "criterion-plot",
+ "csv",
+ "itertools",
+ "lazy_static",
+ "num-traits",
+ "oorandom",
+ "plotters",
+ "rayon",
+ "regex 1.6.0",
+ "serde",
+ "serde_cbor",
+ "serde_derive",
+ "serde_json",
+ "tinytemplate",
+ "walkdir",
+]
+
+[[package]]
+name = "criterion-plot"
+version = "0.4.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2673cc8207403546f45f5fd319a974b1e6983ad1a3ee7e6041650013be041876"
+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",
+ "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",
+ "crossbeam-epoch",
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-epoch"
+version = "0.9.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "045ebe27666471bb549370b4b0b3e51b07f56325befa4284db65fc89c02511b1"
+dependencies = [
+ "autocfg",
+ "cfg-if",
+ "crossbeam-utils",
+ "memoffset",
+ "once_cell",
+ "scopeguard",
+]
+
+[[package]]
+name = "crossbeam-utils"
+version = "0.8.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "51887d4adc7b564537b15adcfb307936f8075dfcd5f00dde9a9f1d29383682bc"
+dependencies = [
+ "cfg-if",
+ "once_cell",
+]
+
+[[package]]
+name = "csv"
+version = "1.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "22813a6dc45b335f9bade10bf7271dc477e81113e89eb251a0bc2a8a81c536e1"
+dependencies = [
+ "bstr",
+ "csv-core",
+ "itoa 0.4.8",
+ "ryu",
+ "serde",
+]
+
+[[package]]
+name = "csv-core"
+version = "0.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2b2466559f260f48ad25fe6317b3c8dac77b5bdb5763ac7d9d6103530663bc90"
+dependencies = [
+ "memchr 2.5.0",
+]
+
+[[package]]
+name = "dynasm"
+version = "1.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "add9a102807b524ec050363f09e06f1504214b0e1c7797f64261c891022dce8b"
+dependencies = [
+ "bitflags 1.3.2",
+ "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.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3f107b87b6afc2a64fd13cac55fe06d6c8859f12d4b14cbcdd2c67d0976781be"
+
+[[package]]
+name = "encode_unicode"
+version = "0.3.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f"
+
+[[package]]
+name = "fern"
+version = "0.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3bdd7b0849075e79ee9a1836df22c717d1eba30451796fdc631b04565dd11e2a"
+dependencies = [
+ "log",
+]
+
+[[package]]
+name = "funty"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1847abb9cb65d566acd5942e94aea9c8f547ad02c98e1649326fc0e8910b8b1e"
+
+[[package]]
+name = "gcc"
+version = "0.3.55"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f5f3913fa0bfe7ee1fd8248b6b9f42a5af4b9d65ec2dd2c3c26132b950ecfc2"
+
+[[package]]
+name = "gimli"
+version = "0.26.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "22030e2c5a68ec659fde1e949a745124b48e6fa8b045b7ed5bd1fe4ccc5c4e5d"
+
+[[package]]
+name = "goblin"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "32401e89c6446dcd28185931a01b1093726d0356820ac744023e6850689bf926"
+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 = "hermit-abi"
+version = "0.1.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "hex"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
+
+[[package]]
+name = "hexyl"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f823e021c22ebf3e1437685a9f3ceb2b93adb723e23dca2e4e38b47d3d49e447"
+dependencies = [
+ "ansi_term",
+ "anyhow",
+ "atty",
+ "clap",
+ "libc",
+ "thiserror",
+]
+
+[[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 = "inflate"
+version = "0.4.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1cdb29978cc5797bd8dcc8e5bf7de604891df2a8dc576973d71a281e916db2ff"
+dependencies = [
+ "adler32",
+]
+
+[[package]]
+name = "instant"
+version = "0.1.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "itertools"
+version = "0.10.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a9a9d19fa1e79b6215ff29b9d6880b706147f16e9b1dbb1e4e5947b5b02bc5e3"
+dependencies = [
+ "either",
+]
+
+[[package]]
+name = "itoa"
+version = "0.4.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4"
+
+[[package]]
+name = "itoa"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "112c678d4050afce233f4f2852bb2eb519230b3cf12f33585275537d7e41578d"
+
+[[package]]
+name = "js-sys"
+version = "0.3.58"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c3fac17f7123a73ca62df411b1bf727ccc805daa070338fda671c86dac1bdc27"
+dependencies = [
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "kernel32-sys"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d"
+dependencies = [
+ "winapi 0.2.8",
+ "winapi-build",
+]
+
+[[package]]
+name = "lancelot"
+version = "0.7.0"
+dependencies = [
+ "anyhow",
+ "bitflags 1.3.2",
+ "bitvec",
+ "byteorder",
+ "chrono",
+ "criterion",
+ "dynasm",
+ "dynasmrt",
+ "fern",
+ "goblin",
+ "lancelot-flirt",
+ "lazy_static",
+ "log",
+ "regex 1.6.0",
+ "smallvec",
+ "smol_str",
+ "thiserror",
+ "unicorn",
+ "widestring",
+ "zydis",
+]
+
+[[package]]
+name = "lancelot-bin"
+version = "0.7.0"
+dependencies = [
+ "ansi_term",
+ "anyhow",
+ "better-panic",
+ "chrono",
+ "clap",
+ "fern",
+ "goblin",
+ "hex",
+ "hexyl",
+ "lancelot",
+ "lancelot-flirt",
+ "log",
+ "thiserror",
+ "zydis",
+]
+
+[[package]]
+name = "lancelot-flirt"
+version = "0.7.0"
+dependencies = [
+ "anyhow",
+ "better-panic",
+ "bitflags 1.3.2",
+ "bitvec",
+ "chrono",
+ "clap",
+ "criterion",
+ "fern",
+ "inflate",
+ "log",
+ "nom",
+ "regex 1.6.0",
+ "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.126"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836"
+
+[[package]]
+name = "libunicorn-sys"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2bf3199986a2161e4b771d09c7ab75d3776769132c78e4bd8c68488125ce2c4b"
+dependencies = [
+ "bitflags 0.8.2",
+ "build-helper",
+ "gcc",
+ "libc",
+ "os_type",
+ "pkg-config",
+]
+
+[[package]]
+name = "lock_api"
+version = "0.4.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "327fa5b6a6940e4699ec49a9beae1ea4845c6bab9314e4f84ac68742139d8c53"
+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 = "memchr"
+version = "0.1.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d8b629fb514376c675b98c1421e80b151d3817ac42d7c667717d282761418d20"
+dependencies = [
+ "libc",
+]
+
+[[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.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3a79b39c93a7a5a27eeaf9a23b5ff43f1b9e0ad6b1cdd441140ae53c35613fc7"
+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 = "minimal-lexical"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
+
+[[package]]
+name = "miniz_oxide"
+version = "0.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6f5c75688da582b8ffc1f1799e9db273f32133c49e048f614d22ec3256773ccc"
+dependencies = [
+ "adler",
+]
+
+[[package]]
+name = "nom"
+version = "7.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a8903e5a29a317527874d0402f867152a3d21c908bb0b933e416c65e301d4c36"
+dependencies = [
+ "memchr 2.5.0",
+ "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.13.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1"
+dependencies = [
+ "hermit-abi",
+ "libc",
+]
+
+[[package]]
+name = "object"
+version = "0.29.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "21158b2c33aa6d4561f1c0a6ea283ca92bc54802a93b263e910746d679a7eb53"
+dependencies = [
+ "memchr 2.5.0",
+]
+
+[[package]]
+name = "once_cell"
+version = "1.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "18a6dbe30758c9f83eb00cbea4ac95966305f5a7772f3f42ebfc7fc7eddbd8e1"
+
+[[package]]
+name = "oorandom"
+version = "11.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575"
+
+[[package]]
+name = "os_type"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "960e8f383a1428eabebb01f650a03e7d1e5eb645e50f9ae4c26197647dd5e77a"
+dependencies = [
+ "regex 0.1.80",
+]
+
+[[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.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d76e8e1493bcac0d2766c42737f34458f1c8c50c0d23bcb24ea953affb273216"
+dependencies = [
+ "cfg-if",
+ "instant",
+ "libc",
+ "redox_syscall",
+ "smallvec",
+ "winapi 0.3.9",
+]
+
+[[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 = "pkg-config"
+version = "0.3.25"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae"
+
+[[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.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9428003b84df1496fb9d6eeee9c5f8145cb41ca375eb0dad204328888832811f"
+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.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e0918736323d1baff32ee0eade54984f6f201ad7e97d5cfb5d6ab4a358529615"
+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-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.41"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cdcc2916cde080c1876ff40292a396541241fe0072ef928cd76582e9ea5d60d2"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "pylancelot"
+version = "0.7.0"
+dependencies = [
+ "anyhow",
+ "lancelot",
+ "pyo3",
+ "zydis",
+]
+
+[[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 = "python-flirt"
+version = "0.7.0"
+dependencies = [
+ "anyhow",
+ "lancelot-flirt",
+ "pyo3",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3bcdf212e9776fbcb2d23ab029360416bb1706b1aea2d1a5ba002727cbcab804"
+dependencies = [
+ "proc-macro2",
+]
+
+[[package]]
+name = "radium"
+version = "0.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "643f8f41a8ebc4c5dc4515c82bb8abd397b527fc20fd681b7c011c2aee5d44fb"
+
+[[package]]
+name = "rayon"
+version = "1.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bd99e5772ead8baa5215278c9b15bf92087709e9c1b2d1f97cdb5a183c933a7d"
+dependencies = [
+ "autocfg",
+ "crossbeam-deque",
+ "either",
+ "rayon-core",
+]
+
+[[package]]
+name = "rayon-core"
+version = "1.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "258bcdb5ac6dad48491bb2992db6b7cf74878b0384908af124823d118c99683f"
+dependencies = [
+ "crossbeam-channel",
+ "crossbeam-deque",
+ "crossbeam-utils",
+ "num_cpus",
+]
+
+[[package]]
+name = "redox_syscall"
+version = "0.2.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "534cfe58d6a18cc17120fbf4635d53d14691c1fe4d951064df9bd326178d7d5a"
+dependencies = [
+ "bitflags 1.3.2",
+]
+
+[[package]]
+name = "regex"
+version = "0.1.80"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4fd4ace6a8cf7860714a2c2280d6c1f7e6a413486c13298bbc86fd3da019402f"
+dependencies = [
+ "aho-corasick 0.5.3",
+ "memchr 0.1.11",
+ "regex-syntax 0.3.9",
+ "thread_local",
+ "utf8-ranges",
+]
+
+[[package]]
+name = "regex"
+version = "1.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4c4eb3267174b8c6c2f654116623910a0fef09c4753f8dd83db29c48a0df988b"
+dependencies = [
+ "aho-corasick 0.7.18",
+ "memchr 2.5.0",
+ "regex-syntax 0.6.27",
+]
+
+[[package]]
+name = "regex-automata"
+version = "0.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132"
+
+[[package]]
+name = "regex-syntax"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f9ec002c35e86791825ed294b50008eea9ddfc8def4420124fbc6b08db834957"
+
+[[package]]
+name = "regex-syntax"
+version = "0.6.27"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a3f87b73ce11b1619a3c6332f45341e0047173771e8b8b73f87bfeefb7b56244"
+
+[[package]]
+name = "rustc-demangle"
+version = "0.1.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342"
+
+[[package]]
+name = "ryu"
+version = "1.0.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f3f6f92acf49d1b98f7a81226834412ada05458b7364277387724a237f062695"
+
+[[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 = "scroll"
+version = "0.10.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fda28d4b4830b807a8b43f7b0e6b5df875311b3e7621d84577188c175b6ec1ec"
+dependencies = [
+ "scroll_derive",
+]
+
+[[package]]
+name = "scroll_derive"
+version = "0.10.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aaaae8f38bb311444cfb7f1979af0bc9240d95795f75f9ceddf6a59b79ceffa0"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "semver"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7a3186ec9e65071a2095434b1f5bb24838d4e8e130f584c790f6033c79943537"
+dependencies = [
+ "semver-parser",
+]
+
+[[package]]
+name = "semver-parser"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
+
+[[package]]
+name = "serde"
+version = "1.0.140"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fc855a42c7967b7c369eb5860f7164ef1f6f81c20c7cc1141f2a604e18723b03"
+
+[[package]]
+name = "serde_cbor"
+version = "0.11.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2bef2ebfde456fb76bbcf9f59315333decc4fda0b2b44b420243c11e0f5ec1f5"
+dependencies = [
+ "half",
+ "serde",
+]
+
+[[package]]
+name = "serde_derive"
+version = "1.0.140"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6f2122636b9fe3b81f1cb25099fcf2d3f542cdb1d45940d56c713158884a05da"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "serde_json"
+version = "1.0.82"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "82c2c1fdcd807d1098552c5b9a36e425e42e9fbd7c6a37a8425f390f781f7fa7"
+dependencies = [
+ "itoa 1.0.2",
+ "ryu",
+ "serde",
+]
+
+[[package]]
+name = "smallvec"
+version = "1.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2fd0db749597d91ff862fd1d55ea87f7855a744a8425a64695b6fca237d1dad1"
+
+[[package]]
+name = "smol_str"
+version = "0.1.23"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7475118a28b7e3a2e157ce0131ba8c5526ea96e90ee601d9f6bb2e286a35ab44"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "strsim"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"
+
+[[package]]
+name = "syn"
+version = "1.0.98"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c50aef8a904de4c23c788f104b7dddc7d6f79c647c7c8ce4cc8f73eb0ca773dd"
+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 = "term_size"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e4129646ca0ed8f45d09b929036bafad5377103edd06e50bf574b353d2b08d9"
+dependencies = [
+ "libc",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "termios"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "411c5bf740737c7918b8b1fe232dca4dc9f8e754b8ad5e20966814001ed0ac6b"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "textwrap"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060"
+dependencies = [
+ "term_size",
+ "unicode-width",
+]
+
+[[package]]
+name = "thiserror"
+version = "1.0.31"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bd829fe32373d27f76265620b5309d0340cb8550f523c1dda251d6298069069a"
+dependencies = [
+ "thiserror-impl",
+]
+
+[[package]]
+name = "thiserror-impl"
+version = "1.0.31"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0396bc89e626244658bef819e22d0cc459e795a5ebe878e6ec336d1674a8d79a"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "thread-id"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a9539db560102d1cef46b8b78ce737ff0bb64e7e18d35b2a5688f7d097d0ff03"
+dependencies = [
+ "kernel32-sys",
+ "libc",
+]
+
+[[package]]
+name = "thread_local"
+version = "0.2.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8576dbbfcaef9641452d5cf0df9b0e7eeab7694956dd33bb61515fb8f18cfdd5"
+dependencies = [
+ "thread-id",
+]
+
+[[package]]
+name = "time"
+version = "0.1.44"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255"
+dependencies = [
+ "libc",
+ "wasi",
+ "winapi 0.3.9",
+]
+
+[[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.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "15c61ba63f9235225a22310255a29b806b907c9b8c964bcbd0a2c70f3f2deea7"
+
+[[package]]
+name = "unicode-width"
+version = "0.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973"
+
+[[package]]
+name = "unicorn"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0b44a5d2a8bf4e20647959d44caa769fc6e025d2aeccabf7fa79667b36233e58"
+dependencies = [
+ "bitflags 0.8.2",
+ "gcc",
+ "libc",
+ "libunicorn-sys",
+]
+
+[[package]]
+name = "unindent"
+version = "0.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "52fee519a3e570f7df377a06a1a7775cdbfb7aa460be7e08de2b1f0e69973a44"
+
+[[package]]
+name = "utf8-ranges"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a1ca13c08c41c9c3e04224ed9ff80461d97e121589ff27c753a16cb10830ae0f"
+
+[[package]]
+name = "vec_map"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191"
+
+[[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 0.3.9",
+ "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.81"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7c53b543413a17a202f4be280a7e5c62a1c69345f5de525ee64f8cfdbc954994"
+dependencies = [
+ "cfg-if",
+ "wasm-bindgen-macro",
+]
+
+[[package]]
+name = "wasm-bindgen-backend"
+version = "0.2.81"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5491a68ab4500fa6b4d726bd67408630c3dbe9c4fe7bda16d5c82a1fd8c7340a"
+dependencies = [
+ "bumpalo",
+ "lazy_static",
+ "log",
+ "proc-macro2",
+ "quote",
+ "syn",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-macro"
+version = "0.2.81"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c441e177922bc58f1e12c022624b6216378e5febc2f0533e41ba443d505b80aa"
+dependencies = [
+ "quote",
+ "wasm-bindgen-macro-support",
+]
+
+[[package]]
+name = "wasm-bindgen-macro-support"
+version = "0.2.81"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7d94ac45fcf608c1f45ef53e748d35660f168490c10b23704c7779ab8f5c3048"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+ "wasm-bindgen-backend",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-shared"
+version = "0.2.81"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6a89911bd99e5f3659ec4acf9c4d93b0a90fe4a2a11f15328472058edc5261be"
+
+[[package]]
+name = "web-sys"
+version = "0.3.58"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2fed94beee57daf8dd7d51f2b15dc2bcde92d7a72304cdf662a4371008b71b90"
+dependencies = [
+ "js-sys",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "widestring"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "17882f045410753661207383517a6f62ec3dbeb6a4ed2acce01f0728238d1983"
+
+[[package]]
+name = "winapi"
+version = "0.2.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a"
+
+[[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-build"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc"
+
+[[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 0.3.9",
+]
+
+[[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 = "wyz"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "129e027ad65ce1453680623c3fb5163cbf7107bfe1aa32257e7d0e63f9ced188"
+dependencies = [
+ "tap",
+]
+
+[[package]]
+name = "zydis"
+version = "3.1.1"
+source = "git+https://github.com/williballenthin/zydis-rs?branch=fix-26#cc52d4fac3f5534c4834635a452b96995f283e0e"
+dependencies = [
+ "bitflags 1.3.2",
+ "cmake",
+]
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..cbd3de93b6e7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-flirt/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, rustPlatform
+}:
+
+buildPythonPackage rec {
+  pname = "python-flirt";
+  version = "0.7.0";
+
+  src = fetchFromGitHub {
+    owner = "williballenthin";
+    repo = "lancelot";
+    rev = "v${version}";
+    sha256 = "sha256-FsdnWWfyQte7FDz5ldo+S+3IEtbOIODOeh1fHDP2/4s=";
+  };
+
+  postPatch = ''
+    cp ${./Cargo.lock} Cargo.lock
+  '';
+
+  format = "pyproject";
+
+  nativeBuildInputs = with rustPlatform; [
+    cargoSetupHook
+    maturinBuildHook
+  ];
+
+  buildAndTestSubdir = "pyflirt";
+
+  cargoDeps = rustPlatform.importCargoLock {
+    lockFile = ./Cargo.lock;
+    outputHashes = {
+      "zydis-3.1.1" = "sha256-/L28cBTCg/S7onDQXnqUoB5udoEO/depmxDUcnfIQEw=";
+    };
+  };
+
+  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..4aabb208a90c
--- /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.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-forecastio/default.nix b/nixpkgs/pkgs/development/python-modules/python-forecastio/default.nix
new file mode 100644
index 000000000000..991ec3279dec
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-forecastio/default.nix
@@ -0,0 +1,31 @@
+{ buildPythonPackage, lib, fetchPypi
+, requests
+, nose
+, responses
+}:
+
+buildPythonPackage rec {
+  pname = "python-forecastio";
+  version = "1.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0m6lf4a46pnwm5xg9dnmwslwzrpnj6d9agw570grciivbvb1ji0l";
+
+  };
+
+  checkInputs = [ nose ];
+
+  propagatedBuildInputs = [ requests responses ];
+
+  checkPhase = ''
+    nosetests
+  '';
+
+  meta = with lib; {
+    homepage = "https://zeevgilovitz.com/python-forecast.io/";
+    description = "A thin Python Wrapper for the Dark Sky (formerly forecast.io) weather API";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ makefu ];
+  };
+}
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..e00ef7d9deeb
--- /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.0";
+
+  src = fetchFromGitHub {
+    owner = "eyeseast";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0flyh2pb0z4lq66dmmsgyakvg11yhkp4dk7qnzanl34z7ikp97bx";
+  };
+
+  propagatedBuildInputs = [
+    pyyaml
+    pyaml # yes, it's needed
+    six
+  ];
+
+  # tries to import test.test, which conflicts with module
+  # exported by python interpreter
+  doCheck = false;
+  checkInputs = [
+    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..3f18bd09aa45
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-fsutil/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "python-fsutil";
+  version = "0.6.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "fabiocaccamo";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-Swq0kAZTM/zP3LXMkzZnp8KTI0YzGPIbWV2kKV1Dw0k=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  checkInputs = [
+    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";
+    license = 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..ec8d5841bafd
--- /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;
+    sha256 = "sha256-lFQBrKWwdvUScwsBva08izZVeVDn1u+ldzixtL9YTpA=";
+  };
+
+  nativeBuildInputs = [
+    pkg-config
+  ];
+
+  buildInputs = [
+    gammu
+  ];
+
+  # Check with the next release if tests could be run with pytest
+  # checkInputs = [ 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..21cb103df83f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-gitlab/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, argcomplete
+, requests
+, requests-toolbelt
+, pyyaml
+}:
+
+buildPythonPackage rec {
+  pname = "python-gitlab";
+  version = "3.8.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-4dslB2Ug4RjHwmvssNB0p6aBJ0OYcNQ7hjY0Igax4JE=";
+  };
+
+  propagatedBuildInputs = [
+    argcomplete
+    pyyaml
+    requests
+    requests-toolbelt
+  ];
+
+  # 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";
+    license = licenses.lgpl3;
+    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..10537b419ae8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-glanceclient/default.nix
@@ -0,0 +1,71 @@
+{ lib
+, buildPythonApplication
+, fetchPypi
+, coreutils
+, pbr
+, prettytable
+, keystoneauth1
+, requests
+, warlock
+, oslo-utils
+, oslo-i18n
+, wrapt
+, pyopenssl
+, pythonOlder
+, stestr
+, testscenarios
+, ddt
+, requests-mock
+}:
+
+buildPythonApplication rec {
+  pname = "python-glanceclient";
+  version = "4.0.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-pfQnIvrZFw16eRF2kPxmthWpY7qWkBu9SUavQnXO8zQ=";
+  };
+
+  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
+  ];
+
+  checkInputs = [
+    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..3ece771e7b5f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-gnupg/default.nix
@@ -0,0 +1,29 @@
+{ lib, buildPythonPackage, fetchPypi, gnupg }:
+
+buildPythonPackage rec {
+  pname = "python-gnupg";
+  version = "0.4.9";
+
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-qqdIeVVyWRqvEntKyJhWhPNnP/grOfNwyDawBuaPxTc=";
+  };
+
+  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')"
+  '';
+
+  pythonImportsCheck = [ "gnupg" ];
+
+  meta = with lib; {
+    description = "API for the GNU Privacy Guard (GnuPG)";
+    homepage = "https://github.com/vsajip/python-gnupg";
+    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..cc3d8667073c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-gvm/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, defusedxml
+, fetchFromGitHub
+, lxml
+, paramiko
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "python-gvm";
+  version = "22.7.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "greenbone";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-0dshBFcZ0DLa6SXxzWyfzmgPPxTIiKq00OKCJfk0vKY=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    defusedxml
+    lxml
+    paramiko
+  ];
+
+  checkInputs = [
+    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";
+    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..38daad08bdb0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-heatclient/default.nix
@@ -0,0 +1,74 @@
+{ lib
+, babel
+, buildPythonApplication
+, cliff
+, fetchPypi
+, iso8601
+, keystoneauth1
+, osc-lib
+, oslo-i18n
+, oslo-serialization
+, oslo-utils
+, pbr
+, prettytable
+, python-swiftclient
+, pythonOlder
+, pyyaml
+, requests
+, requests-mock
+, stestr
+, testscenarios
+}:
+
+buildPythonApplication rec {
+  pname = "python-heatclient";
+  version = "3.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-5OLysKbM2GbjMT8lshWDLMtqOrHq2DhhWvbw1oNBNZs=";
+  };
+
+  propagatedBuildInputs = [
+    babel
+    cliff
+    iso8601
+    keystoneauth1
+    osc-lib
+    oslo-i18n
+    oslo-serialization
+    oslo-utils
+    pbr
+    prettytable
+    python-swiftclient
+    pyyaml
+    requests
+  ];
+
+  checkInputs = [
+    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..aa47f9a3319b
--- /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;
+    sha256 = "sha256-sYvR7VPJDuV9VxTWata7crZOkw1K7KmDCJLAi7KNpgg=";
+  };
+
+  checkInputs = [ 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-homewizard-energy/default.nix b/nixpkgs/pkgs/development/python-modules/python-homewizard-energy/default.nix
new file mode 100644
index 000000000000..7169c0560818
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-homewizard-energy/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, aiohttp
+, aresponses
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, protobuf
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "python-homewizard-energy";
+  version = "1.1.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "DCSBL";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-D+WgAsH5CaAIw/lYMUd191f/9EGLvM93qB+b2/XULD8=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  checkInputs = [
+    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";
+    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..4eca7cca13fc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-hosts/default.nix
@@ -0,0 +1,33 @@
+{ lib, buildPythonPackage, fetchPypi, pyyaml, pytest, pytest-cov }:
+
+buildPythonPackage rec {
+  pname = "python-hosts";
+  version = "1.0.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-4SAXjx5pRDhv4YVUgrUttyUa5izpYqpDKiiGJc2y8V0=";
+  };
+
+  # 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" ""
+  '';
+
+  checkInputs = [ pyyaml pytest pytest-cov ];
+
+  # Removing 1 test file (it requires internet connection) and keeping the other two
+  checkPhase = ''
+    pytest tests/test_hosts_entry.py
+    pytest tests/test_utils.py
+  '';
+
+  meta = with lib; {
+    description = "A library for managing a hosts file. It enables adding and removing entries, or importing them from a file or URL";
+    homepage = "https://github.com/jonhadfield/python-hosts";
+    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..78a3b018c7ea
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-http-client/default.nix
@@ -0,0 +1,38 @@
+{ 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;
+    sha256 = "sha256-8Qs5Jw0LMV2UucLnlFKJQ2PUhYaQx6uJdIV/4gaPH3w=";
+  };
+
+  checkInputs = [
+    mock
+    pytestCheckHook
+  ];
+
+  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..8e7f8f880e2a
--- /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=";
+  };
+
+  checkInputs = [ 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..cbd68f387656
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-ipmi/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, future
+, mock
+, nose
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "python-ipmi";
+  version = "0.5.2";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "kontron";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-VXWSoVRfgJWf9rOT4SE1mTJdeNmzR3TRc2pc6Pp1M5U=";
+  };
+
+  propagatedBuildInputs = [
+    future
+  ];
+
+  checkInputs = [
+    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-ironicclient/default.nix b/nixpkgs/pkgs/development/python-modules/python-ironicclient/default.nix
new file mode 100644
index 000000000000..44c258675a7c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-ironicclient/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, buildPythonApplication
+, fetchPypi
+, pbr
+, appdirs
+, cliff
+, dogpile-cache
+, jsonschema
+, keystoneauth1
+, openstacksdk
+, osc-lib
+, oslo-utils
+, pyyaml
+, requests
+, stevedore
+, stestr
+, requests-mock
+, oslotest
+}:
+
+buildPythonApplication rec {
+  pname = "python-ironicclient";
+  version = "5.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-mA8+4cvWhxPn7LGVcWvwxGRBnlM671YgFfE10zhVPtQ=";
+  };
+
+  propagatedBuildInputs = [
+    pbr
+    appdirs
+    cliff
+    dogpile-cache
+    jsonschema
+    keystoneauth1
+    openstacksdk
+    osc-lib
+    oslo-utils
+    pyyaml
+    requests
+    stevedore
+  ];
+
+  checkInputs = [
+    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..e3ce43109725
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-izone/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, aiohttp
+, netifaces
+, pytest-aio
+, pytest-asyncio
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "python-izone";
+  version = "1.2.7";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "Swamp-Ig";
+    repo = "pizone";
+    rev = "v${version}";
+    hash = "sha256-CvFOhs56dfNerK3junWElQfTJi1YXA86zMbv0tseQC8=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    netifaces
+  ];
+
+  checkInputs = [
+    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..dad933966aea
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-jenkins/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, mock
+, pbr
+, pyyaml
+, setuptools
+, six
+, multi_key_dict
+, testscenarios
+, requests
+, requests-mock
+, stestr
+}:
+
+buildPythonPackage rec {
+  pname = "python-jenkins";
+  version = "1.7.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "01jid5s09lr3kayr2h1z9n8h9nhyw3jxv9c4b5hrlxijknkqzvfy";
+  };
+
+  # 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
+  '';
+
+  buildInputs = [ mock ];
+  propagatedBuildInputs = [ pbr pyyaml setuptools six multi_key_dict requests ];
+
+   checkInputs = [ stestr testscenarios requests-mock ];
+   checkPhase = ''
+     stestr run
+   '';
+
+  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..5ba5d9c8ddc0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-jose/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, ecdsa
+, rsa
+, pycrypto
+, pyasn1
+, pycryptodome
+, cryptography
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "python-jose";
+  version = "3.3.0";
+
+  src = fetchFromGitHub {
+    owner = "mpdavis";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-6VGC6M5oyGCOiXcYp6mpyhL+JlcYZKIqOQU9Sm/TkKM=";
+  };
+
+  propagatedBuildInputs = [
+    cryptography
+    ecdsa
+    pyasn1
+    pycrypto
+    pycryptodome
+    rsa
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace '"pytest-runner",' ""
+  '';
+
+  pythonImportsCheck = [ "jose" ];
+
+  meta = with lib; {
+    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..33b414018182
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-json-logger/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, nose
+}:
+
+buildPythonPackage rec {
+  version = "2.0.4";
+  pname = "python-json-logger";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-dk12IXX5n8xGML1IU7CWMqy2CmIkrLJ84IzXDwsbgb0=";
+  };
+
+  checkInputs = [ nose ];
+
+  meta = with lib; {
+    homepage = "https://github.com/madzak/python-json-logger";
+    description = "A python library adding a json log formatter";
+    license = licenses.bsdOriginal;
+    maintainers = [ maintainers.costrouc ];
+  };
+
+}
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..a8cbec25a996
--- /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
+  '';
+
+  checkInputs = [
+    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..d4c9524c9edd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-kasa/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, asyncclick
+, buildPythonPackage
+, fetchFromGitHub
+, importlib-metadata
+, pydantic
+, poetry-core
+, pytest-asyncio
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+, voluptuous
+}:
+
+buildPythonPackage rec {
+  pname = "python-kasa";
+  version = "0.5.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-9zCUYB+TYgDMoTHpR0u42Usq2EKp8vtzlTgU82eXxl8=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    asyncclick
+    importlib-metadata
+    pydantic
+  ];
+
+  checkInputs = [
+    pytest-asyncio
+    pytest-mock
+    pytestCheckHook
+    voluptuous
+  ];
+
+  pytestFlagsArray = [
+    "--asyncio-mode=legacy"
+  ];
+
+  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/";
+    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..6425869243ef
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-keycloak/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, requests
+, python-jose
+, httmock
+}:
+
+buildPythonPackage rec {
+  pname = "python-keycloak";
+  version = "0.27.0";
+
+  src = fetchFromGitHub {
+    owner = "marcospereirampj";
+    repo = "python-keycloak";
+    rev = version;
+    sha256 = "sha256-XCOfzzUs0K5/peprgpEXY2pX6wYOF7hg9ec1XPEYHCI=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    python-jose
+  ];
+
+  checkInputs = [
+    httmock
+  ];
+
+  checkPhase = ''
+    python -m unittest discover
+  '';
+
+  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; [ costrouc ];
+  };
+}
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..198ef19465c4
--- /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.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-D1DaM78gtVrPxZ1PlGD6Lvwb4V/QXsPyNnTQPror6j8=";
+  };
+
+  propagatedBuildInputs = [
+    keystoneauth1
+    oslo-config
+    oslo-serialization
+    pbr
+  ];
+
+  checkInputs = [
+    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-levenshtein/default.nix b/nixpkgs/pkgs/development/python-modules/python-levenshtein/default.nix
new file mode 100644
index 000000000000..9795c27d9901
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-levenshtein/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "python-levenshtein";
+  version = "0.12.2";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "dc2395fbd148a1ab31090dd113c366695934b9e85fe5a4b2a032745efd0346f6";
+  };
+
+  # No tests included in archive
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "Levenshtein"
+  ];
+
+  meta = with lib; {
+    description = "Functions for fast computation of Levenshtein distance and string similarity";
+    homepage = "https://github.com/ztane/python-Levenshtein";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ aske ];
+  };
+}
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..702be64075ae
--- /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}";
+    sha256 = "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..7930dcd33e0a
--- /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;
+    sha256 = "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..699fc97f58e2
--- /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;
+    sha256 = "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";
+      sha256 = "sha256-9oJ9YvKl2sI8oGhfyauNS+HT4kXsDt0L8S2owluWdj0=";
+    })
+  ];
+
+  propagatedBuildInputs = [ networkx numpy ];
+
+  pythonImportsCheck = [ "community" ];
+
+  checkInputs = [ pandas scipy ];
+
+  meta = with lib; {
+    homepage = "https://github.com/taynaud/python-louvain";
+    description = "Louvain Community Detection";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ erictapen ];
+  };
+}
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..ee66ea262c63
--- /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.2.1";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "python-lsp";
+    repo = "python-lsp-black";
+    rev = "v${version}";
+    sha256 = "sha256-qNA6Bj1VI0YEtRuvcMQZGWakQNNrJ2PqhozrLmQHPAg=";
+  };
+
+  checkInputs = [ 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..6938bc282f88
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-lsp-jsonrpc/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, ujson
+}:
+
+buildPythonPackage rec {
+  pname = "python-lsp-jsonrpc";
+  version = "1.0.0";
+
+  src = fetchFromGitHub {
+    owner = "python-lsp";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0h4bs8s4axcm0p02v59amz9sq3nr4zhzdgwq7iaw6awl27v1hd0i";
+  };
+
+  propagatedBuildInputs = [
+    ujson
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "--cov-report html --cov-report term --junitxml=pytest.xml" "" \
+      --replace "--cov pylsp_jsonrpc --cov test" ""
+  '';
+
+  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";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..eafad1a9ab09
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-lsp-server/default.nix
@@ -0,0 +1,122 @@
+{ lib
+, autopep8
+, buildPythonPackage
+, fetchFromGitHub
+, flake8
+, flaky
+, jedi
+, matplotlib
+, mccabe
+, numpy
+, pandas
+, pluggy
+, pycodestyle
+, pydocstyle
+, pyflakes
+, pylint
+, pyqt5
+, pytestCheckHook
+, python-lsp-jsonrpc
+, pythonOlder
+, rope
+, setuptools
+, setuptools-scm
+, stdenv
+, ujson
+, whatthepatch
+, yapf
+, withAutopep8 ? true
+, withFlake8 ? true
+, withMccabe ? true
+, withPycodestyle ? true
+, withPydocstyle ? true
+, withPyflakes ? true
+, withPylint ? true
+, withRope ? true
+, withYapf ? true
+}:
+
+buildPythonPackage rec {
+  pname = "python-lsp-server";
+  version = "1.5.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "python-lsp";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-tW2w94HI6iy8vcDb5pIL79bAO6BJp9q6SMAXgiVobm0=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "--cov-report html --cov-report term --junitxml=pytest.xml" "" \
+      --replace "--cov pylsp --cov test" "" \
+      --replace "mccabe>=0.6.0,<0.7.0" "mccabe"
+  '';
+
+  preBuild = ''
+    export SETUPTOOLS_SCM_PRETEND_VERSION=${version}
+  '';
+
+  propagatedBuildInputs = [
+    jedi
+    pluggy
+    python-lsp-jsonrpc
+    setuptools
+    setuptools-scm
+    ujson
+  ] ++ lib.optional withAutopep8 autopep8
+  ++ lib.optional withFlake8 flake8
+  ++ lib.optional withMccabe mccabe
+  ++ lib.optional withPycodestyle pycodestyle
+  ++ lib.optional withPydocstyle pydocstyle
+  ++ lib.optional withPyflakes pyflakes
+  ++ lib.optional withPylint pylint
+  ++ lib.optional withRope rope
+  ++ lib.optionals withYapf [ whatthepatch yapf ];
+
+  checkInputs = [
+    flaky
+    matplotlib
+    numpy
+    pandas
+    pytestCheckHook
+  ]
+  # pyqt5 is broken on aarch64-darwin
+  ++ lib.optionals (!stdenv.isDarwin || !stdenv.isAarch64) [ pyqt5 ];
+
+  disabledTests = [
+    "test_numpy_completions" # https://github.com/python-lsp/python-lsp-server/issues/243
+  ] ++ lib.optional (!withPycodestyle) "test_workspace_loads_pycodestyle_config"
+  # pyqt5 is broken on aarch64-darwin
+  ++ lib.optional (stdenv.isDarwin && stdenv.isAarch64) "test_pyqt_completion";
+
+  disabledTestPaths = lib.optional (!withAutopep8) "test/plugins/test_autopep8_format.py"
+    ++ lib.optional (!withRope) "test/plugins/test_completion.py"
+    ++ lib.optional (!withFlake8) "test/plugins/test_flake8_lint.py"
+    ++ lib.optional (!withMccabe) "test/plugins/test_mccabe_lint.py"
+    ++ lib.optional (!withPycodestyle) "test/plugins/test_pycodestyle_lint.py"
+    ++ lib.optional (!withPydocstyle) "test/plugins/test_pydocstyle_lint.py"
+    ++ lib.optional (!withPyflakes) "test/plugins/test_pyflakes_lint.py"
+    ++ lib.optional (!withPylint) "test/plugins/test_pylint_lint.py"
+    ++ lib.optional (!withRope) "test/plugins/test_rope_rename.py"
+    ++ lib.optional (!withYapf) "test/plugins/test_yapf_format.py";
+
+  preCheck = ''
+    export HOME=$(mktemp -d);
+  '';
+
+  pythonImportsCheck = [
+    "pylsp"
+  ];
+
+  meta = with lib; {
+    description = "Python implementation of the Language Server Protocol";
+    homepage = "https://github.com/python-lsp/python-lsp-server";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..dcf55e8e32b0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-lzo/default.nix
@@ -0,0 +1,22 @@
+{ lib, fetchPypi, buildPythonPackage, lzo, nose }:
+
+buildPythonPackage rec {
+  pname = "python-lzo";
+  version = "1.14";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "83cbd8ecaae284735250e31d6c0ecc18ac08763fab2a8c910dc5a6910db6250c";
+  };
+
+  buildInputs = [ lzo ];
+  propagatedBuildInputs = [ ];
+  checkInputs = [ nose ];
+
+  meta = with lib; {
+    homepage = "https://github.com/jd-boyd/python-lzo";
+    description = "Python bindings for the LZO data compression library";
+    license = licenses.gpl2;
+    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..3338fb6fa7d0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-magic/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, substituteAll
+, file
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "python-magic";
+  version = "0.4.27";
+
+  src = fetchFromGitHub {
+    owner = "ahupp";
+    repo = "python-magic";
+    rev = version;
+    sha256 = "sha256-fZ+5xJ3P0EYK+6rQ8VzXv2zckKfEH5VUdISIR6ybIfQ=";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./libmagic-path.patch;
+      libmagic = "${file}/lib/libmagic${stdenv.hostPlatform.extensions.sharedLibrary}";
+    })
+  ];
+
+  preCheck = ''
+    export LC_ALL=en_US.UTF-8
+  '';
+
+  checkInputs = [
+    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; [ SuperSandro2000 ];
+  };
+}
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..d0a8fc3a0fc6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-manilaclient/default.nix
@@ -0,0 +1,79 @@
+{ lib
+, buildPythonApplication
+, 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
+, pythonOlder
+}:
+
+buildPythonApplication rec {
+  pname = "python-manilaclient";
+  version = "4.0.0";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-TEGzUNgYTkb2VrvW2E3lurD6N1XcIhH2tjmPlsJ/5MI=";
+  };
+
+  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..61615456225a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-manilaclient/tests.nix
@@ -0,0 +1,31 @@
+{ buildPythonPackage
+, python-manilaclient
+, stestr
+, ddt
+, tempest
+, mock
+, python-openstackclient
+}:
+
+buildPythonPackage rec {
+  pname = "python-manilaclient-tests";
+  inherit (python-manilaclient) version;
+
+  src = python-manilaclient.src;
+
+  dontBuild = true;
+  dontInstall = true;
+
+  checkInputs = [
+    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..2d888518ff45
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-mapnik/default.nix
@@ -0,0 +1,75 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, isPyPy
+, python
+, pillow
+, pycairo
+, pkg-config
+, boost
+, cairo
+, harfbuzz
+, icu
+, libjpeg
+, libpng
+, libtiff
+, libwebp
+, mapnik
+, proj
+, zlib
+}:
+
+buildPythonPackage rec {
+  pname = "python-mapnik";
+  version = "unstable-2020-02-24";
+
+  src = fetchFromGitHub {
+    owner = "mapnik";
+    repo = "python-mapnik";
+    rev = "7da019cf9eb12af8f8aa88b7d75789dfcd1e901b";
+    sha256 = "0snn7q7w1ab90311q8wgd1z64kw1svm5w831q0xd6glqhah86qc8";
+  };
+
+  disabled = isPyPy;
+  doCheck = false; # doesn't find needed test data files
+  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
+  '';
+
+  nativeBuildInputs = [
+    mapnik # for mapnik_config
+    pkg-config
+  ];
+
+  patches = [
+    ./find-pycairo-with-pkg-config.patch
+  ];
+
+  buildInputs = [
+    mapnik
+    boost
+    cairo
+    harfbuzz
+    icu
+    libjpeg
+    libpng
+    libtiff
+    libwebp
+    proj
+    zlib
+  ];
+
+  propagatedBuildInputs = [ pillow pycairo ];
+
+  pythonImportsCheck = [ "mapnik" ];
+
+  meta = with lib; {
+    description = "Python bindings for Mapnik";
+    maintainers = with maintainers; [ erictapen ];
+    homepage = "https://mapnik.org";
+    license = licenses.lgpl21;
+  };
+}
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..0b6d01746b97
--- /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";
+  };
+
+  checkInputs = [ 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-memcached/default.nix b/nixpkgs/pkgs/development/python-modules/python-memcached/default.nix
new file mode 100644
index 000000000000..1f69062a64e9
--- /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
+  ];
+
+  checkInputs = [
+    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..d1497c43bcb7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-miio/default.nix
@@ -0,0 +1,84 @@
+{ lib
+, android-backup
+, appdirs
+, attrs
+, buildPythonPackage
+, click
+, construct
+, croniter
+, cryptography
+, defusedxml
+, fetchPypi
+, importlib-metadata
+, micloud
+, netifaces
+, poetry-core
+, 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
+  ];
+
+  propagatedBuildInputs = [
+    android-backup
+    appdirs
+    attrs
+    click
+    construct
+    croniter
+    cryptography
+    defusedxml
+    micloud
+    netifaces
+    pytz
+    pyyaml
+    tqdm
+    zeroconf
+  ] ++ lib.optional (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  checkInputs = [
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'defusedxml = "^0"' 'defusedxml = "*"'
+    # Will be fixed with the next release, https://github.com/rytilahti/python-miio/pull/1378
+    substituteInPlace miio/integrations/vacuum/roborock/vacuum_cli.py \
+      --replace "resultcallback" "result_callback"
+  '';
+
+  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..ab91a5d5e2e5
--- /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";
+  };
+
+  checkInputs = [
+    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..8c43d7a4ca27
--- /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.1.11";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "iwalton3";
+    repo = "python-mpv-jsonipc";
+    rev = "v${version}";
+    sha256 = "034vc2j54dciiq80k7jn6kx4g7i58sjk0ykma039k5rihj2rblpk";
+  };
+
+  # '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..3bf07bd1d509
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-multipart/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, mock
+, pyyaml
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "python-multipart";
+  version = "0.0.5";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f7bb5f611fc600d15fa47b3974c8aa16e93724513b49b5f95c81e6624c83fa43";
+  };
+
+  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"
+  '';
+
+  checkInputs = [
+    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; [ costrouc ];
+  };
+}
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..ccda98b2eb1a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-mystrom/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, aiohttp
+, click
+, requests
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "python-mystrom";
+  version = "2.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "050dkx29wrmdd8z7pmyk36k2ihpapqi4qmyb70bm6xl5l4jh4k7j";
+  };
+
+  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";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..1cb3559b049b
--- /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;
+    sha256 = "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..6d6c5c90fdfe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-nomad/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchPypi, requests }:
+
+buildPythonPackage rec {
+  pname = "python-nomad";
+  version = "1.4.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "087a7d5d2af9fd8ce5da70d29e4b456c6b8b0ea3cd16613ed50f6eb8ad6cdba6";
+  };
+
+  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";
+    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..d4a9e9255f23
--- /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.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-6esqm9ukZNggwQB3XDwvZJMIjfZq8T37kyXMa4ZcjSM=";
+  };
+
+  propagatedBuildInputs = [
+    iso8601
+    keystoneauth1
+    oslo-i18n
+    oslo-serialization
+    pbr
+    prettytable
+  ];
+
+  checkInputs = [
+    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..d4ecba5a4d95
--- /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 ];
+  checkInputs = [ 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..bc3c13478e61
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-oauth2/default.nix
@@ -0,0 +1,23 @@
+{ 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;
+    maintainers = with maintainers; [ ixxie ];
+  };
+}
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..f430517be759
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-olm/default.nix
@@ -0,0 +1,36 @@
+{ lib, buildPythonPackage, isPy3k, olm
+, cffi, future, typing }:
+
+buildPythonPackage {
+  pname = "python-olm";
+  inherit (olm) src version;
+
+  disabled = !isPy3k;
+
+  sourceRoot = "source/python";
+  buildInputs = [ olm ];
+
+  preBuild = ''
+    make include/olm/olm.h
+  '';
+
+  propagatedBuildInputs = [
+    cffi
+    future
+    typing
+  ];
+
+  propagatedNativeBuildInputs = [
+    cffi
+  ];
+
+  # Some required libraries for testing are not packaged yet.
+  doCheck = false;
+  pythonImportsCheck = [ "olm" ];
+
+  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-opendata-transport/default.nix b/nixpkgs/pkgs/development/python-modules/python-opendata-transport/default.nix
new file mode 100644
index 000000000000..01733dece385
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-opendata-transport/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, aiohttp
+, urllib3
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "python-opendata-transport";
+  version = "0.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    pname = "python_opendata_transport";
+    inherit version;
+    sha256 = "sha256-CpzMMp2C3UOiUna9EcUucD/PKv7AZlkaU8QJfWntoi8=";
+  };
+
+  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";
+    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..dd669cf54754
--- /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 = "source/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-openstackclient/default.nix b/nixpkgs/pkgs/development/python-modules/python-openstackclient/default.nix
new file mode 100644
index 000000000000..8c76861bcb86
--- /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 = "5.8.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-M0hS34iXuV8FgewS7ih96MepKJogihjwqLOHdwGf2YY=";
+  };
+
+  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
+  '';
+
+  checkInputs = [
+    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..a2c76c7d6d54
--- /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
+  ];
+
+  checkInputs = [
+    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..ade67876ea0c
--- /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.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "2f8c187c68d239960fb2eddcb5346a62a9b35e64f2de045b3e5e509f475ca73d";
+  };
+
+  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-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..6bb111a07e91
--- /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
+  ];
+
+  checkInputs = [
+    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..067d2a2843e6
--- /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;
+    sha256 = "sha256-D0X2T0ze79KR6Gno4UWpA/XvlkK6Y/jXUtLbzlOKr3E=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  checkInputs = [
+    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..16883ee9426e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-pam/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, 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}";
+    sha256 = "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"'
+  '';
+
+  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..b52ad018d577
--- /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.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "8a8ec019d9b330a6a6f69a7de61d14b4c98b102d76359047c5ce0263e12246a6";
+  };
+
+  # 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..6626f0b77b3c
--- /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.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-HhCX30G8dfV0WZ/++J6LIO/xvfyRkdPtJkzC2ulUKdA=";
+  };
+
+  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-prctl/default.nix b/nixpkgs/pkgs/development/python-modules/python-prctl/default.nix
new file mode 100644
index 000000000000..dc967b54305c
--- /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 ];
+
+  checkInputs = [ 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..7ebc98426d99
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-rabbitair/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, cryptography
+, fetchFromGitHub
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, 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=";
+  };
+
+  propagatedBuildInputs = [
+    cryptography
+    zeroconf
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    typing-extensions
+  ];
+
+  checkInputs = [
+    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..a9423a7a58df
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-rapidjson/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, fetchPypi
+, pythonOlder
+, rapidjson
+, pytestCheckHook
+, pytz
+, glibcLocales
+}:
+
+let
+  rapidjson' = rapidjson.overrideAttrs (old: {
+    version = "unstable-2022-05-24";
+    src = fetchFromGitHub {
+      owner = "Tencent";
+      repo = "rapidjson";
+      rev = "232389d4f1012dddec4ef84861face2d2ba85709";
+      hash = "sha256-RLvDcInUa8E8DRA4U/oXEE8+TZ0SDXXDU/oWvpfDWjw=";
+    };
+    patches = [
+      (fetchpatch {
+        url = "https://git.alpinelinux.org/aports/plain/community/rapidjson/do-not-include-gtest-src-dir.patch";
+        hash = "sha256-BjSZEwfCXA/9V+kxQ/2JPWbc26jQn35CfN8+8NW24s4=";
+      })
+    ];
+  });
+in buildPythonPackage rec {
+  version = "1.6";
+  pname = "python-rapidjson";
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-GJzxqWv5/NhtADYPFa12qDzgiJuK6NHLD9srKZXlocg=";
+  };
+
+  setupPyBuildFlags = [
+    "--rj-include-dir=${lib.getDev rapidjson'}/include"
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    pytz
+  ];
+
+  disabledTestPaths = [
+    "benchmarks"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/python-rapidjson/python-rapidjson";
+    description = "Python wrapper around rapidjson";
+    license = licenses.mit;
+    maintainers = with maintainers; [ costrouc 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..7671e5a4a9b2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-redis-lock/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, redis
+, pytestCheckHook
+, process-tests
+, pkgs
+, withDjango ? false, django-redis
+}:
+
+buildPythonPackage rec {
+  pname = "python-redis-lock";
+  version = "3.7.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "4265a476e39d476a8acf5c2766485c44c75f3a1bd6cf73bb195f3079153b8374";
+  };
+
+  propagatedBuildInputs = [
+    redis
+  ] ++ lib.optional withDjango django-redis;
+
+  checkInputs = [
+    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"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/ionelmc/python-redis-lock";
+    license = licenses.bsd2;
+    description = "Lock context manager implemented via redis SETNX/BLPOP";
+    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..8b24ca08ff8b
--- /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
+  ];
+
+  checkInputs = [
+    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 = teams.determinatesystems.members;
+  };
+}
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..58d6a1e72f55
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-rtmidi/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, pkg-config
+, alsa-lib
+, libjack2
+, tox
+, flake8
+, alabaster
+, CoreAudio
+, CoreMIDI
+, CoreServices
+}:
+
+buildPythonPackage rec {
+  pname = "python-rtmidi";
+  version = "1.4.9";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "bfeb4ed99d0cccf6fa2837566907652ded7adc1c03b69f2160c9de4082301302";
+  };
+
+  nativeBuildInputs = [ pkg-config ];
+  buildInputs = [
+    libjack2
+  ] ++ lib.optionals stdenv.isLinux [
+    alsa-lib
+  ] ++ lib.optionals stdenv.isDarwin [
+    CoreAudio
+    CoreMIDI
+    CoreServices
+  ];
+  checkInputs = [
+    tox
+    flake8
+    alabaster
+  ];
+
+  meta = with lib; {
+    description = "A Python binding for the RtMidi C++ library implemented using Cython";
+    homepage = "https://chrisarndt.de/projects/python-rtmidi/";
+    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..43b5e635294b
--- /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;
+    sha256 = "sha256-zGdgD+SgoMB7/zDQI/trmV70l91TB7OkDxaJ30W3dkI=";
+  };
+
+  propagatedBuildInputs = [ six pypblib ];
+
+  checkInputs = [ 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..5f985f0fafdd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-slugify/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, text-unidecode
+, unidecode
+}:
+
+buildPythonPackage rec {
+  pname = "python-slugify";
+  version = "6.1.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "un33k";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-JGjUNBEMuICsaClQGDSGX4qFRjecVKzmpPNRUTvfwho=";
+  };
+
+  propagatedBuildInputs = [
+    text-unidecode
+    unidecode
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "test.py"
+  ];
+
+  pythonImportsCheck = [
+    "slugify"
+  ];
+
+  meta = with lib; {
+    description = "Python Slugify application that handles Unicode";
+    homepage = "https://github.com/un33k/python-slugify";
+    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..ee7774654524
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-smarttub/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, aiohttp
+, aresponses
+, buildPythonPackage
+, fetchFromGitHub
+, inflection
+, pyjwt
+, pytest-asyncio
+, pytestCheckHook
+, python-dateutil
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "python-smarttub";
+  version = "0.0.32";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "mdz";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-3qAs0vL6YGFDsMFC3KAhSc/axxVOll/SOswaJgVi9Hc=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    inflection
+    pyjwt
+    python-dateutil
+  ];
+
+  checkInputs = [
+    aresponses
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "--asyncio-mode=legacy"
+  ];
+
+  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..8322d1c4d379
--- /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.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "gijzelaerr";
+    repo = "python-snap7";
+    rev = "refs/tags/${version}";
+    hash = "sha256-xkkJE3wTqS6spwEmQ+HBY1Szao1VFoqmQ041vnAYuqQ=";
+  };
+
+  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..397fcaa3dd0d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-snappy/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPyPy
+, snappy
+, cffi
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "python-snappy";
+  version = "0.6.1";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-tqEHqwYgasxTWdTFYyvZsi1EhwKnmzFpsMYuD7gIuyo=";
+  };
+
+  buildInputs = [ snappy ];
+
+  propagatedBuildInputs = lib.optional isPyPy cffi;
+
+  checkPhase = ''
+    runHook preCheck
+    ${python.interpreter} -m unittest discover
+    runHook postCheck
+  '';
+
+  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; [ costrouc ];
+  };
+}
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..a6b2bc0d247a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-socketio/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, aiohttp
+, bidict
+, buildPythonPackage
+, fetchFromGitHub
+, mock
+, msgpack
+, pytestCheckHook
+, python-engineio
+, pythonOlder
+, requests
+, websocket-client
+}:
+
+buildPythonPackage rec {
+  pname = "python-socketio";
+  version = "5.7.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "miguelgrinberg";
+    repo = "python-socketio";
+    rev = "v${version}";
+    sha256 = "sha256-KVaBSBWLeFJYiNJYTwoExExUmUaeNJ40c/WTgTc2Y/w=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    bidict
+    python-engineio
+    requests
+    websocket-client
+  ];
+
+  checkInputs = [
+    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/";
+    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..5254a6cbab25
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-socks/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, async-timeout
+, buildPythonPackage
+, curio
+, fetchFromGitHub
+, flask
+, pytest-asyncio
+, pytest-trio
+, pythonOlder
+, pytestCheckHook
+, trio
+, yarl
+}:
+
+buildPythonPackage rec {
+  pname = "python-socks";
+  version = "2.0.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6.1";
+
+  src = fetchFromGitHub {
+    owner = "romis2012";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-tVoBon9HF9MTOK+dN9g58fQO706ElNlCeULx//7hPWA=";
+  };
+
+  propagatedBuildInputs = [
+    trio
+    curio
+    async-timeout
+  ];
+
+  checkInputs = [
+    flask
+    pytest-asyncio
+    pytest-trio
+    pytestCheckHook
+    yarl
+  ];
+
+  pythonImportsCheck = [
+    "python_socks"
+  ];
+
+  meta = with lib; {
+    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..1fff6a55c92b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-songpal/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, poetry-core
+, aiohttp
+, async-upnp-client
+, attrs
+, click
+, importlib-metadata
+}:
+
+buildPythonPackage rec {
+  pname = "python-songpal";
+  version = "0.15";
+
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "rytilahti";
+    repo = "python-songpal";
+    rev = "refs/tags/${version}";
+    hash = "sha256-NoO3cgviFbXosEnx46nXdW02jYOfRPHUdc1VeCvwBsQ=";
+  };
+
+  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";
+    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..91012839d053
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-sql/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "python-sql";
+  version = "1.4.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-b+dkCC9IiR2Ffqfm+kJfpU8TUx3fa4nyTAmOZGrRtLY=";
+  };
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "sql"
+  ];
+
+  meta = with lib; {
+    description = "Library to write SQL queries in a pythonic way";
+    homepage = "https://pypi.org/project/python-sql/";
+    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..bb809674e830
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-stdnum/default.nix
@@ -0,0 +1,23 @@
+{ lib, fetchPypi, buildPythonPackage, nose }:
+
+buildPythonPackage rec {
+  version = "1.17";
+  pname = "python-stdnum";
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "374e2b5e13912ccdbf50b0b23fca2c3e0531174805c32d74e145f37756328340";
+  };
+
+  checkInputs = [ nose ];
+
+  checkPhase = ''
+    nosetests
+  '';
+
+  meta = {
+    homepage = "https://arthurdejong.org/python-stdnum/";
+    description = "Python module to handle standardized numbers and codes";
+    maintainers = with lib.maintainers; [ johbo ];
+    license = lib.licenses.lgpl2Plus;
+  };
+}
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..1185959f0c6f
--- /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;
+    sha256 = "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..7c672d5d8307
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-swiftclient/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonApplication
+, fetchPypi
+, installShellFiles
+, mock
+, openstacksdk
+, pbr
+, python-keystoneclient
+, pythonOlder
+, stestr
+}:
+
+buildPythonApplication rec {
+  pname = "python-swiftclient";
+  version = "4.0.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-O2jHNpnF+8OKzXtvEUPWmSOz+vcQ82XZd6QQS9kni/8=";
+  };
+
+  nativeBuildInputs = [
+    installShellFiles
+  ];
+
+  propagatedBuildInputs = [
+    pbr
+    python-keystoneclient
+  ];
+
+  checkInputs = [
+    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..7172b0574fdb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-tado/default.nix
@@ -0,0 +1,26 @@
+{ buildPythonPackage, fetchFromGitHub, lib, pytestCheckHook, pythonOlder, requests }:
+
+buildPythonPackage rec {
+  pname = "python-tado";
+  version = "0.12.0";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "wmalgadey";
+    repo = "PyTado";
+    rev = version;
+    sha256 = "sha256-n+H6H2ORLizv9cn1P5Cd8wHDWMNonPrs+x+XMQbEzZQ=";
+  };
+
+  propagatedBuildInputs = [ requests ];
+  checkInputs = [ 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-telegram-bot/default.nix b/nixpkgs/pkgs/development/python-modules/python-telegram-bot/default.nix
new file mode 100644
index 000000000000..8b3a6ba091cc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-telegram-bot/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, APScheduler
+, buildPythonPackage
+, cachetools
+, certifi
+, decorator
+, fetchPypi
+, future
+, tornado
+, urllib3
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "python-telegram-bot";
+  version = "13.13";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-QpbYGji35e8fl5VlESjlj7NUZ4uNxNuTyhZsloKMV7I=";
+  };
+
+  propagatedBuildInputs = [
+    APScheduler
+    cachetools
+    certifi
+    decorator
+    future
+    tornado
+    urllib3
+  ];
+
+  # --with-upstream-urllib3 is not working properly
+  postPatch = ''
+    rm -r telegram/vendor
+
+    substituteInPlace requirements.txt \
+      --replace "APScheduler==3.6.3" "APScheduler" \
+      --replace "cachetools==4.2.2" "cachetools"
+  '';
+
+  setupPyGlobalFlags = "--with-upstream-urllib3";
+
+  # tests not included with release
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "telegram"
+  ];
+
+  meta = with lib; {
+    description = "Python library to interface with the Telegram Bot API";
+    homepage = "https://python-telegram-bot.org";
+    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..0809a739be4f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-telegram/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, stdenv
+, fetchpatch
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, setuptools
+, tdlib
+}:
+
+buildPythonPackage rec {
+  pname = "python-telegram";
+  version = "0.15.0";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-Na2NIiVgYexKbEqjN58hfkgxwFdCTL7Z7D3WEhL4wXA=";
+  };
+
+  patches = [
+    # Search for the system library first, and fallback to the embedded one if the system was not found
+    (fetchpatch {
+      url = "https://github.com/alexander-akhmetov/python-telegram/commit/b0af0985910ebb8940cff1b92961387aad683287.patch";
+      sha256 = "sha256-ZqsntaiC2y9l034gXDMeD2BLO/RcsbBII8FomZ65/24=";
+    })
+  ];
+
+  postPatch = ''
+    # Remove bundled libtdjson
+    rm -fr telegram/lib
+
+    substituteInPlace telegram/tdjson.py \
+      --replace "ctypes.util.find_library(\"libtdjson\")" \
+                "\"${tdlib}/lib/libtdjson${stdenv.hostPlatform.extensions.sharedLibrary}\""
+  '';
+
+  propagatedBuildInputs = [
+    setuptools
+  ];
+
+  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..a310736c7492
--- /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";
+  };
+
+  checkInputs = [
+    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..b2f58f99f644
--- /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;
+    sha256 = "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..30f6ab9a0a71
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-twitch-client/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, requests
+, responses
+}:
+
+buildPythonPackage rec {
+  pname = "python-twitch-client";
+  version = "0.7.1";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "tsifrer";
+    repo = pname;
+    rev = version;
+    sha256 = "10wwkam3dw0nqr3v9xzigx1zjlrnrhzr7jvihddvzi84vjb6j443";
+  };
+
+  propagatedBuildInputs = [ requests ];
+
+  checkInputs = [
+    pytestCheckHook
+    responses
+  ];
+
+  pythonImportsCheck = [ "twitch" ];
+
+  meta = with lib; {
+    description = "Python wrapper for the Twitch API";
+    homepage = "https://github.com/tsifrer/python-twitch-client";
+    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..79d262a8b02a
--- /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
+  ];
+
+  checkInputs = [
+    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-uinput/default.nix b/nixpkgs/pkgs/development/python-modules/python-uinput/default.nix
new file mode 100644
index 000000000000..efb1288943af
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-uinput/default.nix
@@ -0,0 +1,23 @@
+{ 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";
+
+  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-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..3fb825df95bc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-utils/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, loguru
+, pytestCheckHook
+, six
+, pytest-mypy
+}:
+
+buildPythonPackage rec {
+  pname = "python-utils";
+  version = "3.3.3";
+
+  src = fetchFromGitHub {
+    owner = "WoLpH";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-U6yamXbG8CUrNnFmGTBpHUelZSgoaNyB2CdUSH9WdMA=";
+  };
+
+  # disable coverage and linting
+  postPatch = ''
+    sed -i '/--cov/d' pytest.ini
+    sed -i '/--flake8/d' pytest.ini
+  '';
+
+  propagatedBuildInputs = [
+    loguru
+    six
+  ];
+
+  checkInputs = [
+    pytest-mypy
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "_python_utils_tests"
+  ];
+
+  meta = with lib; {
+    description = "Module with some convenient utilities";
+    homepage = "https://github.com/WoLpH/python-utils";
+    license = licenses.bsd3;
+  };
+}
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..9984931e3a98
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-vagrant/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  version = "1.0.0";
+  pname = "python-vagrant";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-qP6TzPL/N+zJXsL0nqdKkabOc6TbShapjdJtOXz9CeU=";
+  };
+
+  # 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..c83ff853f1d5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-velbus/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pyserial
+}:
+
+buildPythonPackage rec {
+  pname = "python-velbus";
+  version = "2.1.4";
+
+  src = fetchFromGitHub {
+    owner = "thomasdelaet";
+    repo = pname;
+    rev = version;
+    sha256 = "1z0a7fc9xfrcpwi9xiimxsgbzbp2iwyi1rij6vqd5z47mzi49fv9";
+  };
+
+  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..c3d51ae59119
--- /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";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d5013d306e5891ecfe523c9ef52d074fe8b6ca29ee259c0deeb8a83ae9884ce0";
+  };
+
+  propagatedBuildInputs = [
+    oath
+    pycryptodome
+    requests
+  ];
+
+  checkInputs = [ 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..de14a4010b65
--- /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.16120";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-kvmP7giPcr1tBjs7MxLQvSmzfnrWXd6zpzAzIDAMKAc=";
+  };
+
+  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..dafbdfba4b4b
--- /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;
+    sha256 = "sha256-3TNtNRfqzip2iUBtt7uWraPF50MnQjFRru4+ZCJfYiA=";
+  };
+
+  propagatedBuildInputs = [ future ];
+
+  checkInputs = [
+    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..463ccb25b7dc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-xmp-toolkit/default.nix
@@ -0,0 +1,47 @@
+{ buildPythonPackage
+, exempi
+, fetchFromGitHub
+, mock
+, pythonOlder
+, 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 ];
+
+  checkInputs = lib.optionals (pythonOlder "3.3") [ mock ];
+
+  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;
+
+  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-zbar/default.nix b/nixpkgs/pkgs/development/python-modules/python-zbar/default.nix
new file mode 100644
index 000000000000..04e89b664c49
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-zbar/default.nix
@@ -0,0 +1,42 @@
+{ 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;
+    sha256 = "sha256-FvV7TMc4JbOiRjWLka0IhtpGGqGm5fis7h870OmJw2U=";
+  };
+
+  propagatedBuildInputs = [ pillow ];
+
+  buildInputs = [ zbar ];
+
+  checkInputs = [ 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..ed3d6e6e7fef
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python3-application/default.nix
@@ -0,0 +1,48 @@
+{ stdenv, lib, isPy3k, buildPythonPackage, fetchFromGitHub, fetchpatch, zope_interface, twisted }:
+
+buildPythonPackage rec {
+  pname = "python3-application";
+  version = "3.0.3";
+
+  disabled = !isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "AGProjects";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-oscUI/Ag/UXmAi/LN1pPTdyqQe9aAfeQzhKFxaTmW3A=";
+  };
+
+  patches = [
+    # Apply bugfix commit that is not yet part of a release
+    (fetchpatch {
+      name = "fix-time-import.patch";
+      url = "https://github.com/AGProjects/python3-application/commit/695f7d769e69c84e065872ffb403157d0af282fd.patch";
+      sha256 = "sha256-MGs8uUIFXkPXStOn5oCNNEMVmcKrq8YPl8Xvl3OTOUM=";
+    })
+  ];
+
+  propagatedBuildInputs = [ zope_interface twisted ];
+
+  pythonImportsCheck = [ "application" ];
+
+  meta = with lib; {
+    broken = (stdenv.isLinux && stdenv.isAarch64) || 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 ];
+    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..3c2413ff5943
--- /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;
+    sha256 = "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..cda828113971
--- /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
+    sha256 = "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..dca35089f45f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python3-saml/default.nix
@@ -0,0 +1,34 @@
+{ lib, fetchFromGitHub, buildPythonPackage, isPy3k,
+isodate, lxml, xmlsec, freezegun }:
+
+buildPythonPackage rec {
+  pname = "python3-saml";
+  version = "1.14.0";
+  disabled = !isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "onelogin";
+    repo = "python3-saml";
+    rev = "v${version}";
+    sha256 = "sha256-TAfVXh1fSKhNn/lsi7elq4wFyKCxCtCYUTrnH3ytBTw=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "lxml<4.7.1" "lxml<5"
+  '';
+
+  propagatedBuildInputs = [
+    isodate lxml xmlsec
+  ];
+
+  checkInputs = [ freezegun ];
+  pythonImportsCheck = [ "onelogin.saml2" ];
+
+  meta = with lib; {
+    description = "OneLogin's SAML Python Toolkit for Python 3";
+    homepage = "https://github.com/onelogin/python3-saml";
+    license = licenses.mit;
+    maintainers = with maintainers; [ zhaofengli ];
+  };
+}
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..6a5c6a304f14
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python_fedora/default.nix
@@ -0,0 +1,22 @@
+{ lib, buildPythonPackage, fetchPypi, kitchen, requests, bunch, paver
+, six, munch, urllib3, beautifulsoup4, openidc-client, lockfile }:
+
+buildPythonPackage rec {
+  pname = "python-fedora";
+  version = "1.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "56b9d841a39b4030e388e90c7b77dacd479f1ce5e2ff9b18c3954d97d5709a19";
+  };
+  propagatedBuildInputs = [ kitchen requests bunch paver lockfile
+    six munch urllib3 beautifulsoup4 openidc-client ];
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Python Fedora Module";
+    homepage = "https://github.com/fedora-infra/python-fedora";
+    license = licenses.lgpl2;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python_keyczar/default.nix b/nixpkgs/pkgs/development/python-modules/python_keyczar/default.nix
new file mode 100644
index 000000000000..66cf28a15dde
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python_keyczar/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pyasn1
+, pycrypto
+}:
+
+buildPythonPackage rec {
+  pname = "python-keyczar";
+  version = "0.716";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f9b614112dc8248af3d03b989da4aeca70e747d32fe7e6fce9512945365e3f83";
+  };
+
+  buildInputs = [ pyasn1 pycrypto ];
+
+  meta = with lib; {
+    description = "Toolkit for safe and simple cryptography";
+    homepage    = "https://pypi.python.org/pypi/python-keyczar";
+    license     = licenses.asl20;
+    maintainers = with maintainers; [ lovek323 ];
+    platforms   = platforms.unix;
+  };
+
+}
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..7ce66f221fb2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pythonegardia/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, requests
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pythonegardia";
+  version = "1.0.51";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "jeroenterheerdt";
+    repo = "python-egardia";
+    rev = "v${version}";
+    sha256 = "7HindS++jcV3GRn/SKoTMpVOchOnLojy/TY0HZjtyD8=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  patches = [
+    # Adjust search path, https://github.com/jeroenterheerdt/python-egardia/pull/33
+    (fetchpatch {
+      name = "search-path.patch";
+      url = "https://github.com/jeroenterheerdt/python-egardia/commit/6b7bf5b7b2211e3557e0f438586b9d03b9bae440.patch";
+      sha256 = "wUSfmF0SrKCITQJJsHgkGgPZFouaB/zbVqupK6fARHY=";
+    })
+  ];
+
+  # 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";
+    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..9500a42a916f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pythonfinder/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, pytestCheckHook
+, attrs
+, cached-property
+, click
+, six
+, packaging
+, pytest-cov
+, pytest-timeout
+}:
+
+buildPythonPackage rec {
+  pname = "pythonfinder";
+  version = "1.2.10";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "sarugaku";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-4a648wOh+ASeocevFVh/4Fkq0CEhkFbt+2mWVmb9Bhw=";
+  };
+
+  propagatedBuildInputs = [
+    attrs
+    cached-property
+    click
+    six
+    packaging
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    pytest-cov
+    pytest-timeout
+  ];
+
+  pytestFlagsArray = [ "--no-cov" ];
+
+  # these tests invoke git in a subprocess and
+  # for some reason git can't be found even if included in checkInputs
+  disabledTests = [
+    "test_shims_are_kept"
+    "test_shims_are_removed"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/sarugaku/pythonfinder";
+    description = "Cross Platform Search Tool for Finding Pythons";
+    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..5ccb664a83a7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pythonnet/default.nix
@@ -0,0 +1,102 @@
+{ stdenv
+, lib
+, fetchPypi
+, fetchNuGet
+, buildPythonPackage
+, pytestCheckHook
+, pycparser
+, psutil
+, pkg-config
+, dotnetbuildhelpers
+, clang
+, glib
+, mono
+}:
+
+let
+
+  dotnetPkgs = [
+    (fetchNuGet {
+      pname = "UnmanagedExports";
+      version = "1.2.7";
+      sha256 = "0bfrhpmq556p0swd9ssapw4f2aafmgp930jgf00sy89hzg2bfijf";
+      outputFiles = [ "*" ];
+    })
+    (fetchNuGet {
+      pname = "NUnit";
+      version = "3.12.0";
+      sha256 = "1880j2xwavi8f28vxan3hyvdnph4nlh5sbmh285s4lc9l0b7bdk2";
+      outputFiles = [ "*" ];
+    })
+    (fetchNuGet {
+      pname = "System.ValueTuple";
+      version = "4.5.0";
+      sha256 = "00k8ja51d0f9wrq4vv5z2jhq8hy31kac2rg0rv06prylcybzl8cy";
+      outputFiles = [ "*" ];
+    })
+  ];
+
+in
+
+buildPythonPackage rec {
+  pname = "pythonnet";
+  version = "2.5.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1qzdc6jd7i9j7p6bcihnr98y005gv1358xqdr1plpbpnl6078a5p";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py --replace 'self._install_packages()' '#self._install_packages()'
+  '';
+
+  preConfigure = ''
+    [ -z "''${dontPlacateNuget-}" ] && placate-nuget.sh
+    [ -z "''${dontPlacatePaket-}" ] && placate-paket.sh
+  '';
+
+  nativeBuildInputs = [
+    pycparser
+
+    pkg-config
+    dotnetbuildhelpers
+    clang
+
+    mono
+
+  ] ++ dotnetPkgs;
+
+  buildInputs = [
+    glib
+    mono
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    psutil # needed for memory leak tests
+  ];
+
+  preBuild = ''
+    rm -rf packages
+    mkdir packages
+
+    ${builtins.concatStringsSep "\n" (
+        builtins.map (
+            x: ''ln -s ${x}/lib/dotnet/${x.pname} ./packages/${x.pname}.${x.version}''
+          ) dotnetPkgs)}
+
+    # Setting TERM=xterm fixes an issue with terminfo in mono: System.Exception: Magic number is wrong: 542
+    export TERM=xterm
+  '';
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    description = ".Net and Mono integration for Python";
+    homepage = "https://pythonnet.github.io";
+    license = licenses.mit;
+    # <https://github.com/pythonnet/pythonnet/issues/898>
+    badPlatforms = [ "aarch64-linux" ];
+    maintainers = with maintainers; [ jraygauthier ];
+  };
+}
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..8a9433ec898f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pythonocc-core/default.nix
@@ -0,0 +1,58 @@
+{ lib, stdenv, python, fetchFromGitHub
+, cmake
+, Cocoa
+, fontconfig
+, freetype
+, libGL
+, libGLU
+, libX11
+, libXext
+, libXi
+, libXmu
+, opencascade-occt
+, rapidjson
+, smesh
+, swig
+}:
+
+stdenv.mkDerivation rec {
+  pname = "pythonocc-core";
+  version = "7.5.1";
+
+  src = fetchFromGitHub {
+    owner = "tpaviot";
+    repo = "pythonocc-core";
+    rev = version;
+    sha256 = "1md6x60pnfq0qv4lsnmjv6i96mzdrcpxcgpb316i7wmv9b5ci01s";
+  };
+
+  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 swig ];
+  buildInputs = [
+    python opencascade-occt smesh
+    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"
+
+    "-DSMESH_INCLUDE_PATH=${smesh}/include/smesh"
+    "-DSMESH_LIB_PATH=${smesh}/lib"
+    "-DPYTHONOCC_WRAP_SMESH=TRUE"
+  ];
+
+  meta = with lib; {
+    description = "Python wrapper for the OpenCASCADE 3D modeling kernel";
+    homepage = "https://github.com/tpaviot/pythonocc-core";
+    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..0e09a198ab70
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pythran/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, python
+, buildPythonPackage
+, fetchFromGitHub
+, openmp
+, ply
+, networkx
+, decorator
+, gast
+, six
+, numpy
+, beniget
+, isPy3k
+, substituteAll
+}:
+
+let
+  inherit (python) stdenv;
+
+in buildPythonPackage rec {
+  pname = "pythran";
+  version = "0.11.0";
+
+  src = fetchFromGitHub {
+    owner = "serge-sans-paille";
+    repo = "pythran";
+    rev = version;
+    sha256 = "sha256-F9gUZOTSuiqvfGoN4yQqwUg9mnCeBntw5eHO7ZnjpzI=";
+  };
+
+  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}";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    ply
+    networkx
+    decorator
+    gast
+    six
+    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..8942d44e0ced
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytibber/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, aiohttp
+, async-timeout
+, graphql-subscription-manager
+, python-dateutil
+, pytz
+, pytest-asyncio
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pytibber";
+  version = "0.24.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "Danielhiversen";
+    repo = "pyTibber";
+    rev = version;
+    hash = "sha256-Ib9Rb6RkhUe4WDDHVLgaOYOleSFj7LFys6pW3WgxMQo=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    async-timeout
+    graphql-subscription-manager
+    python-dateutil
+    pytz
+  ];
+
+  checkInputs = [
+    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";
+    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..16f6e4232b30
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytidylib/default.nix
@@ -0,0 +1,34 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, python, 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):'
+  '';
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest discover
+  '';
+
+  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..b64418226d06
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytile/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, aiohttp
+, aresponses
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytest-aiohttp
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pytile";
+  version = "2022.02.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "bachya";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-IGjM9yU/3EjO9sV1ZZUX7RUL/a6CcMPzANhVMTcbZGU=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  checkInputs = [
+    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";
+    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..3bf0ad078c59
--- /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";
+    };
+
+    checkInputs = [ 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/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..0fa38a9a6311
--- /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"
+  ];
+
+  checkInputs = [
+    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/pytoml/default.nix b/nixpkgs/pkgs/development/python-modules/pytoml/default.nix
new file mode 100644
index 000000000000..b13dfd07dadc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytoml/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, python
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "pytoml";
+  version = "0.1.20";
+
+  src = fetchFromGitHub {
+    owner = "avakar";
+    repo = "pytoml";
+    rev = "v${version}";
+    fetchSubmodules = true; # ensure test submodule is available
+    sha256 = "02hjq44zhh6z0fsbm3hvz34sav6fic90sjrw8g1pkdvskzzl46mz";
+  };
+
+  checkInputs = [ pytest ];
+
+  checkPhase = ''
+    ${python.interpreter} test/test.py
+    pytest test
+  '';
+
+
+  meta = with lib; {
+    description = "A TOML parser/writer for Python";
+    homepage    = "https://github.com/avakar/pytoml";
+    license     = licenses.mit;
+    maintainers = with maintainers; [ peterhoeg ];
+  };
+}
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..73c1987fb3c9
--- /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.6";
+
+  src = fetchFromGitHub {
+    owner = "bobfang1992";
+    repo = pname;
+    rev = "v${version}";
+    fetchSubmodules = true;
+    sha256 = "sha256-QyjIJCSgiSKjqMBvCbOlWYx6rBbKIoDvXez2YnYaPUo=";
+  };
+
+  buildInputs = [ pybind11 ];
+
+  checkInputs = [
+    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..8a6e374df0f6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytomorrowio/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, aiohttp
+, pytest-aiohttp
+, pytest-asyncio
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pytomorrowio";
+  version = "0.3.4";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-d4twa9bHaQ9XTHSb8pwJnnJ7tDH6vGpck3/8Y39tRaY=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  checkInputs = [
+    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/pytools/default.nix b/nixpkgs/pkgs/development/python-modules/pytools/default.nix
new file mode 100644
index 000000000000..3e811a39f00c
--- /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 = "2022.1.12";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-TWKHXpoqsqJOOTqai3mUkvGnIb/6hArzgHv9Qocd0fQ=";
+  };
+
+  propagatedBuildInputs = [
+    decorator
+    numpy
+    platformdirs
+  ] ++ lib.optionals (pythonOlder "3.11") [
+    typing-extensions
+  ];
+
+  checkInputs = [
+    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..b775f13fdacd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytorch-lightning/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, isPy27
+, future
+, fsspec
+, packaging
+, pytestCheckHook
+, pytorch
+, pyyaml
+, tensorboard
+, torchmetrics
+, tqdm }:
+
+buildPythonPackage rec {
+  pname = "pytorch-lightning";
+  version = "1.6.5";
+
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "PyTorchLightning";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-CgD5g5nhz2DI4gOQyPl8/Cq6wWHzL0ALgOB5SgUOgaI=";
+  };
+
+  propagatedBuildInputs = [
+    packaging
+    future
+    fsspec
+    pytorch
+    pyyaml
+    tensorboard
+    torchmetrics
+    tqdm
+  ];
+
+  checkInputs = [ 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..1c6b2d61ecb6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytorch-metric-learning/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, isPy27
+, numpy
+, scikit-learn
+, pytestCheckHook
+, pytorch
+, torchvision
+, tqdm
+, faiss
+}:
+
+buildPythonPackage rec {
+  pname   = "pytorch-metric-learning";
+  version = "1.5.1";
+
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "KevinMusgrave";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-d7Ngd4SzGTJXtpgs2Jqb+y1aeMt9YUqIOft5ByDtRsc=";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    pytorch
+    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
+  checkInputs = [
+    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"
+  ];
+
+  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-pfn-extras/default.nix b/nixpkgs/pkgs/development/python-modules/pytorch-pfn-extras/default.nix
new file mode 100644
index 000000000000..2da1536a6f64
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytorch-pfn-extras/default.nix
@@ -0,0 +1,71 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, lib
+, numpy
+, onnx
+, packaging
+, pytestCheckHook
+, pytorch
+, torchvision
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "pytorch-pfn-extras";
+  version = "0.5.8";
+
+  src = fetchFromGitHub {
+    owner = "pfnet";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-ApXDO7VMnExYfh5nfiIaxdbvPjR7dWRAkxh3+0KxWnM=";
+  };
+
+  propagatedBuildInputs = [ numpy packaging pytorch typing-extensions ];
+
+  checkInputs = [ 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"
+
+    # 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/test_handler.py"
+    "tests/pytorch_pfn_extras_tests/test_logic.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"
+  ];
+
+  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/pytorch/bin.nix b/nixpkgs/pkgs/development/python-modules/pytorch/bin.nix
new file mode 100644
index 000000000000..e2427ac22df3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytorch/bin.nix
@@ -0,0 +1,83 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchurl
+, isPy37
+, isPy38
+, isPy39
+, isPy310
+, python
+, addOpenGLRunpath
+, future
+, numpy
+, patchelf
+, pyyaml
+, requests
+, setuptools
+, typing-extensions
+}:
+
+let
+  pyVerNoDot = builtins.replaceStrings [ "." ] [ "" ] python.pythonVersion;
+  srcs = import ./binary-hashes.nix version;
+  unsupported = throw "Unsupported system";
+  version = "1.11.0";
+in buildPythonPackage {
+  inherit version;
+
+  pname = "pytorch";
+  # Don't forget to update pytorch to the same version.
+
+  format = "wheel";
+
+  disabled = !(isPy37 || isPy38 || isPy39 || isPy310);
+
+  src = fetchurl srcs."${stdenv.system}-${pyVerNoDot}" or unsupported;
+
+  nativeBuildInputs = [
+    addOpenGLRunpath
+    patchelf
+  ];
+
+  propagatedBuildInputs = [
+    future
+    numpy
+    pyyaml
+    requests
+    setuptools
+    typing-extensions
+  ];
+
+  postInstall = ''
+    # ONNX conversion
+    rm -rf $out/bin
+  '';
+
+  postFixup = let
+    rpath = lib.makeLibraryPath [ stdenv.cc.cc.lib ];
+  in ''
+    find $out/${python.sitePackages}/torch/lib -type f \( -name '*.so' -or -name '*.so.*' \) | while read lib; do
+      echo "setting rpath for $lib..."
+      patchelf --set-rpath "${rpath}:$out/${python.sitePackages}/torch/lib" "$lib"
+      addOpenGLRunpath "$lib"
+    done
+  '';
+
+  # 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 = "Open source, prototype-to-production deep learning platform";
+    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
+    license = licenses.bsd3;
+    sourceProvenance = with sourceTypes; [ binaryNativeCode ];
+    platforms = platforms.linux ++ platforms.darwin;
+    hydraPlatforms = []; # output size 3.2G on 1.11.0
+    maintainers = with maintainers; [ junjihashimoto ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytorch/binary-hashes.nix b/nixpkgs/pkgs/development/python-modules/pytorch/binary-hashes.nix
new file mode 100644
index 000000000000..945af484a4af
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytorch/binary-hashes.nix
@@ -0,0 +1,66 @@
+# Warning: use the same CUDA version as pytorch-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 {
+  "1.11.0" = {
+    x86_64-linux-37 = {
+      name = "torch-1.11.0-cp37-cp37m-linux_x86_64.whl";
+      url = "https://download.pytorch.org/whl/cu113/torch-1.11.0%2Bcu113-cp37-cp37m-linux_x86_64.whl";
+      hash = "sha256-9WMzRw2uo8lweLN2B+ADXMz3L8XDb9hFRuGkuNmUTys=";
+    };
+    x86_64-linux-38 = {
+      name = "torch-1.11.0-cp38-cp38-linux_x86_64.whl";
+      url = "https://download.pytorch.org/whl/cu113/torch-1.11.0%2Bcu113-cp38-cp38-linux_x86_64.whl";
+      hash = "sha256-tqeZvbbuPZFOXmK920J21KECSMGvTy0hdzjl+e4nSFs=";
+    };
+    x86_64-linux-39 = {
+      name = "torch-1.11.0-cp39-cp39-linux_x86_64.whl";
+      url = "https://download.pytorch.org/whl/cu113/torch-1.11.0%2Bcu113-cp39-cp39-linux_x86_64.whl";
+      hash = "sha256-6RJrCl2VcEvuQKnQ7xy9gtjceGPkY4o3a+9wLf1lk3A=";
+    };
+    x86_64-linux-310 = {
+      name = "torch-1.11.0-cp310-cp310-linux_x86_64.whl";
+      url = "https://download.pytorch.org/whl/cu113/torch-1.11.0%2Bcu113-cp310-cp310-linux_x86_64.whl";
+      hash = "sha256-powzZXpUYTHrm8ROKpjS+nBKr66GFGCwUbgoE4Usy0Q=";
+    };
+    x86_64-darwin-37 = {
+      name = "torch-1.11.0-cp37-none-macosx_10_9_x86_64.whl";
+      url = "https://download.pytorch.org/whl/cpu/torch-1.11.0-cp37-none-macosx_10_9_x86_64.whl";
+      hash = "sha256-aGCx0b8LsLZ6a9R/haDkyCW1GO6hO11hAZmdu8vVvAw=";
+    };
+    x86_64-darwin-38 = {
+      name = "torch-1.11.0-cp38-none-macosx_10_9_x86_64.whl";
+      url = "https://download.pytorch.org/whl/cpu/torch-1.11.0-cp38-none-macosx_10_9_x86_64.whl";
+      hash = "sha256-DMyFzQYiej7fgJ4seV/Vdiw9Too4tcn3RMbnz4QTYbs=";
+    };
+    x86_64-darwin-39 = {
+      name = "torch-1.11.0-cp39-none-macosx_10_9_x86_64.whl";
+      url = "https://download.pytorch.org/whl/cpu/torch-1.11.0-cp39-none-macosx_10_9_x86_64.whl";
+      hash = "sha256-UP2b+FxXjIccKPHLCs6d/GAkQBx/OZsXT7DzcImfRFQ=";
+    };
+    x86_64-darwin-310 = {
+      name = "torch-1.11.0-cp310-none-macosx_10_9_x86_64.whl";
+      url = "https://download.pytorch.org/whl/cpu/torch-1.11.0-cp39-none-macosx_10_9_x86_64.whl";
+      hash = "sha256-UP2b+FxXjIccKPHLCs6d/GAkQBx/OZsXT7DzcImfRFQ=";
+    };
+    aarch64-darwin-38 = {
+      name = "torch-1.11.0-cp38-none-macosx_11_0_arm64.whl";
+      url = "https://download.pytorch.org/whl/cpu/torch-1.11.0-cp38-none-macosx_11_0_arm64.whl";
+      hash = "sha256-wVVOSddPGyw+cgLXcFa6LddGVDdYW6xkBitYD3FKROk=";
+    };
+    aarch64-darwin-39 = {
+      name = "torch-1.11.0-cp39-none-macosx_11_0_arm64.whl";
+      url = "https://download.pytorch.org/whl/cpu/torch-1.11.0-cp39-none-macosx_11_0_arm64.whl";
+      hash = "sha256-DkivZq11Xw+cXyZkAopBT1fEnWrcN+d+Bv4ABNpO22E=";
+    };
+    aarch64-darwin-310 = {
+      name = "torch-1.11.0-cp310-none-macosx_11_0_arm64.whl";
+      url = "https://download.pytorch.org/whl/cpu/torch-1.11.0-cp39-none-macosx_11_0_arm64.whl";
+      hash = "sha256-DkivZq11Xw+cXyZkAopBT1fEnWrcN+d+Bv4ABNpO22E=";
+    };
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytorch/breakpad-sigstksz.patch b/nixpkgs/pkgs/development/python-modules/pytorch/breakpad-sigstksz.patch
new file mode 100644
index 000000000000..33a2304cb9b1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytorch/breakpad-sigstksz.patch
@@ -0,0 +1,13 @@
+diff --git a/third_party/breakpad/src/client/linux/handler/exception_handler.cc b/third_party/breakpad/src/client/linux/handler/exception_handler.cc
+index ca353c4099..499be0a986 100644
+--- a/third_party/breakpad/src/client/linux/handler/exception_handler.cc
++++ b/third_party/breakpad/src/client/linux/handler/exception_handler.cc
+@@ -138,7 +138,7 @@ void InstallAlternateStackLocked() {
+   // SIGSTKSZ may be too small to prevent the signal handlers from overrunning
+   // the alternative stack. Ensure that the size of the alternative stack is
+   // large enough.
+-  static const unsigned kSigStackSize = std::max(16384, SIGSTKSZ);
++  const unsigned kSigStackSize = std::max<unsigned>(16384, SIGSTKSZ);
+ 
+   // Only set an alternative stack if there isn't already one, or if the current
+   // one is too small.
diff --git a/nixpkgs/pkgs/development/python-modules/pytorch/default.nix b/nixpkgs/pkgs/development/python-modules/pytorch/default.nix
new file mode 100644
index 000000000000..76a835910392
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytorch/default.nix
@@ -0,0 +1,322 @@
+{ stdenv, lib, fetchFromGitHub, fetchpatch, buildPythonPackage, python,
+  cudaSupport ? false, cudaPackages, magma,
+  mklDnnSupport ? true, useSystemNccl ? true,
+  MPISupport ? false, mpi,
+  buildDocs ? false,
+  cudaArchList ? null,
+
+  # Native build inputs
+  cmake, util-linux, linkFarm, symlinkJoin, which, pybind11, removeReferencesTo,
+
+  # Build inputs
+  numactl,
+  CoreServices, libobjc,
+
+  # Propagated build inputs
+  numpy, pyyaml, cffi, click, typing-extensions,
+
+  # Unit tests
+  hypothesis, psutil,
+
+  # 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,
+
+  isPy3k, pythonOlder }:
+
+let
+  inherit (cudaPackages) cudatoolkit cudnn nccl;
+in
+
+# assert that everything needed for cuda is present and that the correct cuda versions are used
+assert !cudaSupport || (let majorIs = lib.versions.major cudatoolkit.version;
+                        in majorIs == "9" || majorIs == "10" || majorIs == "11");
+
+# confirm that cudatoolkits are sync'd across dependencies
+assert !(MPISupport && cudaSupport) || mpi.cudatoolkit == cudatoolkit;
+assert !cudaSupport || magma.cudatoolkit == cudatoolkit;
+
+let
+  setBool = v: if v then "1" else "0";
+  cudatoolkit_joined = symlinkJoin {
+    name = "${cudatoolkit.name}-unsplit";
+    # nccl is here purely for semantic grouping it could be moved to nativeBuildInputs
+    paths = [ cudatoolkit.out cudatoolkit.lib nccl.dev nccl.out ];
+  };
+
+  # Give an explicit list of supported architectures for the build, See:
+  # - pytorch bug report: https://github.com/pytorch/pytorch/issues/23573
+  # - pytorch-1.2.0 build on nixpks: https://github.com/NixOS/nixpkgs/pull/65041
+  #
+  # This list was selected by omitting the TORCH_CUDA_ARCH_LIST parameter,
+  # observing the fallback option (which selected all architectures known
+  # from cudatoolkit_10_0, pytorch-1.2, and python-3.6), and doing a binary
+  # searching to find offending architectures.
+  #
+  # NOTE: Because of sandboxing, this derivation can't auto-detect the hardware's
+  # cuda architecture, so there is also now a problem around new architectures
+  # not being supported until explicitly added to this derivation.
+  #
+  # FIXME: CMake is throwing the following warning on python-1.2:
+  #
+  # ```
+  # CMake Warning at cmake/public/utils.cmake:172 (message):
+  #   In the future we will require one to explicitly pass TORCH_CUDA_ARCH_LIST
+  #   to cmake instead of implicitly setting it as an env variable.  This will
+  #   become a FATAL_ERROR in future version of pytorch.
+  # ```
+  # If this is causing problems for your build, this derivation may have to strip
+  # away the standard `buildPythonPackage` and use the
+  # [*Adjust Build Options*](https://github.com/pytorch/pytorch/tree/v1.2.0#adjust-build-options-optional)
+  # instructions. This will also add more flexibility around configurations
+  # (allowing FBGEMM to be built in pytorch-1.1), and may future proof this
+  # derivation.
+  brokenArchs = [ "3.0" ]; # this variable is only used as documentation.
+
+  cudaCapabilities = rec {
+    cuda9 = [
+      "3.5"
+      "5.0"
+      "5.2"
+      "6.0"
+      "6.1"
+      "7.0"
+      "7.0+PTX"  # I am getting a "undefined architecture compute_75" on cuda 9
+                 # which leads me to believe this is the final cuda-9-compatible architecture.
+    ];
+
+    cuda10 = cuda9 ++ [
+      "7.5"
+      "7.5+PTX"  # < most recent architecture as of cudatoolkit_10_0 and pytorch-1.2.0
+    ];
+
+    cuda11 = cuda10 ++ [
+      "8.0"
+      "8.0+PTX"  # < CUDA toolkit 11.0
+      "8.6"
+      "8.6+PTX"  # < CUDA toolkit 11.1
+    ];
+  };
+  final_cudaArchList =
+    if !cudaSupport || cudaArchList != null
+    then cudaArchList
+    else cudaCapabilities."cuda${lib.versions.major cudatoolkit.version}";
+
+  # Normally libcuda.so.1 is provided at runtime by nvidia-x11 via
+  # LD_LIBRARY_PATH=/run/opengl-driver/lib.  We only use the stub
+  # libcuda.so from cudatoolkit for running tests, so that we don’t have
+  # to recompile pytorch on every update to nvidia-x11 or the kernel.
+  cudaStub = linkFarm "cuda-stub" [{
+    name = "libcuda.so.1";
+    path = "${cudatoolkit}/lib/stubs/libcuda.so";
+  }];
+  cudaStubEnv = lib.optionalString cudaSupport
+    "LD_LIBRARY_PATH=${cudaStub}\${LD_LIBRARY_PATH:+:}$LD_LIBRARY_PATH ";
+
+in buildPythonPackage rec {
+  pname = "pytorch";
+  # Don't forget to update pytorch-bin to the same version.
+  version = "1.11.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7.0";
+
+  outputs = [
+    "out"   # output standard python package
+    "dev"   # output libtorch headers
+    "lib"   # output libtorch libraries
+  ];
+
+  src = fetchFromGitHub {
+    owner  = "pytorch";
+    repo   = "pytorch";
+    rev    = "v${version}";
+    fetchSubmodules = true;
+    sha256 = "sha256-CEu63tdRBAF8CTchO3Qu8gUNObQylX6U08yDTI4/c/0=";
+  };
+
+  patches = [
+    # Fix for a breakpad incompatibility with glibc>2.33
+    # https://github.com/pytorch/pytorch/issues/70297
+    # https://github.com/google/breakpad/commit/605c51ed96ad44b34c457bbca320e74e194c317e
+    ./breakpad-sigstksz.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
+  ];
+
+  preConfigure = lib.optionalString cudaSupport ''
+    export TORCH_CUDA_ARCH_LIST="${lib.strings.concatStringsSep ";" final_cudaArchList}"
+    export CC=${cudatoolkit.cc}/bin/gcc CXX=${cudatoolkit.cc}/bin/g++
+  '' + lib.optionalString (cudaSupport && cudnn != null) ''
+    export CUDNN_INCLUDE_DIR=${cudnn}/include
+  '';
+
+  # Use pytorch's custom configurations
+  dontUseCmakeConfigure = true;
+
+  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_BIND11 = true;
+
+  preBuild = ''
+    export MAX_JOBS=$NIX_BUILD_CORES
+    ${python.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_SYSTEM_NCCL=setBool useSystemNccl;                  # don't build pytorch's third_party NCCL
+
+  # 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
+  NIX_CFLAGS_COMPILE = lib.optionals (blas.implementation == "mkl") [ "-Wno-error=array-bounds" ];
+
+  nativeBuildInputs = [
+    cmake
+    util-linux
+    which
+    ninja
+    pybind11
+    removeReferencesTo
+  ] ++ lib.optionals cudaSupport [ cudatoolkit_joined ];
+
+  buildInputs = [ blas blas.provider pybind11 ]
+    ++ lib.optionals cudaSupport [ cudnn magma nccl ]
+    ++ lib.optionals stdenv.isLinux [ numactl ]
+    ++ lib.optionals stdenv.isDarwin [ CoreServices libobjc ];
+
+  propagatedBuildInputs = [
+    cffi
+    click
+    numpy
+    pyyaml
+    typing-extensions
+    # the following are required for tensorboard support
+    pillow six future tensorboard protobuf
+  ] ++ lib.optionals MPISupport [ mpi ];
+
+  checkInputs = [ hypothesis ninja psutil ];
+
+  # Tests take a long time and may be flaky, so just sanity-check imports
+  doCheck = false;
+  pythonImportsCheck = [
+    "torch"
+  ];
+
+  checkPhase = with lib.versions; with lib.strings; concatStringsSep " " [
+    cudaStubEnv
+    "${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")
+    ])
+  ];
+  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
+  '';
+
+  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;
+    cudaArchList = final_cudaArchList;
+    # 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;
+  };
+
+  meta = with lib; {
+    description = "Open source, prototype-to-production deep learning platform";
+    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) darwin;
+    broken = stdenv.isLinux && stdenv.isAarch64;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytorch/prefetch.sh b/nixpkgs/pkgs/development/python-modules/pytorch/prefetch.sh
new file mode 100755
index 000000000000..31aae438dc56
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytorch/prefetch.sh
@@ -0,0 +1,46 @@
+#!/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/cu113"
+darwin_bucket="https://download.pytorch.org/whl/cpu"
+
+url_and_key_list=(
+  "x86_64-linux-37 $linux_bucket/torch-${version}%2Bcu113-cp37-cp37m-linux_x86_64.whl torch-${version}-cp37-cp37m-linux_x86_64.whl"
+  "x86_64-linux-38 $linux_bucket/torch-${version}%2Bcu113-cp38-cp38-linux_x86_64.whl torch-${version}-cp38-cp38-linux_x86_64.whl"
+  "x86_64-linux-39 $linux_bucket/torch-${version}%2Bcu113-cp39-cp39-linux_x86_64.whl torch-${version}-cp39-cp39-linux_x86_64.whl"
+  "x86_64-linux-310 $linux_bucket/torch-${version}%2Bcu113-cp310-cp310-linux_x86_64.whl torch-${version}-cp310-cp310-linux_x86_64.whl"
+  "x86_64-darwin-37 $darwin_bucket/torch-${version}-cp37-none-macosx_10_9_x86_64.whl torch-${version}-cp37-none-macosx_10_9_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"
+  "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"
+)
+
+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/pytorch/pthreadpool-disable-gcd.diff b/nixpkgs/pkgs/development/python-modules/pytorch/pthreadpool-disable-gcd.diff
new file mode 100644
index 000000000000..eddd45723f8b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytorch/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/pytraccar/default.nix b/nixpkgs/pkgs/development/python-modules/pytraccar/default.nix
new file mode 100644
index 000000000000..b50d734d01a1
--- /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;
+    sha256 = "sha256-ngyLe6sbTTQ7n4WdV06OlQnn/vqkD+JUruyMYS1Ym+Q=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    pydantic
+  ];
+
+  checkInputs = [
+    aresponses
+    pytestCheckHook
+    pytest-asyncio
+  ];
+
+  pytestFlagsArray = [
+    "--asyncio-mode=legacy"
+  ];
+
+  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..f5cbce6bcc0b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytradfri/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, aiocoap
+, dtlssocket
+, pydantic
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pytradfri";
+  version = "11.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "home-assistant-libs";
+    repo = "pytradfri";
+    rev = "refs/tags/${version}";
+    hash = "sha256-+OOmoh2HLKiHAqOIH2aB4CZcW/ND/0bszgkcdRMYBlc=";
+  };
+
+  propagatedBuildInputs = [
+    pydantic
+  ];
+
+  passthru.optional-dependencies = {
+    async = [
+      aiocoap
+      dtlssocket
+    ];
+  };
+
+  checkInputs = [
+    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";
+    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..660a6a70bfc5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytrafikverket/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, aiohttp
+, async-timeout
+, lxml
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pytrafikverket";
+  version = "0.2.0.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-RsB8b96aCIBM3aABOuuexB5fIo7H1Kq/XsGvV8b7/sA=";
+  };
+
+  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";
+    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..9156db165f41
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytrends/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, requests
+, lxml
+, pandas
+}:
+
+buildPythonPackage rec {
+  pname = "pytrends";
+  version = "4.8.0";
+  disabled = isPy27; # python2 pandas is too old
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-BLezPrbfwSCqictGQGiKi2MzNydrbdzqRP8Mf2tiQ9I=";
+  };
+
+  propagatedBuildInputs = [ requests lxml pandas ];
+
+  doCheck = false;
+  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/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..c9ee34c05c69
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytube/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pytube";
+  version = "12.1.0";
+
+  disabled = pythonOlder "3.6";
+
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "pytube";
+    repo = "pytube";
+    rev = "v${version}";
+    hash = "sha256-o4kfZLkEs+XYor2sS2lfuDZkPfHrB+rDoxroc4f55gc=";
+  };
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  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..6207b992c7d1
--- /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.6.7";
+  format = "setuptools";
+
+  src = fetchPypi {
+    pname = "PyTurboJPEG";
+    inherit version;
+    hash = "sha256-e++Dl7khHWLXo+G9Gd8RQiF458OtYn+X7JU6HF6WzYA=";
+  };
+
+  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..d0ba9803063b
--- /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.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-hTMoLPcLMd6KBJnhz0IJMLABPHhxGIcrLsiZOCeS4uY=";
+  };
+
+  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..eccf8399ee29
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytz-deprecation-shim/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonAtLeast
+, pythonOlder
+, backports-zoneinfo
+, python-dateutil
+, 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";
+  };
+
+  propagatedBuildInputs = (lib.optionals (pythonAtLeast "3.6" && pythonOlder "3.9") [
+    backports-zoneinfo
+  ]) ++ (lib.optionals (pythonOlder "3.6") [
+    python-dateutil
+  ]) ++ (lib.optionals (pythonAtLeast "3.6") [
+    tzdata
+  ]);
+
+  checkInputs = [
+    hypothesis
+    pytestCheckHook
+    pytz
+  ];
+
+  # https://github.com/pganssle/pytz-deprecation-shim/issues/27
+  doCheck = pythonAtLeast "3.9";
+
+  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..27b18845804f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytz/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildPythonPackage, fetchPypi, python }:
+
+buildPythonPackage rec {
+  pname = "pytz";
+  version = "2022.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-HnYOL+aoFjvAs9mhnE+ENCr6Cir/6/qoSwG5eKAuyqc=";
+  };
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest discover -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..cf7b3eb2aeb0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyu2f/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, six
+, mock
+, pyfakefs
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pyu2f";
+  version = "0.1.5a";
+
+  src = fetchFromGitHub {
+    owner = "google";
+    repo = pname;
+    rev = version;
+    sha256 = "0mx7bn1p3n0fxyxa82wg3c719hby7vqkxv57fhf7zvhlg2zfnr0v";
+  };
+
+  propagatedBuildInputs = [ six ];
+
+  checkInputs = [ mock pyfakefs pytestCheckHook ];
+
+  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..c3823a6c3c09
--- /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;
+    sha256 = "0fmbmdnnh679zkllv5m6pkrasg7m9vjwabqnmz5m7flrgdh6h4qa";
+  };
+
+  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/pyudev/default.nix b/nixpkgs/pkgs/development/python-modules/pyudev/default.nix
new file mode 100644
index 000000000000..24784afc842d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyudev/default.nix
@@ -0,0 +1,35 @@
+{ lib, fetchPypi, buildPythonPackage
+, six, udev, pytest, mock, hypothesis, docutils
+}:
+
+buildPythonPackage rec {
+  pname = "pyudev";
+  version = "0.23.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-Mq41hbMgpRvCg+CgQAD9iiVZnttEVB4vUDT2r+5dFcw=";
+  };
+
+  postPatch = ''
+    substituteInPlace src/pyudev/_ctypeslib/utils.py \
+      --replace "find_library(name)" "'${lib.getLib udev}/lib/libudev.so'"
+    '';
+
+  checkInputs = [ pytest mock hypothesis docutils ];
+  propagatedBuildInputs = [ six ];
+
+  checkPhase = ''
+    py.test
+  '';
+
+  # Bunch of failing tests
+  # https://github.com/pyudev/pyudev/issues/187
+  doCheck = false;
+
+  meta = {
+    homepage = "https://pyudev.readthedocs.org/";
+    description = "Pure Python libudev binding";
+    license = lib.licenses.lgpl21Plus;
+  };
+}
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..64fa2d5480ff
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyunifiprotect/default.nix
@@ -0,0 +1,97 @@
+{ lib
+, aiofiles
+, aiohttp
+, aioshutil
+, buildPythonPackage
+, fetchFromGitHub
+, ipython
+, orjson
+, packaging
+, pillow
+, poetry-core
+, pydantic
+, pyjwt
+, pytest-aiohttp
+, pytest-asyncio
+, pytest-benchmark
+, pytest-timeout
+, pytest-xdist
+, pytestCheckHook
+, python-dotenv
+, pythonOlder
+, pytz
+, termcolor
+, typer
+}:
+
+buildPythonPackage rec {
+  pname = "pyunifiprotect";
+  version = "4.1.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "briis";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-ID3KSKPtgslS1Z+BZprMcTSQUnQbiHKgGQQipOSER9g=";
+  };
+
+  propagatedBuildInputs = [
+    aiofiles
+    aiohttp
+    aioshutil
+    orjson
+    packaging
+    pillow
+    pydantic
+    pyjwt
+    pytz
+    typer
+  ];
+
+  passthru.optional-dependencies = {
+    shell = [
+      ipython
+      python-dotenv
+      termcolor
+    ];
+  };
+
+  checkInputs = [
+    pytest-aiohttp
+    pytest-asyncio
+    pytest-benchmark
+    pytest-timeout
+    pytest-xdist
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "--cov=pyunifiprotect --cov-append" ""
+    substituteInPlace setup.cfg \
+      --replace "pydantic!=1.9.1" "pydantic"
+  '';
+
+  pythonImportsCheck = [
+    "pyunifiprotect"
+  ];
+
+  pytestFlagsArray = [
+    "--benchmark-disable"
+  ];
+
+  disabledTests = [
+    # Tests require ffprobe
+    "test_get_camera_video"
+  ];
+
+  meta = with lib; {
+    description = "Library for interacting with the Unifi Protect API";
+    homepage = "https://github.com/briis/pyunifiprotect";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..b8d4fee93c2a
--- /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 = "2.37.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "asottile";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-woHYMzk1xLDfJ14UycPlbaMG8mHeBixqDvs9vO0TKQI=";
+  };
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  propagatedBuildInputs = [
+    tokenize-rt
+  ];
+
+  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..601faccb37f7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyuptimerobot/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, aiohttp
+, aresponses
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pytest-asyncio
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyuptimerobot";
+  version = "22.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "ludeeus";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-QZm8FlUm17Vv80hB3iai54QcVlhSrq2AvbdBaRWDyok=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  checkInputs = [
+    aresponses
+    pytestCheckHook
+    pytest-asyncio
+  ];
+
+  postPatch = ''
+    # Upstream doesn't set version in the repo
+    substituteInPlace setup.py \
+      --replace 'version="main",' 'version="${version}",'
+  '';
+
+  pythonImportsCheck = [
+    "pyuptimerobot"
+  ];
+
+  meta = with lib; {
+    description = "Python API wrapper for Uptime Robot";
+    homepage = "https://github.com/ludeeus/pyuptimerobot";
+    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..9ab48ebf59d4
--- /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=";
+  };
+
+  checkInputs = [ 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..f559afb6a4d4
--- /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.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "8c4d4bf668c559186389bb9bce99e4b1b871c09ba252a756ccaacd2b8f401848";
+  };
+
+  propagatedBuildInputs = [ simplejson ];
+
+  checkInputs = [ 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..2d738b8757b6
--- /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;
+    sha256 = "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 = [ maintainers.costrouc ];
+  };
+}
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..fc5b04417a4f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyuv/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, pythonAtLeast
+, fetchFromGitHub
+, fetchpatch
+, libuv
+}:
+
+buildPythonPackage rec {
+  pname = "pyuv";
+  version = "1.4.0";
+  disabled = pythonAtLeast "3.11";
+
+  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";
+      sha256 = "sha256-J/3ky64Ff+gYpN3ksFLNuZ5xgPbBkyOl4LTY6fiHAgk=";
+    })
+  ];
+
+  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..464e10c33179
--- /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.3.0";
+  pname = "pyvcd";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ec4d9198bd20f9e07d78f6558ff8bcd45b172ee332e7e8a4588727eeb6a362bc";
+  };
+
+  buildInputs = [ setuptools-scm ];
+
+  propagatedBuildInputs = [ six ];
+
+  checkInputs = [ 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/pyvcf/default.nix b/nixpkgs/pkgs/development/python-modules/pyvcf/default.nix
new file mode 100644
index 000000000000..919477298b15
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyvcf/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "PyVCF";
+  version = "0.6.8";
+
+  src = fetchFromGitHub {
+    owner = "jamescasbon";
+    repo = "PyVCF";
+    rev = "476169cd457ba0caa6b998b301a4d91e975251d9";
+    sha256 = "0qf9lwj7r2hjjp4bd4vc7nayrhblfm4qcqs4dbd43a6p4bj2jv5p";
+  };
+
+  checkInputs = [ pytest ];
+
+  meta = with lib; {
+    homepage = "https://pyvcf.readthedocs.io/en/latest/index.html";
+    description = "A VCF (Variant Call Format) Parser for Python, supporting version 4.0 and 4.1";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ scalavision ];
+    longDescription = ''
+      The intent of this module is to mimic the csv module in the Python stdlib,
+      as opposed to more flexible serialization formats like JSON or YAML.
+      vcf will attempt to parse the content of each record based on the data
+      types specified in the meta-information lines
+    '';
+    broken = true; # uses the 2to3 feature, that got removed in setuptools 0.58
+  };
+}
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..9a8ef3043abe
--- /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;
+    sha256 = "sha256-1+xIqOogRUt+blX7AZSKIiU8lpR4AzKIIW/smCSft94=";
+  };
+
+  nativeBuildInputs = [ poetry-core ];
+
+  propagatedBuildInputs = [ requests ];
+
+  checkInputs = [
+    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..115014a25bbb
--- /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"
+  '';
+
+  checkInputs = [
+    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..f462deedd48c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyversasense/default.nix
@@ -0,0 +1,57 @@
+{ 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
+  ];
+
+  checkInputs = [
+    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..19d8fee57ef4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyvesync/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, requests
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyvesync";
+  version = "2.0.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-1Svz/9ZS5ynr88/We1fa+H1IGdC5ljUa4M5O8X+muX4=";
+  };
+
+  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";
+    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..7a8d9f2b40ee
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyvex/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, stdenv
+, archinfo
+, bitstring
+, buildPythonPackage
+, cffi
+, fetchPypi
+, future
+, pycparser
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyvex";
+  version = "9.2.14";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-xKy/+MbJJEYWXalvYhVi/J7IAn1CSrvkeg18vM0fy4k=";
+  };
+
+  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..7d75cf359d18
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyvicare/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pkce
+, pytestCheckHook
+, pythonOlder
+, requests-oauthlib
+, simplejson
+}:
+
+buildPythonPackage rec {
+  pname = "pyvicare";
+  version = "2.16.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "somm15";
+    repo = "PyViCare";
+    rev = version;
+    sha256 = "sha256-RFnQKGISPMrC53yAv3fu7FpbDNugLPQILXCPi5ik2qU=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  propagatedBuildInputs = [
+    requests-oauthlib
+    simplejson
+    pkce
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "version_config=True," 'version="${version}",' \
+      --replace "'setuptools-git-versioning<1.8.0'" ""
+  '';
+
+  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..b9101e9888b3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyvips/default.nix
@@ -0,0 +1,47 @@
+{ stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, glib
+, vips
+, cffi
+, pkgconfig  # from pythonPackages
+, pkg-config  # from pkgs
+, lib }:
+
+buildPythonPackage rec {
+  pname = "pyvips";
+  version = "2.2.1";
+
+  src = fetchFromGitHub {
+    owner = "libvips";
+    repo = "pyvips";
+    rev = "v${version}";
+    sha256 = "sha256-9S7h3bkm+QP78cpemYS7l3c8t+wXsJ5MUAP2T50R/Mc=";
+  };
+
+  nativeBuildInputs = [ pkgconfig pkg-config ];
+
+  buildInputs = [ glib vips ];
+
+  propagatedBuildInputs = [ cffi ];
+
+  checkInputs = [ 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";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ccellado anthonyroussel ];
+  };
+}
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..f13e1bbac798
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyvis/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, fetchFromGitHub
+, fetchpatch
+, buildPythonPackage
+, networkx
+, jinja2
+, ipython
+, jsonpickle
+, numpy
+}:
+
+buildPythonPackage rec {
+  pname = "pyvis";
+  version = "0.2.1";
+
+  src = fetchFromGitHub {
+    owner = "WestHealth";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-cER5XYxnURzRLtrisWBu2kxtOiRqgaRTJYyaCMh2qqE=";
+  };
+
+  patches = [
+    # Fix test: https://github.com/WestHealth/pyvis/issues/138
+    (fetchpatch {
+      url = "https://github.com/WestHealth/pyvis/commit/eaa24b882401e2e74353efa78bf4e71a880cfc47.patch";
+      sha256 = "sha256-hyDypavoCM36SiuQda1U4FLUPdAjTIMtaeZ0KqfHKzI=";
+    })
+  ];
+
+  propagatedBuildInputs = [ networkx jinja2 ipython jsonpickle ];
+
+  checkInputs = [ numpy ];
+
+  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; [ erictapen ];
+  };
+}
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..4b7a179678a3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyvisa-py/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, setuptools-scm
+, pyserial
+, pyusb
+, pyvisa
+, typing-extensions
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pyvisa-py";
+  version = "0.5.3";
+
+  src = fetchFromGitHub {
+    owner = "pyvisa";
+    repo = "pyvisa-py";
+    rev = "refs/tags/${version}";
+    hash = "sha256-37GptqqBSIFOpm6SpS61ZZ9C4iU5AiOduVq255mTRNo=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    pyserial
+    pyusb
+    pyvisa
+    typing-extensions
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  postConfigure = ''
+    export SETUPTOOLS_SCM_PRETEND_VERSION="v${version}"
+  '';
+
+  meta = with lib; {
+    description = "PyVISA backend that implements a large part of the Virtual Instrument Software Architecture in pure Python";
+    homepage = "https://github.com/pyvisa/pyvisa-py";
+    license = licenses.mit;
+    maintainers = with maintainers; [ mvnetbiz ];
+  };
+}
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..3fb0bbd51cec
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyvisa/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, setuptools-scm
+, setuptools
+, typing-extensions
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pyvisa";
+  version = "1.12.0";
+
+  src = fetchFromGitHub {
+    owner = "pyvisa";
+    repo = "pyvisa";
+    rev = "refs/tags/${version}";
+    hash = "sha256-2khTfj0RRna9YDPOs5kQHHhkeMwv3kTtGyDBYnu+Yhw=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    typing-extensions
+    setuptools
+  ];
+
+  checkInputs = [
+    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/pyviz-comms/default.nix b/nixpkgs/pkgs/development/python-modules/pyviz-comms/default.nix
new file mode 100644
index 000000000000..29b4d88fe73b
--- /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.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-uMncveAfOEeEP7TQTDs/TeeEkgxx5Eztnfu1YPbJIhg=";
+  };
+
+  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 = [ maintainers.costrouc ];
+  };
+}
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..807278d967d5
--- /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.59";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1j2zbziklx4az55m3997y7yp4xflk7i0gsbdfh7fp9k0qngb2053";
+  };
+
+  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..8788384e9079
--- /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
+  ];
+
+  checkInputs = [
+    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..a2f475f3b314
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyvmomi/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildPythonPackage, fetchFromGitHub, requests, six }:
+
+buildPythonPackage rec {
+  pname = "pyvmomi";
+  version = "7.0.3";
+
+  src = fetchFromGitHub {
+    owner = "vmware";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "07jwlbi3k5kvpmgygvpkhsnbdp9m2ndwqxk9k6kyzfszwcbdx4bk";
+  };
+
+  # requires old version of vcrpy
+  doCheck = false;
+
+  propagatedBuildInputs = [ requests six ];
+
+  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";
+    license = licenses.asl20;
+  };
+}
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..c04c70ebc60a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyvo/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, astropy
+, pillow
+, pythonOlder
+, pytestCheckHook
+, pytest-astropy
+, requests
+, requests-mock
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "pyvo";
+  version = "1.3";
+
+  disabled = pythonOlder "3.8"; # according to setup.cfg
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "846a54a05a8ddb47a8c2cc3077434779b0e4ccc1b74a7a5408593cb673307d67";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    astropy
+    requests
+  ];
+
+  checkInputs = [
+    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..2fd5a96fa933
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyvoro/default.nix
@@ -0,0 +1,24 @@
+{ 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 = [ maintainers.costrouc ];
+  };
+}
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/pywavelets/default.nix b/nixpkgs/pkgs/development/python-modules/pywavelets/default.nix
new file mode 100644
index 000000000000..a85a59ff4ab6
--- /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.3.0";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-y6qdYgUtna+Np2X8jnwww46iuOnhwYhBkT37SuxnHuU=";
+  };
+
+  checkInputs = [ 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..75e427f3da83
--- /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.14";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-CXJidzwFvS1ewqYyfpJhwQtqh4TtUfhO9O0iYJpOCy0=";
+  };
+
+  nativeBuildInputs = [ pkg-config ];
+  propagatedNativeBuildInputs = [ cffi ];
+  buildInputs = [ wayland ];
+  propagatedBuildInputs = [ cffi ];
+  checkInputs = [ pytestCheckHook ];
+
+  postBuild = ''
+    ${python.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/pywbem/default.nix b/nixpkgs/pkgs/development/python-modules/pywbem/default.nix
new file mode 100644
index 000000000000..0547f3edd938
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pywbem/default.nix
@@ -0,0 +1,47 @@
+{ lib, buildPythonPackage, fetchPypi, libxml2
+, m2crypto, ply, pyyaml, six, pbr, pythonOlder, nocasedict, nocaselist, yamlloader, requests-mock
+, httpretty, lxml, mock, pytest, requests, decorator, unittest2
+, FormEncode, testfixtures, pytz
+}:
+
+buildPythonPackage rec {
+  pname = "pywbem";
+  version = "1.4.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-rYu75Kt+eVciwPJ/JlbJL8Zzp+BqFM0VGlDwMGRU0X4=";
+  };
+
+  propagatedBuildInputs = [
+    mock
+    nocasedict
+    nocaselist
+    pbr
+    ply
+    pyyaml
+    six
+    yamlloader
+  ] ++ lib.optionals (pythonOlder "3.0") [ m2crypto ];
+
+  checkInputs = [
+    decorator
+    FormEncode
+    httpretty
+    libxml2
+    lxml
+    pytest
+    pytz
+    requests
+    requests-mock
+    testfixtures
+    unittest2
+  ];
+
+  meta = with lib; {
+    description = "Support for the WBEM standard for systems management";
+    homepage = "https://pywbem.github.io";
+    license = licenses.lgpl21Plus;
+    maintainers = with maintainers; [ peterhoeg ];
+  };
+}
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..a36f3a2ccfc2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyweatherflowrest/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyweatherflowrest";
+  version = "1.0.8";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "briis";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1swyqdnvhwaigqhjn5a22gi8if4bl8alfrigln4qa0jl9z03kg09";
+  };
+
+  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";
+    license = with 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..c7c60d20f3cd
--- /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;
+    sha256 = "sha256-bDbhZ5JoIZ5pO6lA2yvyVMJAygJmTeECtyaa/DxUVzE=";
+  };
+
+  propagatedBuildInputs = [
+    cryptography
+    http-ece
+    py-vapid
+    requests
+    six
+  ];
+
+  checkInputs = [
+    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..eaf4ae64a653
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pywebview/default.nix
@@ -0,0 +1,77 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, importlib-resources
+, proxy_tools
+, pygobject3
+, pyqtwebengine
+, pytest
+, pythonOlder
+, qt5
+, qtpy
+, six
+, xvfb-run
+}:
+
+buildPythonPackage rec {
+  pname = "pywebview";
+  version = "3.6.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "r0x0r";
+    repo = "pywebview";
+    rev = version;
+    hash = "sha256-qOLK4MHdpmcCazCNfojncD8XH7OJB2H/pIW5XAJAlDo=";
+  };
+
+  nativeBuildInputs = [
+    qt5.wrapQtAppsHook
+  ];
+
+  propagatedBuildInputs = [
+    pyqtwebengine
+    proxy_tools
+    six
+  ] ++ lib.optionals (pythonOlder "3.7") [
+    importlib-resources
+  ];
+
+  checkInputs = [
+    pygobject3
+    pytest
+    qtpy
+    xvfb-run
+  ];
+
+  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..fd54ccf3d974
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pywemo/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, ifaddr
+, lxml
+, poetry-core
+, pytest-vcr
+, pytestCheckHook
+, pythonOlder
+, requests
+, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "pywemo";
+  version = "0.9.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-RgG2bKA7ifuOPX0ZDKv92S4Gpp9zaansKiEpYrYfPt4=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    ifaddr
+    requests
+    urllib3
+    lxml
+  ];
+
+  checkInputs = [
+    pytest-vcr
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pywemo"
+  ];
+
+  meta = with lib; {
+    description = "Python module to discover and control WeMo devices";
+    homepage = "https://github.com/pywemo/pywemo";
+    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..9dbb19738bee
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pywerview/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, beautifulsoup4
+, buildPythonPackage
+, fetchFromGitHub
+, gssapi
+, impacket
+, ldap3
+, lxml
+, pyasn1
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pywerview";
+  version = "0.4.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "the-useless-one";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-nrPhyBHW13dkXFC5YJfrkiztAxMw4KuEif0zCdjQEq0=";
+  };
+
+  propagatedBuildInputs = [
+    beautifulsoup4
+    gssapi
+    impacket
+    ldap3
+    lxml
+    pyasn1
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  postPatch = ''
+    # https://github.com/the-useless-one/pywerview/pull/51
+    substituteInPlace setup.py \
+      --replace "bs4" "beautifulsoup4"
+  '';
+
+  pythonImportsCheck = [
+    "pywerview"
+  ];
+
+  meta = with lib; {
+    description = "Module for PowerSploit's PowerView support";
+    homepage = "https://github.com/the-useless-one/pywerview";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pywick/default.nix b/nixpkgs/pkgs/development/python-modules/pywick/default.nix
new file mode 100644
index 000000000000..0db11576203a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pywick/default.nix
@@ -0,0 +1,48 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytest
+, h5py
+, hickle
+, numpy
+, pandas
+, pillow
+, six
+, pytorch
+, torchvision
+, tqdm
+, lib
+}:
+
+buildPythonPackage rec {
+  pname   = "pywick";
+  version = "0.6.5";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "achaiah";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0wnijdvqgdpzfdsy1cga3bsr0n7zzsl8hp4dskqwxx087g5h1r84";
+  };
+
+  propagatedBuildInputs = [
+    h5py hickle numpy pandas pillow six pytorch torchvision tqdm
+  ];
+
+  checkInputs = [ pytest ];
+
+  checkPhase = ''
+    runHook preCheck
+    pytest tests/
+    runHook postCheck
+  '';
+
+  meta = {
+    description = "High-level training framework for Pytorch";
+    homepage = "https://github.com/achaiah/pywick";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ bcdarwin ];
+  };
+}
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..923e4b9a2809
--- /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;
+    sha256 = "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..0867cfe36f89
--- /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
+  ];
+
+  checkInputs = [
+    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..ccb9beb601f3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pywizlight/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, asyncio-dgram
+, 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}";
+    sha256 = "sha256-IkuAYEg5nuUT6zxmuJe6afp4MVWf0+HAnEoAdOrdTvQ=";
+  };
+
+  propagatedBuildInputs = [
+    asyncio-dgram
+    click
+  ];
+
+  checkInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "--asyncio-mode=legacy"
+  ];
+
+  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..ec9b925982eb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pywlroots/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+, cffi
+, pkg-config
+, libxkbcommon
+, libinput
+, pixman
+, pythonOlder
+, udev
+, wlroots
+, wayland
+, pywayland
+, xkbcommon
+, xorg
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pywlroots";
+  version = "0.15.19";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-Ch8ddN9J8STw3qjAwP9sAta5YBgEg/2wSYgDyWEAXhU=";
+  };
+
+  nativeBuildInputs = [ pkg-config ];
+  propagatedNativeBuildInputs = [ cffi ];
+  buildInputs = [ libinput libxkbcommon pixman xorg.libxcb udev wayland wlroots ];
+  propagatedBuildInputs = [ cffi pywayland xkbcommon ];
+  checkInputs = [ pytestCheckHook ];
+
+  postBuild = ''
+    ${python.interpreter} wlroots/ffi_build.py
+  '';
+
+  pythonImportsCheck = [ "wlroots" ];
+
+  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..9833a29593e8
--- /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.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "e19b5d8445e0c4fc45ded71863aeaaf2680064b4626b0e7c90f72e9ace9f6b5b";
+  };
+
+  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..41b56150d0ef
--- /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=";
+  };
+
+  checkInputs = [
+    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..d46bd718a3ab
--- /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.15";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    pname = "PyX";
+    inherit version;
+    sha256 = "0xs9brmk9fvfmnsvi0haf13xwz994kv9afznzfpg9dkzbq6b1hqg";
+  };
+
+  # No tests in archive
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Python package for the generation of PostScript, PDF, and SVG files";
+    homepage = "http://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..35bfaecda977
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyxattr/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, pkgs
+, fetchPypi
+, buildPythonPackage
+}:
+
+buildPythonPackage rec {
+    pname = "pyxattr";
+    version = "0.7.2";
+
+    src = fetchPypi {
+      inherit pname version;
+      sha256 = "68477027e6d3310669f98aaef15393bfcd9b2823d7a7f00a6f1d91a3c971ae64";
+    };
+
+    # 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;
+    };
+}
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..43cc501d80e5
--- /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 = "0.0.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "mborgerson";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-mHUmSSy/ygteJhRX6AbgZJ+c5MZMZcgNRoTOfxhV+XQ=";
+  };
+
+  checkInputs = [
+    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..0ad5777e6377
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyxdg/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitLab
+}:
+
+buildPythonPackage rec {
+  pname = "pyxdg";
+  version = "0.27";
+
+  src =  fetchFromGitLab {
+    domain = "gitlab.freedesktop.org";
+    owner = "xdg";
+    repo = pname;
+    rev = "rel-${version}";
+    sha256 = "1dg826vrc7ifkk4lnf648h61cqfamaqmngkn9hgmxnf9gqmkbn0k";
+  };
+
+  # Tests failed (errors=4, failures=4) on NixOS
+  doCheck = false;
+
+  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..015d07be09b9
--- /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.1";
+
+  src = fetchFromGitHub {
+    owner = "Danielhiversen";
+    repo = "PyXiaomiGateway";
+    rev = version;
+    sha256 = "sha256-e/FqqUl90VFDJD6ZFbFqXKH3s2sBaDjSFEvaKJhDlGg=";
+  };
+
+  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..8cdfe6436e35
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyxl3/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, unittest2
+, python
+, isPy27
+}:
+
+buildPythonPackage rec {
+  pname = "pyxl3";
+  version = "1.4";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ad4cc56bf4b35def33783e6d4783882702111fe8f9a781c63228e2114067c065";
+  };
+
+  checkInputs = [ unittest2 ];
+
+  checkPhase = ''
+     ${python.interpreter} tests/test_basic.py
+  '';
+
+  # tests require weird codec installation
+  # which is not necessary for major use of package
+  doCheck = false;
+
+  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 = [ maintainers.costrouc ];
+  };
+}
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..a72b46037753
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyxnat/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, nose
+, lxml
+, requests
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "pyxnat";
+  version = "1.4";
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "22524120d744b50d25ef6bfc7052637e4ead9e2afac92563231ec89848f5adf5";
+  };
+
+  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" ""
+  '';
+
+  checkInputs = [ nose ];
+  checkPhase = "nosetests pyxnat/tests";
+  doCheck = false;  # requires a docker container running an XNAT server
+
+  pythonImportsCheck = [ "pyxnat" ];
+
+  meta = with lib; {
+    homepage = "https://pyxnat.github.io/pyxnat";
+    description = "Python API to XNAT";
+    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..f81bbbd7acbf
--- /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
+  ];
+
+  checkInputs = [
+    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/default.nix b/nixpkgs/pkgs/development/python-modules/pyyaml/default.nix
new file mode 100644
index 000000000000..10f78ab5e14b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyyaml/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, cython
+, libyaml
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "pyyaml";
+  version = "6.0";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "yaml";
+    repo = "pyyaml";
+    rev = version;
+    sha256 = "sha256-wcII32mRgRRmAgojntyxBMQkjvxU2jylCgVzlHAj2Xc=";
+  };
+
+  nativeBuildInputs = [ cython ];
+
+  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/pyzbar/default.nix b/nixpkgs/pkgs/development/python-modules/pyzbar/default.nix
new file mode 100644
index 000000000000..dd6a2461274c
--- /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 ];
+
+  checkInputs = [ 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..bc90068e66ea
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyzerproc/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, asynctest
+, bleak
+, click
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-asyncio
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyzerproc";
+  version = "0.4.11";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "emlove";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-FNiq/dbh5PMTxnKCKDSHEvllehAEUYvWZS+OyP3lSW8=";
+  };
+
+  postPatch = ''
+    sed -i "/--cov/d" setup.cfg
+  '';
+
+  propagatedBuildInputs = [
+    bleak
+    click
+  ];
+
+  checkInputs = [
+    pytest-asyncio
+    pytest-mock
+    pytestCheckHook
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    asynctest
+  ];
+
+  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/pyzmq/default.nix b/nixpkgs/pkgs/development/python-modules/pyzmq/default.nix
new file mode 100644
index 000000000000..ea61a50560da
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyzmq/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, py
+, pytestCheckHook
+, python
+, pythonOlder
+, tornado
+, zeromq
+}:
+
+buildPythonPackage rec {
+  pname = "pyzmq";
+  version = "23.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-pR8SqHGarZ3PtV1FYCLxa5CryN3n08qTzjEgtA4/oWk=";
+  };
+
+  buildInputs = [
+    zeromq
+  ];
+
+  propagatedBuildInputs = [
+    py
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    tornado
+  ];
+
+  pythonImportsCheck = [
+    "zmq"
+  ];
+
+  pytestFlagsArray = [
+    "$out/${python.sitePackages}/zmq/tests/" # Folder with tests
+  ];
+
+  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..e0434e8e4dd4
--- /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;
+
+  checkInputs = [ 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/qcelemental/default.nix b/nixpkgs/pkgs/development/python-modules/qcelemental/default.nix
new file mode 100644
index 000000000000..6032a98f7065
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qcelemental/default.nix
@@ -0,0 +1,47 @@
+{ stdenv
+, buildPythonPackage
+, lib
+, fetchPypi
+, networkx
+, numpy
+, pint
+, pydantic
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "qcelemental";
+  version = "0.25.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-v1yu6yBEtgVsheku/8YaIaXrsVgMzcFlWAuySPhYgyQ=";
+  };
+
+  propagatedBuildInputs = [
+    networkx
+    numpy
+    pint
+    pydantic
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "qcelemental"
+  ];
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    description = "Periodic table, physical constants and molecule parsing 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/qcengine/default.nix b/nixpkgs/pkgs/development/python-modules/qcengine/default.nix
new file mode 100644
index 000000000000..af842c6c9559
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qcengine/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, psutil
+, py-cpuinfo
+, pydantic
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, qcelemental
+}:
+
+buildPythonPackage rec {
+  pname = "qcengine";
+  version = "0.24.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-KUOGbGQd1ffXNkQiW8yeUxValCOAfd8nBv9nnk9giVU=";
+  };
+
+  propagatedBuildInputs = [
+    psutil
+    py-cpuinfo
+    pydantic
+    pyyaml
+    qcelemental
+  ];
+
+  checkInputs = [
+    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/qcs-api-client/default.nix b/nixpkgs/pkgs/development/python-modules/qcs-api-client/default.nix
new file mode 100644
index 000000000000..95cd00d8facd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qcs-api-client/default.nix
@@ -0,0 +1,94 @@
+{ lib
+, attrs
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, httpx
+, iso8601
+, poetry-core
+, pydantic
+, pyjwt
+, pytest-asyncio
+, pytestCheckHook
+, python-dateutil
+, pythonOlder
+, respx
+, retrying
+, rfc3339
+, toml
+}:
+
+buildPythonPackage rec {
+  pname = "qcs-api-client";
+  version = "0.21.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "rigetti";
+    repo = "qcs-api-client-python";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-F3Fc03JWS73LcDCufWl/gLkjGvzlwLdBFVsSxtn3LvE=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    attrs
+    httpx
+    iso8601
+    pydantic
+    pyjwt
+    python-dateutil
+    retrying
+    rfc3339
+    toml
+  ];
+
+  checkInputs = [
+    pytest-asyncio
+    pytestCheckHook
+    respx
+  ];
+
+  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=";
+    })
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'attrs = "^20.1.0"' 'attrs = "*"' \
+      --replace 'httpx = "^0.15.0"' 'httpx = "*"' \
+      --replace 'iso8601 = "^0.1.13"' 'iso8601 = "*"' \
+      --replace 'pydantic = "^1.7.2"' 'pydantic = "*"' \
+      --replace 'pyjwt = "^1.7.1"' 'pyjwt = "*"'
+  '';
+
+  disabledTestPaths = [
+    # Test is outdated
+    "tests/test_client/test_additional_properties.py"
+    "tests/test_client/test_auth.py"
+    "tests/test_client/test_client.py"
+    "tests/test_client/test_datetime.py"
+    "tests/test_imports.py"
+  ];
+
+  pythonImportsCheck = [
+    "qcs_api_client"
+  ];
+
+  meta = with lib; {
+    description = "Python library for accessing the Rigetti QCS API";
+    homepage = "https://qcs-api-client-python.readthedocs.io/";
+    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..2d402b076450
--- /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.1";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "QDarkStyle";
+    sha256 = "sha256-YAWE1iU0Pg3dEo3gg5PTw1Y3eGpJgn8XTSmqfKqCecE=";
+  };
+
+  # 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..f818f49fa65d
--- /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.5.post2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-fa960b//HacdoG6C1RR72xrIZlgWF9jwbMTu2kjioUk=";
+  };
+
+  dontUseCmakeConfigure = true;
+  nativeBuildInputs = [ cmake ];
+
+  buildInputs = [ pybind11 ];
+
+  propagatedBuildInputs = [
+    numpy
+    scipy
+  ];
+
+  pythonImportsCheck = [ "qdldl" ];
+  checkInputs = [ 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/qds_sdk/default.nix b/nixpkgs/pkgs/development/python-modules/qds_sdk/default.nix
new file mode 100644
index 000000000000..af5df9c347eb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qds_sdk/default.nix
@@ -0,0 +1,43 @@
+{ lib,
+ fetchFromGitHub,
+ buildPythonPackage,
+ boto,
+ inflection,
+ pytest,
+ mock,
+ requests,
+ six,
+ urllib3 }:
+
+buildPythonPackage rec {
+  pname = "qds_sdk";
+  version = "1.16.1";
+
+  # pypi does not contain tests, using github sources instead
+  src = fetchFromGitHub {
+    owner = "qubole";
+    repo = "qds-sdk-py";
+    rev = "V${version}";
+    sha256 = "05c7g63rcvvi4fgkcfsxh2a6hwlffbs18dhki222s5rpc49wi8zi";
+  };
+
+  propagatedBuildInputs = [
+    boto
+    inflection
+    requests
+    six
+    urllib3
+  ];
+
+  checkInputs = [ pytest mock ];
+  checkPhase = ''
+    py.test --disable-pytest-warnings tests
+  '';
+
+  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 ];
+  };
+}
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..fcceaa3d007f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qiling/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, capstone
+, fetchFromGitHub
+, fetchPypi
+, gevent
+, keystone-engine
+, multiprocess
+, pefile
+, pyelftools
+, pythonOlder
+, python-registry
+, pyyaml
+, unicorn
+}:
+
+buildPythonPackage rec {
+  pname = "qiling";
+  version = "1.4.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-sndRKknfY3LgqUf6FOobwczIStjzZkudVgUR1EQSyeU=";
+  };
+
+  propagatedBuildInputs = [
+    capstone
+    gevent
+    keystone-engine
+    multiprocess
+    pefile
+    pyelftools
+    python-registry
+    pyyaml
+    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/";
+    license = licenses.gpl2Only;
+    maintainers = teams.determinatesystems.members;
+  };
+}
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..431b5c9bfa10
--- /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.9.0";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-p5B1xtDYRDxEIu6WmlQJ5E/QJUVxYEzOqHXGyV4/Veo=";
+  };
+
+  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..8cbc94a87cfc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qingping-ble/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, bluetooth-sensor-state-data
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+, sensor-state-data
+}:
+
+buildPythonPackage rec {
+  pname = "qingping-ble";
+  version = "0.2.3";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "bluetooth-devices";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-+iUZIsaSYgptHXtNSc9sJiBU8CUEFPDsLVGuFR5WvDw=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    bluetooth-sensor-state-data
+    sensor-state-data
+  ];
+
+  checkInputs = [
+    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";
+    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..f7ad8da805a0
--- /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.10.4";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "Qiskit";
+    repo = "qiskit-aer";
+    rev = version;
+    sha256 = "sha256-mf+Pgw/daFkt1bvqSeYzlO/Sd2F2MtwZcLr+h1u+eb0=";
+  };
+
+  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"
+  ];
+
+  checkInputs = [
+    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..45764b4983ef
--- /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.3";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "qiskit";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-1XM4gBuMsvjwU4GSdQJobMyyDFZOOTbwvnUPG0nXFoc=";
+  };
+
+  postPatch = ''
+    substituteInPlace requirements.txt --replace "pandas<1.4.0" "pandas"
+  '';
+
+  propagatedBuildInputs = [
+    fastdtw
+    numpy
+    pandas
+    psutil
+    qiskit-terra
+    qiskit-optimization
+    quandl
+    scikit-learn
+    scipy
+    yfinance
+  ];
+
+  checkInputs = [
+    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..4cad6f0bc5aa
--- /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.19.2";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "Qiskit";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-jfOyQ0wjYsJOAlix/P9dzBPmkv901eETmBYQzIHZqfg=";
+  };
+
+  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
+  checkInputs = [
+    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..0b40fc8fc7e6
--- /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
+  '';
+  checkInputs = [
+    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..c74e6c53bdea
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qiskit-machine-learning/default.nix
@@ -0,0 +1,87 @@
+{ lib
+, pythonOlder
+, pythonAtLeast
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+  # Python Inputs
+, fastdtw
+, numpy
+, psutil
+, qiskit-terra
+, scikit-learn
+, sparse
+  # Optional inputs
+, withTorch ? true
+, pytorch
+  # Check Inputs
+, pytestCheckHook
+, ddt
+, pytest-timeout
+, qiskit-aer
+}:
+
+buildPythonPackage rec {
+  pname = "qiskit-machine-learning";
+  version = "0.4.0";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "qiskit";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-WZSXt+sVeO64wCVbDgBhuGvo5jTn/JKh9oNSO7ZY9wo=";
+  };
+
+  propagatedBuildInputs = [
+    fastdtw
+    numpy
+    psutil
+    qiskit-terra
+    scikit-learn
+    sparse
+  ] ++ lib.optional withTorch pytorch;
+
+  doCheck = false;  # TODO: enable. Tests fail on unstable due to some multithreading issue?
+  checkInputs = [
+    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..7c7510675f13
--- /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
+, retworkx
+, scikit-learn
+, scipy
+, withPyscf ? false
+, pyscf
+  # Check Inputs
+, pytestCheckHook
+, ddt
+, pylatexenc
+, qiskit-aer
+}:
+
+buildPythonPackage rec {
+  pname = "qiskit-nature";
+  version = "0.4.3";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "Qiskit";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-trThxcft6AOxalOglOKPwrJ23Bqt/FmMCAucKmNmB7c=";
+  };
+
+  propagatedBuildInputs = [
+    h5py
+    numpy
+    psutil
+    qiskit-terra
+    retworkx
+    scikit-learn
+    scipy
+  ] ++ lib.optional withPyscf pyscf;
+
+  checkInputs = [
+    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..9a98cf29576b
--- /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.4.0";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "qiskit";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-7MksgbCID4x1qW06BCBzcbiS/eNHjZiDKIvKYTPx6cc=";
+  };
+
+  postPatch = ''
+    substituteInPlace requirements.txt --replace "networkx>=2.2,<2.6" "networkx"
+  '';
+
+  propagatedBuildInputs = [
+    docplex
+    decorator
+    networkx
+    numpy
+    qiskit-terra
+    scipy
+  ];
+
+  checkInputs = [
+    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..71486b30bc8e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qiskit-terra/default.nix
@@ -0,0 +1,207 @@
+{ stdenv
+, lib
+, pythonOlder
+, buildPythonPackage
+, fetchFromGitHub
+, rustPlatform
+  # Python requirements
+, dill
+, numpy
+, networkx
+, ply
+, psutil
+, python-constraint
+, python-dateutil
+, retworkx
+, 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.21.0";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "qiskit";
+    repo = pname;
+    rev = version;
+    hash = "sha256-imktzBpgP+lq6FsVWIUK82+t76gKTgt53kPfKOnsseQ=";
+  };
+
+  nativeBuildInputs = [ setuptools-rust ] ++ (with rustPlatform; [ rust.rustc rust.cargo cargoSetupHook ]);
+
+  cargoDeps = rustPlatform.fetchCargoTarball {
+    inherit src;
+    name = "${pname}-${version}";
+    hash = "sha256-SXC0UqWjWqLlZvKCRBylSX73r4Vale130KzS0zM8gjQ=";
+  };
+
+  propagatedBuildInputs = [
+    dill
+    numpy
+    networkx
+    ply
+    psutil
+    python-constraint
+    python-dateutil
+    retworkx
+    scipy
+    scikit-quant
+    stevedore
+    symengine
+    sympy
+    tweedledum
+  ] ++ lib.optionals withVisualization visualizationPackages
+  ++ lib.optionals withCrosstalkPass crosstalkPackages;
+
+  # *** Tests ***
+  checkInputs = [
+    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 = (stdenv.isLinux && stdenv.isAarch64) || stdenv.isDarwin;
+    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..458fa6a146e3
--- /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.37.0";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "Qiskit";
+    repo = "qiskit";
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-TsDDiSWSjk2iXaxFjGXQxPFEPCR242dR26H0cpA6ZxY=";
+  };
+
+  propagatedBuildInputs = [
+    qiskit-aer
+    qiskit-ibmq-provider
+    qiskit-ignis
+    qiskit-terra
+  ] ++ lib.optionals withOptionalPackages optionalQiskitPackages;
+
+  checkInputs = [ 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..4e52dc991795
--- /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;
+    sha256 = "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..1803d2ffe72e
--- /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
+  ];
+
+  checkInputs = [
+    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/qrcode/default.nix b/nixpkgs/pkgs/development/python-modules/qrcode/default.nix
new file mode 100644
index 000000000000..9b9254bdcc1a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qrcode/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, six
+, pillow
+, pymaging_png
+, mock
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "qrcode";
+  version = "7.3.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "375a6ff240ca9bd41adc070428b5dfc1dcfbb0f2507f1ac848f6cded38956578";
+  };
+
+  propagatedBuildInputs = [ six pillow pymaging_png setuptools ];
+  checkInputs = [ mock ];
+
+  meta = with lib; {
+    description = "Quick Response code generation for Python";
+    homepage = "https://pypi.python.org/pypi/qrcode";
+    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..dc2031c70287
--- /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
+  ];
+
+  checkInputs = [
+    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-qt4/default.nix b/nixpkgs/pkgs/development/python-modules/qscintilla-qt4/default.nix
new file mode 100644
index 000000000000..a356bfddb934
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qscintilla-qt4/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, isPy3k
+, isPyPy
+, pkgs
+, python
+, pyqt4
+}:
+
+buildPythonPackage {
+  pname = "qscintilla-qt4";
+  version = pkgs.qscintilla-qt4.version;
+  format = "other";
+
+  disabled = isPyPy;
+
+  src = pkgs.qscintilla-qt4.src;
+
+  nativeBuildInputs = [ pkgs.xorg.lndir ];
+
+  buildInputs = [ pyqt4.qt pyqt4 ];
+
+  preConfigure = ''
+    mkdir -p $out
+    lndir ${pyqt4} $out
+    rm -rf "$out/nix-support"
+    cd Python
+    ${python.executable} ./configure-old.py \
+        --destdir $out/lib/${python.libPrefix}/site-packages/PyQt4 \
+        --apidir $out/api/${python.libPrefix} \
+        -n ${pkgs.qscintilla-qt4}/include \
+        -o ${pkgs.qscintilla-qt4}/lib \
+        --sipdir $out/share/sip
+  '';
+
+  meta = with lib; {
+    description = "A Python binding to QScintilla, Qt based text editing control";
+    license = licenses.lgpl21Plus;
+    maintainers = with maintainers; [ danbst ];
+    platforms = platforms.linux;
+  };
+}
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..3e43b0d069ca
--- /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 ];
+  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..768e5f7d007e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qstylizer/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, inflection
+, pbr
+, tinycss2
+, pytestCheckHook
+, pytest-mock
+}:
+
+buildPythonPackage rec {
+  pname = "qstylizer";
+  version = "0.2.1";
+
+  src = fetchFromGitHub {
+    owner = "blambright";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-iEMxBpS9gOPubd9O8zpVmR5B7+UZJFkPuOtikO1a9v0=";
+  };
+
+  nativeBuildInputs = [
+    pbr
+  ];
+
+  propagatedBuildInputs = [
+    inflection
+    tinycss2
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    pytest-mock
+  ];
+
+  preBuild = ''
+    export PBR_VERSION=${version}
+  '';
+
+  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/qt5reactor/default.nix b/nixpkgs/pkgs/development/python-modules/qt5reactor/default.nix
new file mode 100644
index 000000000000..a85f2ad6892a
--- /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
+  ];
+
+  checkInputs = [
+    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..4bb3303af467
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qtawesome/default.nix
@@ -0,0 +1,29 @@
+{ lib, buildPythonPackage, fetchPypi, qtpy, six, pyqt5, pytest }:
+
+buildPythonPackage rec {
+  pname = "QtAwesome";
+  version = "1.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ec02e200231fa68a146a93845890aa0432a7edcba14bf811ff6975cf9acdab5d";
+  };
+
+  propagatedBuildInputs = [ qtpy six ];
+
+  checkInputs = [ pyqt5 pytest ];
+
+  checkPhase = ''
+    py.test
+  '';
+
+  # Requires https://github.com/boylea/qtbot
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Iconic fonts in PyQt and PySide applications";
+    homepage = "https://github.com/spyder-ide/qtawesome";
+    license = licenses.mit;
+    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..a1483518f92b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qtconsole/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nose
+, isPy27
+, mock
+, traitlets
+, jupyter_core
+, jupyter-client
+, pygments
+, ipykernel
+, pyqt5
+, qtpy
+}:
+
+buildPythonPackage rec {
+  pname = "qtconsole";
+  version = "5.3.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-tzcj+sQ5OLaE3LI3qIUQ3HchxDpybOqK3heaKSfAovM=";
+  };
+
+  checkInputs = [ nose ] ++ lib.optionals isPy27 [mock];
+  propagatedBuildInputs = [traitlets jupyter_core jupyter-client pygments ipykernel pyqt5 qtpy];
+
+  # : cannot connect to X server
+  doCheck = false;
+
+  meta = {
+    description = "Jupyter Qt console";
+    homepage = "https://jupyter.org/";
+    license = lib.licenses.bsd3;
+    platforms = lib.platforms.unix;
+    maintainers = with lib.maintainers; [ fridh ];
+  };
+}
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..31c05ce48f4e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qtpy/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+
+# propagates
+, packaging
+
+# tests
+, pyqt5
+, pyside
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "QtPy";
+  version = "2.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-yozUIXF1GGNEKZ7kwPfnrc82LHCFK6NbJVpTQHcCXAY=";
+  };
+
+  propagatedBuildInputs = [
+    packaging
+  ];
+
+  doCheck = false; # ModuleNotFoundError: No module named 'PyQt5.QtConnectivity'
+  checkInputs = [
+    pyside
+    (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/qualysclient/default.nix b/nixpkgs/pkgs/development/python-modules/qualysclient/default.nix
new file mode 100644
index 000000000000..6556187c44bf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qualysclient/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, certifi
+, charset-normalizer
+, fetchFromGitHub
+, idna
+, lxml
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+, requests
+, responses
+, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "qualysclient";
+  version = "0.0.4.8.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "woodtechie1428";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0hrbp5ci1l06j709k5y3z3ad9dryvrkvmc2wyb4a01gw7qzry7ys";
+  };
+
+  propagatedBuildInputs = [
+    certifi
+    charset-normalizer
+    idna
+    lxml
+    requests
+    urllib3
+  ];
+
+  checkInputs = [
+    pytest-mock
+    pytestCheckHook
+    responses
+  ];
+
+  pythonImportsCheck = [
+    "qualysclient"
+  ];
+
+  meta = with lib; {
+    description = "Python SDK for interacting with the Qualys API";
+    homepage = "https://qualysclient.readthedocs.io/";
+    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..54df9bebb57c
--- /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";
+      sha256 = "sha256-6gomY82AOKkrt32SEBKnRugzhnC5FAyKDs6K5xaxnRM=";
+    })
+  ];
+
+  propagatedBuildInputs = [ pyqt ];
+
+  checkInputs = [ 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..e819cd24e99d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/quandl/default.nix
@@ -0,0 +1,68 @@
+{ 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";
+    sha256 = "6e0b82fbc7861610b3577c5397277c4220e065eee0fed4e46cd6b6021655b64c";
+  };
+
+  propagatedBuildInputs = [
+    pandas
+    numpy
+    requests
+    inflection
+    python-dateutil
+    six
+    more-itertools
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  checkInputs = [
+    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/quantities/default.nix b/nixpkgs/pkgs/development/python-modules/quantities/default.nix
new file mode 100644
index 000000000000..48cc70d5f2af
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/quantities/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, numpy
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "quantities";
+  version = "0.13.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0fde20115410de21cefa786f3aeae69c1b51bb19ee492190324c1da705e61a81";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Tests don't work with current numpy
+    # https://github.com/python-quantities/python-quantities/pull/195
+    "test_arctan2"
+    "test_fix"
+  ];
+
+  pythonImportsCheck = [ "quantities" ];
+
+  meta = with lib; {
+    description = "Quantities is designed to handle arithmetic and conversions of physical quantities";
+    homepage = "https://python-quantities.readthedocs.io/";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ ];
+  };
+}
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..272899a6bbbd
--- /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
+  ];
+
+  checkInputs = [
+    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/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..e0b549dd6dcb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/questionary/default.nix
@@ -0,0 +1,52 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, prompt-toolkit
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "questionary";
+  version = "unstable-2022-07-27";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "tmbo";
+    repo = pname;
+    rev = "848b040c5b7086ffe75bd92c656e15e94d905146";
+    hash = "sha256-W0d1Uoy5JdN3BFfeyk1GG0HBzmgKoBApaGad0UykZaY=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    prompt-toolkit
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # TypeError: <lambda>() missing 1 required...
+    "test_print_with_style"
+  ];
+
+  pythonImportsCheck = [
+    "questionary"
+  ];
+
+  meta = with lib; {
+    description = "Python library to build command line user prompts";
+    homepage = "https://github.com/tmbo/questionary";
+    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..e99deef489f3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qutip/default.nix
@@ -0,0 +1,91 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, cvxopt
+, cvxpy
+, cython
+, doCheck ? true
+, fetchFromGitHub
+, matplotlib
+, numpy
+, packaging
+, pytest-rerunfailures
+, pytestCheckHook
+, python
+, pythonOlder
+, scipy
+}:
+
+buildPythonPackage rec {
+  pname = "qutip";
+  version = "4.7.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-wGr6uTM6pFL2nvN4zdqPdEO8O3kjrRtKWx8luL1t9Sw=";
+  };
+
+  nativeBuildInputs = [
+    cython
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    packaging
+    scipy
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    pytest-rerunfailures
+  ] ++ passthru.optional-dependencies.graphics;
+
+  # Disabling OpenMP support on Darwin.
+  setupPyGlobalFlags = lib.optional (!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
+    ];
+    semidefinite = [
+      cvxpy
+      cvxopt
+    ];
+  };
+
+  meta = with lib; {
+    broken = (stdenv.isLinux && stdenv.isAarch64);
+    description = "Open-source software for simulating the dynamics of closed and open quantum systems";
+    homepage = "https://qutip.org/";
+    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..00f856df03a0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/r2pipe/default.nix
@@ -0,0 +1,50 @@
+{ stdenv
+, lib
+, python
+, buildPythonPackage
+, fetchPypi
+, radare2
+, coreutils
+}:
+
+buildPythonPackage rec {
+  pname = "r2pipe";
+  version = "1.7.1";
+
+  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;
+    sha256 = "sha256-7Qa8Jl7vX/acMhGSqWfaqvN9emA05RSubpseAwRSpG4=";
+  };
+
+  # 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/rabbitpy/default.nix b/nixpkgs/pkgs/development/python-modules/rabbitpy/default.nix
new file mode 100644
index 000000000000..57c52ff49ba9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rabbitpy/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, mock
+, nose
+, pamqp
+}:
+
+buildPythonPackage rec {
+  version = "2.0.1";
+  pname = "rabbitpy";
+
+  # No tests in the pypi tarball, so we directly fetch from git
+  src = fetchFromGitHub {
+    owner = "gmr";
+    repo = pname;
+    rev = version;
+    sha256 = "0m5z3i3d5adrz1wh6y35xjlls3cq6p4y9p1mzghw3k7hdvg26cck";
+  };
+
+  propagatedBuildInputs = [ pamqp ];
+  checkInputs = [ mock nose ];
+
+  checkPhase = ''
+    runHook preCheck
+    rm tests/integration_tests.py # Impure tests requiring network
+    nosetests tests
+    runHook postCheck
+  '';
+
+  postPatch = ''
+    # See: https://github.com/gmr/rabbitpy/issues/118
+    substituteInPlace setup.py \
+      --replace 'pamqp>=2,<3' 'pamqp'
+  '';
+
+  meta = with lib; {
+    description = "A pure python, thread-safe, minimalistic and pythonic RabbitMQ client library";
+    homepage = "https://pypi.python.org/pypi/rabbitpy";
+    license = licenses.bsd3;
+
+    # broken by pamqp==3, tracked in
+    # https://github.com/gmr/rabbitpy/issues/125
+    broken = true;
+  };
+
+}
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..3fcf773e83d9
--- /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 ];
+
+  checkInputs = [
+    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/radicale_infcloud/default.nix b/nixpkgs/pkgs/development/python-modules/radicale_infcloud/default.nix
new file mode 100644
index 000000000000..5d3540e01956
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/radicale_infcloud/default.nix
@@ -0,0 +1,23 @@
+{ lib, fetchFromGitHub, buildPythonPackage }:
+
+buildPythonPackage {
+  pname = "radicale_infcloud";
+  version = "2017-07-27";
+
+  src = fetchFromGitHub {
+    owner = "Unrud";
+    repo = "RadicaleInfCloud";
+    rev = "972757bf4c6be8b966ee063e3741ced29ba8169f";
+    sha256 = "1c9ql9nv8kwi791akwzd19dcqzd916i7yxzbnrismzw4f5bhgzsk";
+  };
+
+  doCheck = false; # Tries to import radicale, circular dependency
+
+  meta = with lib; {
+    homepage = "https://github.com/Unrud/RadicaleInfCloud/";
+    description = "Integrate InfCloud into Radicale's web interface";
+    license = with licenses; [ agpl3 gpl3 ];
+    platforms = platforms.all;
+    maintainers = with maintainers; [ aneeshusa ];
+  };
+}
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..bcb099887695
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/radio_beam/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, setuptools-scm
+, astropy
+, numpy
+, scipy
+, six
+, pytestCheckHook
+, pytest-doctestplus
+}:
+
+buildPythonPackage rec {
+  pname = "radio_beam";
+  version = "0.3.3";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "radio-beam";
+    sha256 = "e34902d91713ccab9f450b9d3e82317e292cf46a30bd42f9ad3c9a0519fcddcd";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    astropy
+    numpy
+    scipy
+    six
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    pytest-doctestplus
+  ];
+
+  # Tests must be run in the build directory
+  preCheck = ''
+    cd build/lib
+  '';
+
+  meta = {
+    description = "Tools for Beam IO and Manipulation";
+    homepage = "http://radio-astro-tools.github.io";
+    license = lib.licenses.bsd3;
+    platforms = lib.platforms.all;
+    maintainers = with lib.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..c5b4413540c4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/radios/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, poetry-core
+, aiodns
+, aiohttp
+, awesomeversion
+, backoff
+, cachetools
+, pycountry
+, pydantic
+, yarl
+, pytest-asyncio
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "radios";
+  version = "0.1.1";
+
+  disabled = pythonOlder "3.9";
+
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "frenck";
+    repo = "python-radios";
+    rev = "v${version}";
+    hash = "sha256-NCBch9MCWVD6ez0sIUph8rwOOzEMZtwC4atXJe53xZM=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "0.0.0" "${version}" \
+      --replace "--cov" ""
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiodns
+    aiohttp
+    awesomeversion
+    backoff
+    cachetools
+    pycountry
+    pydantic
+    yarl
+  ];
+
+  checkInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "radios" ];
+
+  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..9cefe8839c1c
--- /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";
+  };
+
+  checkInputs = [
+    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..f75e5cc19ee5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/radish-bdd/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, click
+, colorful
+, docopt
+, fetchFromGitHub
+, freezegun
+, humanize
+, lark
+, parse-type
+, pysingleton
+, pytestCheckHook
+, pyyaml
+, tag-expressions
+, lxml
+, pytest-mock
+}:
+
+buildPythonPackage rec {
+  pname = "radish-bdd";
+  version = "0.13.4";
+
+  # Pypi package does not have necessary test fixtures.
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = "radish";
+    rev = "v${version}";
+    sha256 = "1slfgh61648i009qj8156qipy21a6zm8qzjk00kbm5kk5z9jfryi";
+  };
+
+  propagatedBuildInputs = [
+    lark
+    click
+    colorful
+    tag-expressions
+    parse-type
+    humanize
+    pyyaml
+    docopt
+    pysingleton
+  ];
+
+  checkInputs = [ freezegun lxml pytestCheckHook pytest-mock ];
+  disabledTests = [ "test_main_cli_calls" ];
+
+  meta = with lib; {
+    description = "Behaviour-Driven-Development tool for python";
+    homepage = "http://radish-bdd.io";
+    license = licenses.mit;
+    maintainers = with maintainers; [ kalbasit ];
+  };
+}
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..55b964fb6ad2
--- /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 = "2.0.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-dBP/oZRYO9UQ78PkZo9h1aOL7soYa7fDbuptDW8D+0U=";
+  };
+
+  # 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..c0fb2accc53a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/raincloudy/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, beautifulsoup4
+, buildPythonPackage
+, fetchFromGitHub
+, html5lib
+, pytestCheckHook
+, pythonOlder
+, requests
+, requests-mock
+, 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=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    beautifulsoup4
+    urllib3
+    html5lib
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    requests-mock
+  ];
+
+  postPatch = ''
+    # https://github.com/vanstinator/raincloudy/pull/60
+    substituteInPlace setup.py \
+      --replace "bs4" "beautifulsoup4" \
+      --replace "html5lib==1.0.1" "html5lib"
+  '';
+
+  pythonImportsCheck = [
+    "raincloudy"
+  ];
+
+  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/rangehttpserver/default.nix b/nixpkgs/pkgs/development/python-modules/rangehttpserver/default.nix
new file mode 100644
index 000000000000..217bffb174b8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rangehttpserver/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, nose
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "rangehttpserver";
+  version = "1.2.0";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "danvk";
+    repo = "RangeHTTPServer";
+    rev = version;
+    sha256 = "1sy9j6y8kp5jiwv2vd652v94kspp1yd4dwxrfqfn6zwnfyv2mzv5";
+  };
+
+  checkInputs = [
+    nose
+    requests
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+    nosetests
+    runHook postCheck
+  '';
+
+  pythonImportsCheck = [
+    "RangeHTTPServer"
+  ];
+
+  meta = with lib; {
+    description = "SimpleHTTPServer with support for Range requests";
+    homepage = "https://github.com/danvk/RangeHTTPServer";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..3b584a04b9b2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rapidfuzz/default.nix
@@ -0,0 +1,82 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, cmake
+, cython_3
+, ninja
+, rapidfuzz-capi
+, scikit-build
+, setuptools
+, jarowinkler
+, numpy
+, hypothesis
+, jarowinkler-cpp
+, pandas
+, pytestCheckHook
+, rapidfuzz-cpp
+, taskflow
+}:
+
+buildPythonPackage rec {
+  pname = "rapidfuzz";
+  version = "2.5.0";
+
+  disabled = pythonOlder "3.6";
+
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "maxbachmann";
+    repo = "RapidFuzz";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-Cdzf6qQZQzH+tRyLEYvi7c01L5i+6WmgHozLhFQNsiQ=";
+  };
+
+  nativeBuildInputs = [
+    cmake
+    cython_3
+    ninja
+    rapidfuzz-capi
+    scikit-build
+    setuptools
+  ];
+
+  dontUseCmakeConfigure = true;
+
+  buildInputs = [
+    jarowinkler-cpp
+    rapidfuzz-cpp
+    taskflow
+  ];
+
+  preBuild = ''
+    export RAPIDFUZZ_BUILD_EXTENSION=1
+  '';
+
+  propagatedBuildInputs = [
+    jarowinkler
+    numpy
+  ];
+
+  checkInputs = [
+    hypothesis
+    pandas
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "rapidfuzz.fuzz"
+    "rapidfuzz.string_metric"
+    "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.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
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..545782d853ea
--- /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.0";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "markokr";
+    repo = "rarfile";
+    rev = "v${version}";
+    sha256 = "0gpriqkvcb6bsccvq8b099xjv5fkjs0d7g4636d5jphy417jxk5m";
+  };
+
+  checkInputs = [ 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..7876e6667491
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rasterio/default.nix
@@ -0,0 +1,98 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+
+# build time
+, cython
+, gdal
+
+# runtime
+, affine
+, attrs
+, boto3
+, click
+, click-plugins
+, cligj
+, matplotlib
+, numpy
+, snuggs
+, setuptools
+
+# tests
+, hypothesis
+, packaging
+, pytest-randomly
+, pytestCheckHook
+, shapely
+}:
+
+buildPythonPackage rec {
+  pname = "rasterio";
+  version = "1.3.0"; # not x.y[ab]z, those are alpha/beta versions
+  format = "pyproject";
+  disabled = pythonOlder "3.6";
+
+  # Pypi doesn't ship the tests, so we fetch directly from GitHub
+  src = fetchFromGitHub {
+    owner = "rasterio";
+    repo = "rasterio";
+    rev = "refs/tags/${version}";
+    hash = "sha256-CBnG1zNMOL3rAmnErv7XZZ2Cu9W+DnRPcjtKdmYXHUA=";
+  };
+
+  nativeBuildInputs = [
+    cython
+    gdal
+  ];
+
+  propagatedBuildInputs = [
+    affine
+    attrs
+    boto3
+    click
+    click-plugins
+    cligj
+    matplotlib
+    numpy
+    snuggs
+    setuptools # needs pkg_resources at runtime
+  ];
+
+  preCheck = ''
+    rm -rf rasterio
+  '';
+
+  checkInputs = [
+    pytest-randomly
+    pytestCheckHook
+    packaging
+    hypothesis
+    shapely
+  ];
+
+  pytestFlagsArray = [
+    "-m 'not network'"
+  ];
+
+  disabledTests = lib.optionals stdenv.isDarwin [
+    "test_reproject_error_propagation"
+  ];
+
+  pythonImportsCheck = [
+    "rasterio"
+  ];
+
+  doInstallCheck = true;
+  installCheckPhase = ''
+    $out/bin/rio --version | grep ${version} > /dev/null
+  '';
+
+  meta = with lib; {
+    description = "Python package to read and write geospatial raster data";
+    homepage = "https://rasterio.readthedocs.io/en/latest/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ mredaelli ];
+  };
+}
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..f706d043bf86
--- /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
+  '';
+
+  checkInputs = [ 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/ratelimiter/default.nix b/nixpkgs/pkgs/development/python-modules/ratelimiter/default.nix
new file mode 100644
index 000000000000..cccca46296b6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ratelimiter/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest-asyncio
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "ratelimiter";
+  version = "1.2.0.post0";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-XDldyr273i5ReO8/ibVoowZkVKbdwiO3ZHPawi+JtPc=";
+  };
+
+  checkInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "ratelimiter"
+  ];
+
+  preCheck = ''
+    # Uses out-dated options
+    rm tests/conftest.py
+  '';
+
+  disabledTests = [
+    # TypeError: object Lock can't be used in 'await' expression
+    "test_alock"
+  ];
+
+  meta = with lib; {
+    description = "Simple python rate limiting object";
+    homepage = "https://github.com/RazerM/ratelimiter";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ helkafen ];
+  };
+}
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..0a96123db04c
--- /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 ];
+
+  checkInputs = [ 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; [ jfrankenau ];
+  };
+}
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/rcssmin/default.nix b/nixpkgs/pkgs/development/python-modules/rcssmin/default.nix
new file mode 100644
index 000000000000..1d1033944f01
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rcssmin/default.nix
@@ -0,0 +1,20 @@
+{ lib, buildPythonPackage, fetchPypi }:
+buildPythonPackage rec {
+  pname = "rcssmin";
+  version = "1.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-T5QAtDZtKfX1RG9Y54VJr6gzjmpZdAxzEV6fasQT3GQ=";
+  };
+
+  # The package does not ship tests, and the setup machinary confuses
+  # tests auto-discovery
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "http://opensource.perlig.de/rcssmin/";
+    license = licenses.asl20;
+    description = "CSS minifier written in pure python";
+  };
+}
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..1aa995d85d77
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rdflib/default.nix
@@ -0,0 +1,86 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+
+# propagates
+, isodate
+, pyparsing
+
+# propagates <3.8
+, importlib-metadata
+
+# extras: networkx
+, networkx
+
+# extras: html
+, html5lib
+
+# tests
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "rdflib";
+  version = "6.1.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "RDFLib";
+    repo = pname;
+    rev = version;
+    hash = "sha256:1ih7vx4i16np1p8ig5faw74apmbm7kgyj9alya521yvzid6d7pzd";
+  };
+
+  propagatedBuildInputs = [
+    isodate
+    html5lib
+    pyparsing
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  passthru.optional-dependencies = {
+    html = [
+      html5lib
+    ];
+    networkx = [
+      networkx
+    ];
+  };
+
+  checkInputs = [
+    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"
+  ] ++ lib.optional 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..2dcb884931d9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rdkit/default.nix
@@ -0,0 +1,158 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchzip
+, cmake
+, boost
+, catch2
+, inchi
+, cairo
+, eigen
+, python
+, rapidjson
+, maeparser
+, coordgenlibs
+, numpy
+, pandas
+, pillow
+, git
+}:
+let
+  external = {
+    avalon = fetchzip {
+      url = "http://sourceforge.net/projects/avalontoolkit/files/AvalonToolkit_1.2/AvalonToolkit_1.2.0.source.tar";
+      sha256 = "0nhxfxckb5a5qs0g148f55yarhncqjgjzcvdskkv9rxi2nrs7160";
+      stripRoot = false;
+    };
+    yaehmop = fetchFromGitHub {
+      owner = "greglandrum";
+      repo = "yaehmop";
+      rev = "cfb5aeebbdf5ae93c4f4eeb14c7a507dea54ae9e";
+      sha256 = "sha256-QMnc5RyHlY3giw9QmrkGntiA+Srs7OhCIKs9GGo5DfQ=";
+    };
+    freesasa = fetchFromGitHub {
+      owner = "mittinatten";
+      repo = "freesasa";
+      rev = "2.1.1";
+      sha256 = "sha256-fUJvLDTVhpBWl9MavZwp0kAO5Df1QuHEKqe20CXNfcg=";
+    };
+  };
+in
+buildPythonPackage rec {
+  pname = "rdkit";
+  version = "2022.03.4";
+
+  src =
+    let
+      versionTag = lib.replaceStrings [ "." ] [ "_" ] version;
+    in
+    fetchFromGitHub {
+      owner = pname;
+      repo = pname;
+      rev = "Release_${versionTag}";
+      sha256 = "13aga2fy1hgldb229n16niv30n3lwlypd7xv16smpbgw0cp1xpp2";
+    };
+
+  unpackPhase = ''
+    mkdir -p source/External/AvalonTools/avalon source/External/YAeHMOP/yaehmop source/External/FreeSASA/freesasa
+    cp -r ${src}/* source
+    cp -r ${external.avalon}/SourceDistribution/* source/External/AvalonTools/avalon
+    cp -r ${external.yaehmop}/* source/External/YAeHMOP/yaehmop
+    cp -r ${external.freesasa}/* source/External/FreeSASA/freesasa
+
+    find source -type d -exec chmod 755 {} +
+    cp source/External/FreeSASA/freesasa2.c source/External/FreeSASA/freesasa/src
+    ln -s ${rapidjson} source/External/rapidjson-1.1.0
+  '';
+
+  sourceRoot = "source";
+
+  nativeBuildInputs = [
+    cmake
+    git # required by freesasa
+  ];
+
+  buildInputs = [
+    boost
+    catch2
+    inchi
+    eigen
+    cairo
+    rapidjson
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    pandas
+    pillow
+  ];
+
+  hardeningDisable = [ "format" ]; # required by yaehmop
+
+  dontUseSetuptoolsBuild = true;
+  dontUsePipInstall = true;
+  dontUseSetuptoolsCheck = true;
+
+  preConfigure = ''
+    # Don't want this contacting the git remote during the build
+    substituteInPlace External/YAeHMOP/CMakeLists.txt --replace \
+      'GIT_TAG master' 'DOWNLOAD_COMMAND true'
+
+    # 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_INSTALL_COMIC_FONTS=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 = [ maintainers.rmcgibbo ];
+    license = licenses.bsd3;
+    homepage = "https://www.rdkit.org";
+  };
+}
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/readability-lxml/default.nix b/nixpkgs/pkgs/development/python-modules/readability-lxml/default.nix
new file mode 100644
index 000000000000..b0494631388e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/readability-lxml/default.nix
@@ -0,0 +1,41 @@
+{ 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"
+  '';
+
+  checkInputs = [
+    pytestCheckHook
+    timeout-decorator
+  ];
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    description = "Fast python port of arc90's readability tool";
+    homepage = "https://github.com/buriy/python-readability";
+    license = licenses.apsl20;
+    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..81c489bd8c09
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/readchar/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+
+# native
+, flake8
+
+# tests
+, pytestCheckHook
+, pexpect
+}:
+
+buildPythonPackage rec {
+  pname = "readchar";
+  version = "3.0.5";
+  format = "setuptools";
+
+  # Don't use wheels on PyPI
+  src = fetchFromGitHub {
+    owner = "magmax";
+    repo = "python-${pname}";
+    rev = "v${version}";
+    sha256 = "sha256:01bjw3ipdzxq1ijn9354nlya625i26ri7jac1dnlj1d1gdd8m5lx";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "--cov readchar" ""
+  '';
+
+  nativeBuildInputs = [
+    flake8
+  ];
+
+  checkInputs = [
+    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..f2e3d11e7edd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/readlike/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "readlike";
+  version = "0.1.3";
+
+  src = fetchFromGitHub {
+    owner = "jangler";
+    repo = "readlike";
+    rev = version;
+    sha256 = "1mw8j8ads8hqdbz42siwpffi4wi5s33z9g14a5c2i7vxp8m68qc1";
+  };
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest discover -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/readme/default.nix b/nixpkgs/pkgs/development/python-modules/readme/default.nix
new file mode 100644
index 000000000000..95b45185a08c
--- /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";
+  };
+
+  checkInputs = [
+    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 = [ maintainers.costrouc ];
+  };
+
+}
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..9519a2c61a94
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/readme_renderer/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, bleach
+, buildPythonPackage
+, cmarkgfm
+, docutils
+, fetchPypi
+, mock
+, pygments
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "readme-renderer";
+  version = "36.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    pname = "readme_renderer";
+    inherit version;
+    sha256 = "sha256-9xru+aWI/L7R9MwAG6YRNw6UoM0nx1sRQFN2GOx48KI=";
+  };
+
+  propagatedBuildInputs = [
+    bleach
+    cmarkgfm
+    docutils
+    pygments
+  ];
+
+  checkInputs = [
+    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_"
+    # 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..e0ba8cd57cf4
--- /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.1.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-pX43E9r3e/kdG6GeS5iIpHwKv+tj7PAuOsd/z9mb/mk=";
+  };
+
+  propagatedBuildInputs = [ requests ];
+
+  checkInputs = [ 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..570654dc7e15
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rebulk/default.nix
@@ -0,0 +1,22 @@
+{ lib, buildPythonPackage, fetchPypi, pytest, pytest-runner, six, regex}:
+
+buildPythonPackage rec {
+  pname = "rebulk";
+  version = "3.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "809de3a97c68afa831f7101b10d316fe62e061dc9f7f67a44b7738128721173a";
+  };
+
+  # Some kind of trickery with imports that doesn't work.
+  doCheck = false;
+  buildInputs = [ pytest pytest-runner ];
+  propagatedBuildInputs = [ six regex ];
+
+  meta = with lib; {
+    homepage = "https://github.com/Toilal/rebulk/";
+    license = licenses.mit;
+    description = "Advanced string matching from simple patterns";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/recaptcha_client/default.nix b/nixpkgs/pkgs/development/python-modules/recaptcha_client/default.nix
new file mode 100644
index 000000000000..dce24cfa7a8f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/recaptcha_client/default.nix
@@ -0,0 +1,23 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonAtLeast
+}:
+
+buildPythonPackage rec {
+  pname = "recaptcha-client";
+  version = "1.0.6";
+  disabled = pythonAtLeast "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "28c6853c1d13d365b7dc71a6b05e5ffb56471f70a850de318af50d3d7c0dea2f";
+  };
+
+  meta = with lib; {
+    description = "A CAPTCHA for Python using the reCAPTCHA service";
+    homepage = "http://recaptcha.net/";
+    license = licenses.mit;
+  };
+
+}
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..48d92d43ec6e
--- /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";
+  };
+
+  checkInputs = [ 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..b717d8a4c5b5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/recordlinkage/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, bottleneck
+, buildPythonPackage
+, fetchPypi
+, jellyfish
+, joblib
+, networkx
+, numexpr
+, numpy
+, pandas
+, pyarrow
+, pytest
+, scikit-learn
+, scipy
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "recordlinkage";
+  version = "0.14";
+
+  disabled = pythonOlder "3.7";
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-kuY2MUuwaLb228kwkJmOnnU+OolZcvGlhKTTiama+T4=";
+  };
+
+  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.
+  checkInputs = [ pytest ];
+
+  pythonImportsCheck = [ "recordlinkage" ];
+
+  meta = with lib; {
+    description = "Library to link records in or between data sources";
+    homepage = "https://recordlinkage.readthedocs.io/";
+    license = licenses.bsd3;
+    maintainers = [ maintainers.raitobezarius ];
+  };
+}
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..c49f891ec1de
--- /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}/bin/${python.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..841d6a31fb2c
--- /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
+
+  checkInputs = [ 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/default.nix b/nixpkgs/pkgs/development/python-modules/redis/default.nix
new file mode 100644
index 000000000000..adaf4d86ef69
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/redis/default.nix
@@ -0,0 +1,72 @@
+{ 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 = "4.3.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-3fJwcd9K3zghxPLKWdZ1JcOoLl8mi+2XuBPLT6v4eIA=";
+  };
+
+  propagatedBuildInputs = [
+    async-timeout
+    deprecated
+    packaging
+    typing-extensions
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  passthru.optional-dependencies = {
+    hidredis = [
+      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://pypi.python.org/pypi/redis/";
+    license = with licenses; [ mit ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rednose/default.nix b/nixpkgs/pkgs/development/python-modules/rednose/default.nix
new file mode 100644
index 000000000000..73b7f5d4758e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rednose/default.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, isPy27, pythonAtLeast
+, nose, six, colorama, termstyle }:
+
+buildPythonPackage rec {
+  pname = "rednose";
+  version = "1.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "6da77917788be277b70259edc0bb92fc6f28fe268b765b4ea88206cc3543a3e1";
+  };
+
+  prePatch = ''
+    substituteInPlace setup.py --replace "six==1.10.0" "six>=1.10.0"
+  '';
+
+  # Do not test on Python 2 because the tests suite gets stuck
+  # https://github.com/NixOS/nixpkgs/issues/60786
+  # Also macOS tests are broken on python38
+  doCheck = !(isPy27 || (stdenv.isDarwin && pythonAtLeast "3.8"));
+
+  checkInputs = [ six ];
+  propagatedBuildInputs = [ nose colorama termstyle ];
+
+  meta = with lib; {
+    description = "A python nose plugin adding color to console results";
+    homepage = "https://github.com/JBKahn/rednose";
+    license = licenses.mit;
+  };
+}
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..44e2c3b9b449
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/reedsolo/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchpatch
+, fetchFromGitHub
+, cython
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "reedsolo";
+  version = "1.5.4";
+
+  # Pypi does not have the tests
+  src = fetchFromGitHub {
+    owner = "tomerfiliba";
+    repo = "reedsolomon";
+    rev = "v${version}";
+    hash = "sha256-GUMdL5HclXxqMYasq9kUE7fCqOkjr1D20wjd/E+xPBk=";
+  };
+
+  patches = [
+    (fetchpatch {
+      # python3.10 compat; https://github.com/tomerfiliba/reedsolomon/pull/38
+      url = "https://github.com/tomerfiliba/reedsolomon/commit/63e5bd9fc3ca503990c212eb2c77c10589e6d6c3.patch";
+      hash = "sha256-47g+jUsJEAyqGnlzRA1oSyc2XFPUOfH0EW+vcOJzsxI=";
+    })
+  ];
+
+  nativeBuildInputs = [ cython ];
+
+  checkInputs = [ nose ];
+  checkPhase = "nosetests";
+
+  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/reflink/default.nix b/nixpkgs/pkgs/development/python-modules/reflink/default.nix
new file mode 100644
index 000000000000..cb0a9fb5856a
--- /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.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-ySU1gtskQTv9cDq/wbKkneePMbSQcjnyhumhkpoebjo=";
+  };
+
+  propagatedBuildInputs = [ cffi ];
+
+  propagatedNativeBuildInputs = [ cffi ];
+
+  checkInputs = [ 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..e9d504f5bc29
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/regenmaschine/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, aiohttp
+, aresponses
+, asynctest
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytest-aiohttp
+, pytest-asyncio
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "regenmaschine";
+  version = "2022.08.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "bachya";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-JPJ+8h3r1C2fHxVPsQgk0ZuG7VqKfBb4qthAG+GCvcE=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  checkInputs = [
+    aresponses
+    asynctest
+    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";
+    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..512a7162f0e3
--- /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 = "2022.3.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-eeWvH/JYvA/gvdb2m8SuM5NaiY48vvu8zyLoiif6BTs=";
+  };
+
+  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..26f0755b3fe1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/regional/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, numpy
+, scipy
+, matplotlib
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "regional";
+  version = "1.1.2";
+
+  src = fetchFromGitHub {
+    owner = "freeman-lab";
+    repo = pname;
+    rev = "e3a29c58982e5cd3d5700131ac96e5e0b84fb981"; # no tags in repo
+    sha256 = "03qgm35q9sa5cy0kkw4bj60zfylw0isfzb96nlhdfrsigzs2zkxv";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    scipy
+    matplotlib
+  ];
+
+  checkInputs = [
+    pytest
+  ];
+
+  checkPhase = ''
+    pytest
+  '';
+
+  meta = with lib; {
+    description = "Simple manipualtion and display of spatial regions";
+    homepage = "https://github.com/freeman-lab/regional";
+    license = licenses.mit;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..c9c5011da617
--- /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.7.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "722fefbd253d0bbcbf5250b7b9c4aca5722cde4ca38bfbf863a551a5fc26edfa";
+  };
+
+  checkInputs = [ 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..ddcedc4eae6d
--- /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.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "w0XmNWh1xF08qitH22lQgTRNqO6qyYrYd2dc6x3Fop0=";
+  };
+
+  propagatedBuildInputs = [
+    attrs
+    future
+    python-dateutil
+    pyyaml
+  ];
+
+  checkInputs = [
+    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..1baf6f4b0aac
--- /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 ];
+  };
+
+  checkInputs = [
+    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..9c1fc34cae46
--- /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 = "1.6.3";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "bitprophet";
+    repo = pname;
+    rev = version;
+    hash = "sha256-XX2e6bjBNMun31h0sNJ9ieZE01U+PhA5JYYNOuMgD20=";
+  };
+
+  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..99c868eb0b80
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/remarshal/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonApplication
+, fetchFromGitHub
+
+# build deps
+, poetry-core
+
+# propagates
+, cbor2
+, python-dateutil
+, pyyaml
+, tomlkit
+, u-msgpack-python
+
+# tested using
+, pytestCheckHook
+}:
+
+buildPythonApplication rec {
+  pname = "remarshal";
+  version = "0.14.0";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "dbohdan";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256:nTM3jrPf0kGE15J+ZXBIt2+NGSW2a6VlZCKj70n5kHM=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "poetry.masonry.api" "poetry.core.masonry.api" \
+      --replace 'PyYAML = "^5.3"' 'PyYAML = "*"' \
+      --replace 'tomlkit = "^0.7"' 'tomlkit = "*"'
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    cbor2
+    python-dateutil
+    pyyaml
+    tomlkit
+    u-msgpack-python
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    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/renault-api/default.nix b/nixpkgs/pkgs/development/python-modules/renault-api/default.nix
new file mode 100644
index 000000000000..5b2165c7583b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/renault-api/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, aiohttp
+, aioresponses
+, buildPythonPackage
+, click
+, dateparser
+, fetchFromGitHub
+, marshmallow-dataclass
+, poetry-core
+, pyjwt
+, pythonOlder
+, pytest-asyncio
+, pytestCheckHook
+, tabulate
+}:
+
+buildPythonPackage rec {
+  pname = "renault-api";
+  version = "0.1.11";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "hacf-fr";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-71UFVXfww3wgSO2qoRCuV80+33B91Bjl2+nuuCbQRLg=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    click
+    dateparser
+    marshmallow-dataclass
+    pyjwt
+    tabulate
+  ];
+
+  checkInputs = [
+    aioresponses
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "--asyncio-mode=legacy"
+  ];
+
+  pythonImportsCheck = [
+    "renault_api"
+  ];
+
+  meta = with lib; {
+    description = "Python library to interact with the Renault API";
+    homepage = "https://github.com/hacf-fr/renault-api";
+    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..86192cbc29ca
--- /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 ];
+
+  checkInputs = [
+    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/default.nix b/nixpkgs/pkgs/development/python-modules/reolink/default.nix
new file mode 100644
index 000000000000..896eb093cf9b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/reolink/default.nix
@@ -0,0 +1,69 @@
+{ lib
+, aiohttp
+, aiounittest
+, buildPythonPackage
+, fetchFromGitHub
+, ffmpeg-python
+, pytestCheckHook
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "reolink";
+  version = "0.61";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "fwestenberg";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-XUYTDHh0oTro6BT+h4LjRdMukOZTlWP+giFpjLciZNQ=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    ffmpeg-python
+    requests
+  ];
+
+  checkInputs = [
+    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 = "Python module to interact with the Reolink IP camera API";
+    homepage = "https://github.com/fwestenberg/reolink";
+    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..795a3168c82f
--- /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.8.1";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "asottile";
+    repo = "reorder_python_imports";
+    rev = "v${version}";
+    hash = "sha256-CLC9dfNSYqEBZB2fP34jpA/4cxm0HZzjo/e7Yn8XPFc=";
+  };
+
+  propagatedBuildInputs = [
+    aspy-refactor-imports
+    classify-imports
+  ];
+
+  pythonImportsCheck = [
+    "reorder_python_imports"
+  ];
+
+  checkInputs = [
+    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/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..6168f62d463d
--- /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.30.dev0";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "eb612994b7f364e872301b4569b544648e95e587d803284ddb5610efc8f2170f";
+  };
+
+  nativeBuildInputs = [ flit ];
+
+  propagatedBuildInputs = [
+    jinja2
+    ruamel-yaml
+    matplotlib
+    pandas
+    pygments
+    blessings
+    curio
+  ];
+
+  checkInputs = [
+    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/default.nix b/nixpkgs/pkgs/development/python-modules/reportlab/default.nix
new file mode 100644
index 000000000000..58b80d89c8e6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/reportlab/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, freetype
+, pillow
+, glibcLocales
+, python
+, isPyPy
+}:
+
+let
+  ft = freetype.overrideAttrs (oldArgs: { dontDisableStatic = true; });
+in buildPythonPackage rec {
+  pname = "reportlab";
+  version = "3.6.11";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-BPxEIPBUiBXQYj4DHIah9/PzAD5pnZr3FIdC4tcrAko=";
+  };
+
+  checkInputs = [ glibcLocales ];
+
+  buildInputs = [ ft pillow ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "mif = findFile(d,'ft2build.h')" "mif = findFile('${lib.getDev ft}','ft2build.h')"
+
+    # 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
+  '';
+
+  checkPhase = ''
+    cd tests
+    LC_ALL="en_US.UTF-8" ${python.interpreter} runAll.py
+  '';
+
+  # See https://bitbucket.org/pypy/compatibility/wiki/reportlab%20toolkit
+  disabled = isPyPy;
+
+  meta = {
+    description = "An Open Source Python library for generating PDFs and graphics";
+    homepage = "http://www.reportlab.com/";
+  };
+}
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..9efb54e35371
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/repoze_sphinx_autointerface/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, zope_interface
+, sphinx
+}:
+
+buildPythonPackage rec {
+  pname = "repoze.sphinx.autointerface";
+  version = "1.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-SGvxQjpGlrkVPkiM750ybElv/Bbd6xSwyYh7RsYOKKE=";
+  };
+
+  propagatedBuildInputs = [ zope_interface sphinx ];
+
+  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..47bb842cc875
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/repoze_who/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, zope_interface
+, webob
+}:
+
+buildPythonPackage rec {
+  pname = "repoze.who";
+  version = "2.4.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-ikybkmi0/w7dkG6Xwu7XzoPrn2LkJQv+A7zbum0xojc=";
+  };
+
+  propagatedBuildInputs = [ zope_interface webob ];
+
+  meta = with lib; {
+    description = "WSGI Authentication Middleware / API";
+    homepage = "http://www.repoze.org";
+    license = licenses.bsd0;
+  };
+
+}
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..02a6b149eb0b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/reproject/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, astropy
+, astropy-extension-helpers
+, astropy-healpix
+, astropy-helpers
+, buildPythonPackage
+, cython
+, fetchPypi
+, numpy
+, pytest-astropy
+, pytestCheckHook
+, pythonOlder
+, scipy
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "reproject";
+  version = "0.8";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Z54sY3R6GViTvMLHrJclrAZ1dH4/9bzIrgqDd9nFbJY=";
+  };
+
+  nativeBuildInputs = [
+    astropy-extension-helpers
+    astropy-helpers
+    cython
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    astropy
+    astropy-healpix
+    astropy-helpers
+    numpy
+    scipy
+  ];
+
+  checkInputs = [
+    pytest-astropy
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    cd build/lib*
+  '';
+
+  pythonImportsCheck = [
+    "reproject"
+  ];
+
+  meta = with lib; {
+    description = "Reproject astronomical images";
+    homepage = "https://reproject.readthedocs.io";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ smaret ];
+  };
+}
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..ace3052e5a9c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/reqif/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, python
+, pythonOlder
+, fetchFromGitHub
+, poetry-core
+, beautifulsoup4
+, lxml
+, jinja2
+, dataclasses
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "reqif";
+  version = "0.0.8";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "strictdoc-project";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-PtzRJUvv+Oee08+sdakFviKIhwfLngyal1WSWDtMELg=";
+  };
+
+  postPatch = ''
+    substituteInPlace ./tests/unit/conftest.py --replace \
+       "os.path.abspath(os.path.join(__file__, \"../../../../reqif\"))" \
+      "\"${placeholder "out"}/${python.sitePackages}/reqif\""
+    substituteInPlace pyproject.toml --replace "^" ">="
+    substituteInPlace requirements.txt --replace "==" ">="
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    beautifulsoup4
+    lxml
+    jinja2
+  ] ++ lib.optionals (pythonOlder "3.7") [
+    dataclasses
+  ];
+
+  pythonImportsCheck = [
+    "reqif"
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Python library for ReqIF format";
+    homepage = "https://github.com/strictdoc-project/reqif";
+    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..e024efb58b0f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/requests-aws4auth/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, httpx
+, pytestCheckHook
+, python
+, pythonOlder
+, requests
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "requests-aws4auth";
+  version = "1.1.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "tedder";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-/SqU/ojP9I4JXzR0c5tLzxx9UyNaVsON7LG/dbdeiH0=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    six
+  ];
+
+  passthru.optional-dependencies = {
+    httpx = [ httpx ];
+  };
+
+  checkInputs = [
+    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";
+    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..23d24c944565
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/requests-cache/default.nix
@@ -0,0 +1,113 @@
+{ lib
+, appdirs
+, attrs
+, buildPythonPackage
+, bson
+, boto3
+, botocore
+, cattrs
+, exceptiongroup
+, fetchFromGitHub
+, itsdangerous
+, poetry-core
+, pymongo
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, redis
+, requests
+, requests-mock
+, rich
+, timeout-decorator
+, ujson
+, urllib3
+, url-normalize
+}:
+
+buildPythonPackage rec {
+  pname = "requests-cache";
+  version = "0.9.5";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "reclosedev";
+    repo = "requests-cache";
+    rev = "v${version}";
+    hash = "sha256-oVEai7SceZUdsGYlOOMxO6DxMZMVsvqXvEu0cHzq7lY=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    appdirs
+    attrs
+    cattrs
+    exceptiongroup
+    requests
+    urllib3
+    url-normalize
+  ];
+
+  passthru.optional-dependencies = {
+    dynamodb = [
+      boto3
+      botocore
+    ];
+    mongodbo = [
+      pymongo
+    ];
+    redis = [
+      redis
+    ];
+    bson = [
+      bson
+    ];
+    json = [
+      ujson
+    ];
+    security = [
+      itsdangerous
+    ];
+    yaml = [
+      pyyaml
+    ];
+  };
+
+  checkInputs = [
+    pytestCheckHook
+    requests-mock
+    rich
+    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"
+  ];
+
+  pythonImportsCheck = [
+    "requests_cache"
+  ];
+
+  meta = with lib; {
+    description = "Persistent cache for requests library";
+    homepage = "https://github.com/reclosedev/requests-cache";
+    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..20ce327b4eda
--- /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
+  ];
+
+  checkInputs = [
+    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..d8cd9d81c94d
--- /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
+  ];
+
+  checkInputs = [
+    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..cc6eb312431e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/requests-futures/default.nix
@@ -0,0 +1,25 @@
+{ buildPythonPackage, fetchPypi, requests, lib }:
+
+buildPythonPackage rec {
+  pname = "requests-futures";
+  version = "1.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "35547502bf1958044716a03a2f47092a89efe8f9789ab0c4c528d9c9c30bc148";
+  };
+
+  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";
+    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..c59cf9cd88ae
--- /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.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "4c74bd31b581f6d2b36d575bb537b1f29469509f560f5050339a48195d48929b";
+  };
+
+  propagatedBuildInputs = [ mohawk requests ];
+
+  meta = with lib; {
+    description = "Hawk authentication strategy for the requests python library.";
+    homepage = "https://github.com/sam-washington/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..96ade3b45f6d
--- /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
+  ];
+
+  checkInputs = [
+    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..3a1382061bd7
--- /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
+  ];
+
+  checkInputs = [
+    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..85d7c47baae3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/requests-mock/default.nix
@@ -0,0 +1,34 @@
+{ lib, buildPythonPackage, fetchPypi, python
+, mock
+, purl
+, requests
+, six
+, testrepository
+, testtools
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "requests-mock";
+  version = "1.9.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "8d72abe54546c1fc9696fa1516672f1031d72a55a1d66c85184f972a24ba0eba";
+  };
+
+  patchPhase = ''
+    sed -i 's@python@${python.interpreter}@' .testr.conf
+  '';
+
+  propagatedBuildInputs = [ requests six ];
+
+  checkInputs = [ mock purl testrepository testtools pytest ];
+
+  meta = with lib; {
+    description = "Mock out responses from the requests package";
+    homepage = "https://requests-mock.readthedocs.io";
+    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..d42de957791e
--- /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;
+    sha256 = "sha256-db6sSkeIHuuU1epdatMe+IhWr/4jMrmq+1LGRSzPDXo=";
+  };
+
+  propagatedBuildInputs = [ oauthlib requests ];
+
+  checkInputs = [
+    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..fcc4db1fbf0f
--- /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.14";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "m-click";
+    repo = "requests_pkcs12";
+    rev = version;
+    hash = "sha256-LZgKjSas0KdJAf4leSVz8sEnRrlJ20Sm9Ka+S5zDOTM=";
+  };
+
+  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-toolbelt/default.nix b/nixpkgs/pkgs/development/python-modules/requests-toolbelt/default.nix
new file mode 100644
index 000000000000..af6788d173fc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/requests-toolbelt/default.nix
@@ -0,0 +1,70 @@
+{ lib
+, betamax
+, buildPythonPackage
+, fetchpatch
+, fetchPypi
+, mock
+, pyopenssl
+, pytestCheckHook
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "requests-toolbelt";
+  version = "0.9.1";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-loCJ1FhK1K18FxRU8KXG2sI5celHJSHqO21J1hCqb8A=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  checkInputs = [
+    betamax
+    mock
+    pytestCheckHook
+  ];
+
+  patches = [
+    (fetchpatch {
+      # Fix collections.abc deprecation warning, https://github.com/requests/toolbelt/pull/246
+      name = "fix-collections-abc-deprecation.patch";
+      url = "https://github.com/requests/toolbelt/commit/7188b06330e5260be20bce8cbcf0d5ae44e34eaf.patch";
+      sha256 = "sha256-pRkG77sNglG/KsRX6JaPgk4QxmmSBXypFRp/vNA3ot4=";
+    })
+    # Make pyopenssl optional
+    (fetchpatch {
+      url = "https://github.com/requests/toolbelt/commit/c7c1f8626b73e5715e6ecc1de0833fabdfd67323.patch";
+      sha256 = "sha256-OhE3nyYyKKRHs9rCq8EJYebwaYyjWjbvbtL79MIMMRc=";
+    })
+    # Make pyopenssl optional
+    (fetchpatch {
+      url = "https://github.com/requests/toolbelt/commit/2453f32f1c995e7b19294750a4177bc32326826e.patch";
+      sha256 = "sha256-qmKHp+aVeazZt8X+sZeYfZCB56SE0OvFvWCXRZtkCew=";
+    })
+  ];
+
+  disabledTests = [
+    # https://github.com/requests/toolbelt/issues/306
+    "test_no_content_length_header"
+    "test_read_file"
+    "test_reads_file_from_url_wrapper"
+    "test_x509_der"
+    "test_x509_pem"
+  ];
+
+  pythonImportsCheck = [
+    "requests_toolbelt"
+  ];
+
+  meta = with lib; {
+    description = "Toolbelt of useful classes and functions to be used with requests";
+    homepage = "http://toolbelt.rtfd.org";
+    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..57f4d5787c67
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/requests-unixsocket/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, 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=";
+  };
+
+  nativeBuildInputs = [
+    pbr
+  ];
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  checkInputs = [
+    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/0001-Prefer-NixOS-Nix-default-CA-bundles-over-certifi.patch b/nixpkgs/pkgs/development/python-modules/requests/0001-Prefer-NixOS-Nix-default-CA-bundles-over-certifi.patch
new file mode 100644
index 000000000000..de6a4b5c1b57
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/requests/0001-Prefer-NixOS-Nix-default-CA-bundles-over-certifi.patch
@@ -0,0 +1,60 @@
+From b36083efafec5a3c1c5864cd0b62367ddf3856ae Mon Sep 17 00:00:00 2001
+From: Keshav Kini <keshav.kini@gmail.com>
+Date: Sun, 16 May 2021 20:35:24 -0700
+Subject: [PATCH] Prefer NixOS/Nix default CA bundles over certifi
+
+Normally, requests gets its default CA bundle from the certifi
+package.  On NixOS and when using Nix on non-NixOS platforms, we would
+rather default to using our own certificate bundles controlled by the
+Nix/NixOS user.
+
+This commit overrides requests.certs.where(), which previously was
+just aliased to certifi.where(), so that now it does the following:
+
+- When run by Nix on non-NixOS, the environment variable
+  $NIX_SSL_CERT_FILE will point to the CA bundle we're using, so we
+  use that.
+
+- When running on NixOS, the CA bundle we're using has the static path
+  /etc/ssl/certs/ca-certificates.crt , so we use that.
+
+- Otherwise, we fall back to the original behavior of using certifi's
+  CA bundle.  Higher in the call stack, users of requests can also
+  explicitly specify a CA bundle to use, which overrides all this
+  logic.
+---
+ requests/certs.py | 18 +++++++++++++++++-
+ 1 file changed, 17 insertions(+), 1 deletion(-)
+
+diff --git a/requests/certs.py b/requests/certs.py
+index d1a378d7..faf462b7 100644
+--- a/requests/certs.py
++++ b/requests/certs.py
+@@ -12,7 +12,23 @@ If you are packaging Requests, e.g., for a Linux distribution or a managed
+ environment, you can change the definition of where() to return a separately
+ packaged CA bundle.
+ """
+-from certifi import where
++
++import os
++
++import certifi
++
++
++def where():
++    nix_ssl_cert_file = os.getenv("NIX_SSL_CERT_FILE")
++    if nix_ssl_cert_file and os.path.exists(nix_ssl_cert_file):
++        return nix_ssl_cert_file
++
++    nixos_ca_bundle = "/etc/ssl/certs/ca-certificates.crt"
++    if os.path.exists(nixos_ca_bundle):
++        return nixos_ca_bundle
++
++    return certifi.where()
++
+ 
+ if __name__ == '__main__':
+     print(where())
+-- 
+2.31.1
+
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..9b19c7b9c256
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/requests/default.nix
@@ -0,0 +1,93 @@
+{ lib
+, stdenv
+, brotlicffi
+, buildPythonPackage
+, certifi
+, chardet
+, charset-normalizer
+, fetchPypi
+, idna
+, pysocks
+, pytest-mock
+, pytest-xdist
+, pytestCheckHook
+, pythonOlder
+, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "requests";
+  version = "2.28.1";
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-fFWZsQL+3apmHIJsVqtP7ii/0X9avKHrvj5/GdfJeYM=";
+  };
+
+  patches = [
+    # Use the default NixOS CA bundle from the certifi package
+    ./0001-Prefer-NixOS-Nix-default-CA-bundles-over-certifi.patch
+  ];
+
+  propagatedBuildInputs = [
+    brotlicffi
+    certifi
+    charset-normalizer
+    idna
+    urllib3
+  ];
+
+  passthru.optional-dependencies = {
+    security = [];
+    socks = [
+      pysocks
+    ];
+    use_chardet_on_py3 = [
+      chardet
+    ];
+  };
+
+  checkInputs = [
+    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/";
+    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..2a34f73c0a7d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/requests_ntlm/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, ntlm-auth
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "requests_ntlm";
+  version = "1.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9189c92e8c61ae91402a64b972c4802b2457ce6a799d658256ebf084d5c7eb71";
+  };
+
+  propagatedBuildInputs = [ ntlm-auth requests ];
+
+  # Tests require networking
+  doCheck = false;
+
+  meta = with lib; {
+    description = "HTTP NTLM authentication support for python-requests";
+    homepage = "https://github.com/requests/requests-ntlm";
+    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..fa1b381126e2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/requirements-detector/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, astroid
+, buildPythonPackage
+, fetchFromGitHub
+, packaging
+, poetry-core
+, poetry-semver
+, pytestCheckHook
+, pythonOlder
+, toml
+}:
+
+buildPythonPackage rec {
+  pname = "requirements-detector";
+  version = "1.0.3";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "landscapeio";
+    repo = pname;
+    rev = version;
+    hash = "sha256-AEXCguf5Q9lU5ygFJUlbc1F637hkQ0wJybbRK7uhB9s=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    astroid
+    packaging
+    poetry-semver
+    toml
+  ];
+
+  checkInputs = [
+    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";
+    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..3d51f4741af6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/requirements-parser/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+, 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}";
+    sha256 = "sha256-e2dfVBMh1uGRMDw7OdPefO4/eRxc3BGwvy/D7u5ipkk=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    types-setuptools
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "requirements"
+  ];
+
+  meta = with lib; {
+    description = "Pip requirements file parser";
+    homepage = "https://github.com/davidfischer/requirements-parser";
+    license = licenses.bsd2;
+    maintainers = teams.determinatesystems.members;
+  };
+}
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..90dd3e680e4b
--- /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.3.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "bmcfee";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-kqRWW50VQO8H02vHgbdHo578c2jXX4fgF8AY6JuQOSI=";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    cython
+    numba
+  ];
+
+  checkInputs = [
+    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/resolvelib/default.nix b/nixpkgs/pkgs/development/python-modules/resolvelib/default.nix
new file mode 100644
index 000000000000..30345ae654e4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/resolvelib/default.nix
@@ -0,0 +1,39 @@
+{ 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";
+  };
+
+  checkInputs = [
+    commentjson
+    pytestCheckHook
+  ];
+
+  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..1343aa6cfd01
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/responses/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-localserver
+, pytestCheckHook
+, pythonOlder
+, requests
+, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "responses";
+  version = "0.21.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "getsentry";
+    repo = pname;
+    rev = version;
+    hash = "sha256-qYohrXrQkUBPo7yC+ZOwidDaCg/2nteXKAOCUvR4k2Q=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    urllib3
+  ];
+
+  checkInputs = [
+    pytest-localserver
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "responses"
+  ];
+
+  meta = with lib; {
+    description = "Python module for mocking out the requests Python library";
+    homepage = "https://github.com/getsentry/responses";
+    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..c144ed9adb28
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/respx/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, httpcore
+, httpx
+, flask
+, pytest-asyncio
+, pytestCheckHook
+, starlette
+, trio
+}:
+
+buildPythonPackage rec {
+  pname = "respx";
+  version = "0.19.2";
+
+  src = fetchFromGitHub {
+    owner = "lundberg";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-uNmSBJOQF4baq8AWzfwj0kinO19jr6Mp9Yblys/WmZs=";
+  };
+
+  propagatedBuildInputs = [
+    httpx
+  ];
+
+  checkInputs = [
+    httpcore
+    httpx
+    flask
+    pytest-asyncio
+    pytestCheckHook
+    starlette
+    trio
+  ];
+
+  pytestFlagsArray = [
+    "--asyncio-mode=legacy"
+  ];
+
+  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/";
+    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..d705a17a1ac4
--- /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.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "stevemcgrath";
+    repo = pname;
+    rev = version;
+    hash = "sha256-nCubAn9AASnCsvlYdk4gmkoORRlsYEbJ8JmlT11xYWU=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    arrow
+    python-box
+  ];
+
+  checkInputs = [
+    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..6e782b1bd336
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/restrictedpython/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest-mock
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "restrictedpython";
+  version = "5.2";
+  format = "setuptools";
+
+  src = fetchPypi {
+    pname = "RestrictedPython";
+    inherit version;
+    sha256 = "sha256-Y02h9sXBIqJi9DOwg+49F6mgOfjxs3eFl++0dGHNNhs=";
+  };
+
+  checkInputs = [
+    pytestCheckHook
+    pytest-mock
+  ];
+
+  pythonImportsCheck = [
+    "RestrictedPython"
+  ];
+
+  meta = with lib; {
+    description = "Restricted execution environment for Python to run untrusted code";
+    homepage = "https://github.com/zopefoundation/RestrictedPython";
+    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..0033794ef437
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/restructuredtext_lint/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, docutils
+, nose
+, testtools
+}:
+
+buildPythonPackage rec {
+  pname = "restructuredtext_lint";
+  version = "1.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-GyNcDJIjQatsUwOQiS656S+QubdQRgY+BHys+w8FDEU=";
+  };
+
+  checkInputs = [ nose testtools ];
+  propagatedBuildInputs = [ docutils ];
+
+  checkPhase = ''
+    nosetests --nocapture
+  '';
+
+  meta = {
+    description = "reStructuredText linter";
+    homepage = "https://github.com/twolfson/restructuredtext-lint";
+    license = lib.licenses.unlicense;
+  };
+}
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..9a4a0f13369e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/restview/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, docutils
+, readme_renderer
+, packaging
+, pygments
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "restview";
+  version = "3.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-K5iWEKrtL9Qtpk9s3FOc8+5wzjcLy6hy23JCGtUV3R4=";
+  };
+
+  propagatedBuildInputs = [
+    docutils
+    readme_renderer
+    packaging
+    pygments
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "restview"
+  ];
+
+  meta = {
+    description = "ReStructuredText viewer";
+    homepage = "https://mg.pov.lt/restview/";
+    license = lib.licenses.gpl3Only;
+    maintainers = with lib.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..f8c8c7f2b509
--- /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}";
+    sha256 = "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",' ""
+  '';
+
+  checkInputs = [
+    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..c9c61e34d8e6
--- /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;
+    sha256 = "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..03deee5bae21
--- /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
+  ];
+
+  checkInputs = [
+    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..c2f91c8fe1b1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/retry_decorator/default.nix
@@ -0,0 +1,21 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "retry_decorator";
+  version = "1.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "e1e8ad02e518fe11073f2ea7d80b6b8be19daa27a60a1838aff7c731ddcf2ebe";
+  };
+
+  meta = with lib; {
+    homepage = "https://github.com/pnpnpn/retry-decorator";
+    description = "Retry Decorator for python functions";
+    license = licenses.mit;
+  };
+
+}
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..5e2451affb90
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/retrying/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "retrying";
+  version = "1.3.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0fwp86xv0rvkncjdvy2mwcvbglw4w9k0fva25i7zx8kd19b3kh08";
+  };
+
+  propagatedBuildInputs = [ six ];
+
+  # doesn't ship tests in tarball
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/rholder/retrying";
+    description = "General-purpose retrying library";
+    license = licenses.asl20;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/retworkx/default.nix b/nixpkgs/pkgs/development/python-modules/retworkx/default.nix
new file mode 100644
index 000000000000..62b419def880
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/retworkx/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, pythonOlder
+, rustPlatform
+, fetchFromGitHub
+, libiconv
+  # Check inputs
+, pytestCheckHook
+, fixtures
+, graphviz
+, matplotlib
+, networkx
+, numpy
+, pydot
+}:
+
+buildPythonPackage rec {
+  pname = "retworkx";
+  version = "0.11.0";
+  format = "pyproject";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "Qiskit";
+    repo = "retworkx";
+    rev = version;
+    hash = "sha256-o3XPMTaiFH5cBtyqtW650wiDBElLvCmERr2XwwdPO1c=";
+  };
+
+  cargoDeps = rustPlatform.fetchCargoTarball {
+    inherit src;
+    name = "${pname}-${version}";
+    hash = "sha256-Zhk4m+HNtimhPWfiBLi9dqJ0fp2D8d0u9k6ROG0/jBo=";
+  };
+
+  nativeBuildInputs = with rustPlatform; [ cargoSetupHook maturinBuildHook ];
+
+  buildInputs = lib.optionals stdenv.isDarwin [ libiconv ];
+
+  pythonImportsCheck = [ "retworkx" ];
+  checkInputs = [
+    pytestCheckHook
+    fixtures
+    graphviz
+    matplotlib
+    networkx
+    numpy
+    pydot
+  ];
+
+  preCheck = ''
+    export TESTDIR=$(mktemp -d)
+    cp -r tests/ $TESTDIR
+    pushd $TESTDIR
+  '';
+  postCheck = "popd";
+
+  meta = with lib; {
+    description = "A python graph library implemented in Rust.";
+    homepage = "https://retworkx.readthedocs.io/en/latest/index.html";
+    downloadPage = "https://github.com/Qiskit/retworkx/releases";
+    changelog = "https://github.com/Qiskit/retworkx/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ drewrisinger ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rfc-bibtex/default.nix b/nixpkgs/pkgs/development/python-modules/rfc-bibtex/default.nix
new file mode 100644
index 000000000000..b9b7cdb76c4f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rfc-bibtex/default.nix
@@ -0,0 +1,20 @@
+{ lib, buildPythonApplication, fetchPypi, isPy3k }:
+
+buildPythonApplication rec {
+  pname = "rfc-bibtex";
+  version = "0.3.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "60419a2043ef37ac2438f3eae7a3207d0a4cb2dd56ab21697f874a35ee52927f";
+  };
+
+  disabled = !isPy3k;
+
+  meta = with lib; {
+    homepage = "https://github.com/iluxonchik/rfc-bibtex/";
+    description = "Generate Bibtex entries for IETF RFCs and Internet-Drafts";
+    license = licenses.mit;
+    maintainers = with maintainers; [ teto ];
+  };
+}
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..d821d672a294
--- /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 ];
+
+  checkInputs = [ 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/default.nix b/nixpkgs/pkgs/development/python-modules/rfc3986/default.nix
new file mode 100644
index 000000000000..f8fcc9aef7ab
--- /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;
+    sha256 = "sha256-l6rPnb1L/YKbqtbmMJ+mVzqvG+P2+nNcirBeRs7LJhw=";
+  };
+
+  propagatedBuildInputs = [
+    idna
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "rfc3986"
+  ];
+
+  meta = with lib; {
+    description = "Validating URI References per RFC 3986";
+    homepage = "https://rfc3986.readthedocs.org";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..e866df5d122e
--- /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=";
+  };
+
+  checkInputs = [
+    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..7bb390e79a22
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rfcat/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, future
+, ipython
+, numpy
+, pyserial
+, pyusb
+, hostPlatform
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "rfcat";
+  version = "1.9.5";
+
+  src = fetchFromGitHub {
+    owner = "atlas0fd00m";
+    repo = "rfcat";
+    rev = "v${version}";
+    sha256 = "1mmr7g7ma70sk6vl851430nqnd7zxsk7yb0xngwrdx9z7fbz2ck0";
+  };
+
+  propagatedBuildInputs = [
+    future
+    ipython
+    numpy
+    pyserial
+    pyusb
+  ];
+
+  postInstall = lib.optionalString hostPlatform.isLinux ''
+    mkdir -p $out/etc/udev/rules.d
+    cp etc/udev/rules.d/20-rfcat.rules $out/etc/udev/rules.d
+  '';
+
+  checkInputs = [
+    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..f966b7ccba9b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rflink/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, async-timeout
+, docopt
+, pyserial
+, pyserial-asyncio
+, setuptools
+, pytestCheckHook
+, pythonAtLeast
+}:
+
+buildPythonPackage rec {
+  pname = "rflink";
+  version = "0.0.63";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "aequitas";
+    repo = "python-rflink";
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-BNKcXtsBB90KQe4HXmfJ7H3yepk1dEkozSEy5v8KSAA=";
+  };
+
+  propagatedBuildInputs = [
+    async-timeout
+    docopt
+    pyserial
+    pyserial-asyncio
+    setuptools
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = lib.optionals (pythonAtLeast "3.10") [
+    # https://github.com/aequitas/python-rflink/issues/65
+    "tests/test_proxy.py"
+  ];
+
+  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";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
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..4c543febb813
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rich-rst/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, docutils
+, rich
+}:
+
+buildPythonPackage rec {
+  pname = "rich-rst";
+  version = "1.1.7";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "wasi-master";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-s48hdJo1LIRXTf+PeSBa6y/AH1NLmnyAafFydJ+exDk=";
+  };
+
+  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; [ jyooru ];
+  };
+}
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..36e7ca24fbdb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rich/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, CommonMark
+, dataclasses
+, poetry-core
+, pygments
+, typing-extensions
+, pytestCheckHook
+
+# for passthru.tests
+, enrich
+, httpie
+, rich-rst
+, textual
+}:
+
+buildPythonPackage rec {
+  pname = "rich";
+  version = "12.5.1";
+  format = "pyproject";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "Textualize";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-FjzvFx+A4DS2XeKBZ2DGRqudvH22AUSQJnIxKs2O0AU=";
+  };
+
+  nativeBuildInputs = [ poetry-core ];
+
+  propagatedBuildInputs = [
+    CommonMark
+    pygments
+  ] ++ lib.optional (pythonOlder "3.7") [
+    dataclasses
+  ] ++ lib.optional (pythonOlder "3.9") [
+    typing-extensions
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = lib.optionals stdenv.isDarwin [
+    # darwin console duplicates 3 of 4 lines
+    "test_rich_console_ex"
+  ];
+
+  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";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ris jyooru ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rig/default.nix b/nixpkgs/pkgs/development/python-modules/rig/default.nix
new file mode 100644
index 000000000000..bc43aac3551a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rig/default.nix
@@ -0,0 +1,29 @@
+{ lib, buildPythonPackage, fetchPypi
+, isPy35, isPy27
+, numpy, pytz, six, enum-compat, sentinel
+}:
+
+buildPythonPackage rec {
+  pname = "rig";
+  version = "2.4.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5a3896dbde3f291c5dd34769e7329ef5d5e4da34fee53479bd13dc5e5d540b8a";
+  };
+
+  propagatedBuildInputs = [ numpy pytz six sentinel enum-compat ];
+
+  # This is the list of officially supported versions. Other versions may work
+  # as well.
+  disabled = !(isPy27 || isPy35);
+
+  # Test Phase is only supported in development sources.
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A collection of tools for developing SpiNNaker applications";
+    homepage = "https://github.com/project-rig/rig";
+    license = licenses.gpl2;
+  };
+}
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..bffa6fed7d12
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ring-doorbell/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, oauthlib
+, pytestCheckHook
+, pythonOlder
+, pytz
+, requests
+, requests-mock
+, requests-oauthlib
+}:
+
+buildPythonPackage rec {
+  pname = "ring-doorbell";
+  version = "0.7.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "ring_doorbell";
+    inherit version;
+    hash = "sha256-Cn6Cq/JwhoQ+s5wCefXfzOpnUf+EhWDmcVTKb7+k7ys=";
+  };
+
+  propagatedBuildInputs = [
+    oauthlib
+    pytz
+    requests
+    requests-oauthlib
+  ];
+
+  checkInputs = [
+    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";
+    license = licenses.lgpl3Plus;
+    maintainers = with maintainers; [ graham33 ];
+  };
+}
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..adf327208955
--- /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.2.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "04drdvjjbh370csv2vb5zamg2aanxqkfm6w361qkybnra4g4g0dz";
+  };
+
+  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..5317b39f083a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ripser/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, fetchpatch
+, fetchPypi
+, pythonOlder
+, cython
+, numpy
+, scipy
+, scikit-learn
+, persim
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "ripser";
+  version = "0.6.1";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "335112a0f94532ccbe686db7826ee8d0714b32f65891abf92c0a02f3cb0fc5fd";
+  };
+
+  patches = [
+    (fetchpatch {
+      url = "https://github.com/scikit-tda/ripser.py/commit/4baa248994cee9a65d710fac91809bad8ed4e5f1.patch";
+      sha256 = "sha256-J/nxMOGOUiBueojJrUlAaXwktHDploYG/XL8/siF2kY=";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    cython
+    numpy
+    scipy
+    scikit-learn
+    persim
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    # specifically needed for darwin
+    export HOME=$(mktemp -d)
+    mkdir -p $HOME/.matplotlib
+    echo "backend: ps" > $HOME/.matplotlib/matplotlibrc
+  '';
+
+  meta = with lib; {
+    description = "A Lean Persistent Homology Library for Python";
+    homepage = "https://ripser.scikit-tda.org";
+    license = licenses.mit;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..b68fedbcfc0f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rising/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, isPy27
+, fetchFromGitHub
+, pytestCheckHook
+, pytest-cov
+, dill
+, numpy
+, pytorch
+, threadpoolctl
+, tqdm
+}:
+
+buildPythonPackage rec {
+  pname = "rising";
+  version = "0.2.1";
+
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "PhoenixDL";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "15wYWToXRae1cMpHWbJwzAp0THx6ED9ixQgL+n1v9PI=";
+  };
+
+  propagatedBuildInputs = [ numpy pytorch threadpoolctl tqdm ];
+  checkInputs = [ dill pytest-cov pytestCheckHook ];
+
+  disabledTests = [ "test_affine" ];  # deprecated division operator '/'
+
+  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..426ec492b042
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rjsmin/default.nix
@@ -0,0 +1,20 @@
+{ lib, buildPythonPackage, fetchPypi }:
+buildPythonPackage rec {
+  pname = "rjsmin";
+  version = "1.2.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-H5gr6OARQ4d3qUMHJ5tAE0o5NfwPB5MS7imXJbivVBE=";
+  };
+
+  # The package does not ship tests, and the setup machinary confuses
+  # tests auto-discovery
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "http://opensource.perlig.de/rjsmin/";
+    license = licenses.asl20;
+    description = "Javascript minifier written in python";
+  };
+}
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..928723897b5d
--- /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}";
+    sha256 = "sha256-e0MJjE4zgBPL+vt9EkgsdGrgqUyKK/1S9ZFxy56PUjc=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  checkInputs = [
+    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/rl-coach/default.nix b/nixpkgs/pkgs/development/python-modules/rl-coach/default.nix
new file mode 100644
index 000000000000..0724abec19a9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rl-coach/default.nix
@@ -0,0 +1,99 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, tensorflow
+, annoy
+, pillow
+, matplotlib
+, numpy
+, pandas
+, pygame
+, pyopengl
+, scipy
+, scikitimage
+, gym
+, bokeh
+, kubernetes
+, redis
+, minio
+, pytest
+, psutil
+}:
+
+buildPythonPackage rec {
+  version = "1.0.1";
+  pname = "rl-coach";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0i47hf0l76ydyrky6f8h760bfr0zg5g3vy675x6m6pgm9wrklkqc";
+  };
+
+  propagatedBuildInputs = [
+    tensorflow
+    annoy
+    pillow
+    matplotlib
+    numpy
+    pandas
+    pygame
+    pyopengl
+    scipy
+    scikitimage
+    gym
+    bokeh
+    kubernetes
+    redis
+    minio
+    psutil
+  ];
+
+  checkInputs = [
+    pytest
+  ];
+
+  # run only some tests that do not need any optional dependencies
+  # available tests: https://github.com/NervanaSystems/coach/tree/master/rl_coach/tests
+  testsToRun = [
+    # test only the tensorflow backend (not mxnet)
+    "architectures/tensorflow_components"
+    "agents"
+    "exploration_policies"
+    "filters"
+    "memories"
+    "utils"
+  ];
+  checkPhase = let
+    fullTestPaths = map (testfile: "rl_coach/tests/${testfile}") testsToRun;
+    escapedPaths = map lib.escapeShellArg fullTestPaths;
+    pytestArgs = builtins.concatStringsSep " " escapedPaths;
+  in
+  ''
+    pytest ${pytestArgs}
+  '';
+
+  postPatch = ''
+    # pinned to 8.0.1 for unknown reason, at least basic functionallity seems to work without it
+    # https://github.com/NervanaSystems/coach/pull/149#issuecomment-495915804
+    sed -i '/kubernetes/d' requirements.txt
+
+    # this is just an "intel-optimized" version of tensorflow, e.g. an implementation detail
+    sed -i 's/intel-tensorflow/tensorflow/g' setup.py
+
+    # backports of python3 features not needed
+    # https://github.com/NervanaSystems/coach/issues/324
+    sed -i '/futures/d' requirements.txt
+  '';
+
+  disabled = pythonOlder "3.5"; # minimum required version
+
+  meta = with lib; {
+    description = "Enables easy experimentation with state of the art Reinforcement Learning algorithms";
+    homepage = "https://nervanasystems.github.io/coach/";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ timokau ];
+    # pythonPackages.gym is too new
+    broken = true; # since 2020-04-20
+  };
+}
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..adff2f0ac5d3
--- /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.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-hAG0idz5VkGVvxaJWoxlVZ8myeHF6ndDxB0SyJm7qV8=";
+  };
+
+  buildInputs = [
+    chex
+    jaxlib
+    distrax
+    tensorflow-probability
+  ];
+
+  checkInputs = [
+    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..e0736cdf0506
--- /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}";
+    sha256 = "sha256-GRCq4FU38e08fREg5fweig5Y60jLT2k3Yj1Jk8OA6XY=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "'setuptools-markdown'" ""
+  '';
+
+  propagatedBuildInputs = [
+    eth-utils
+  ];
+
+  checkInputs = [
+    hypothesis
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "rlp" ];
+
+  meta = with lib; {
+    description = "RLP serialization library";
+    homepage = "https://github.com/ethereum/pyrlp";
+    license = licenses.mit;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..d05bb5beede5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rmrl/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, poetry-core
+, pdfrw
+, reportlab
+, svglib
+, xdg
+}:
+
+buildPythonPackage rec {
+  pname = "rmrl";
+  version = "0.2.1";
+
+  disabled = pythonOlder "3.7";
+
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c532bef4168350e6ab17cf37c6481dc12b6a78e007c073503f082f36215b71c9";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    pdfrw
+    reportlab
+    svglib
+    xdg
+  ];
+
+  # upstream has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "rmrl" ];
+
+  meta = {
+    description = "Render reMarkable documents to PDF";
+    homepage = "https://github.com/rschroll/rmrl";
+    license = lib.licenses.gpl3Plus;
+    maintainers = with lib.maintainers; [ dotlambda ];
+  };
+}
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..a64c035dbc95
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rnginline/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, lxml
+, docopt
+, six
+, pytestCheckHook
+, mock
+, fetchpatch
+}:
+
+buildPythonPackage rec {
+  pname = "rnginline";
+  version = "0.0.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-j4W4zwHA4yA6iAFVa/LDKp00eeCX3PbmWkjd2LSUGfk=";
+  };
+
+  patches = [
+    # Fix failing tests. Should be included in releases after 0.0.2
+    # https://github.com/h4l/rnginline/issues/3
+    (fetchpatch {
+      url = "https://github.com/h4l/rnginline/commit/b1d1c8cda2a17d46627309950f2442021749c07e.patch";
+      sha256 = "sha256-XbisEwun2wPOp7eqW2YDVdayJ4sjAMG/ezFwgoCKe9o=";
+      name = "fix_tests_failing_collect.patch";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    docopt
+    lxml
+    six
+  ];
+
+  checkInputs = [
+    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..df8222bf0bcc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rns/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, cryptography
+, fetchFromGitHub
+, netifaces
+, pyserial
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "rns";
+  version = "0.3.11";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "markqvist";
+    repo = "Reticulum";
+    rev = "refs/tags/${version}";
+    hash = "sha256-LANk104sO9we7n681a+yVmWOcd9SBQ/kiQAN38xaq80=";
+  };
+
+  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";
+    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..504a5ac557ea
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/robomachine/default.nix
@@ -0,0 +1,30 @@
+{ stdenv, lib, fetchPypi, buildPythonPackage, pyparsing, robotframework, allpairspy }:
+
+buildPythonPackage rec {
+  pname = "RoboMachine";
+  version = "0.9.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "4251d405759a38f1e665acc245dcbcdec319376718169a73c57560183370fe0e";
+  };
+
+  propagatedBuildInputs = [ pyparsing robotframework allpairspy ];
+
+  # Remove Windows .bat files
+  postInstall = ''
+    rm "$out/bin/"*.bat
+  '';
+
+  postPatch = ''
+    substituteInPlace setup.py --replace "argparse" ""
+  '';
+
+  meta = with lib; {
+    broken = true;
+    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..8dfbb32fe08d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/robotframework-databaselibrary/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, robotframework
+}:
+
+buildPythonPackage rec {
+  version = "1.2.4";
+  pname = "robotframework-databaselibrary";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "627d872b3dda6a308a650ac9e676dadedf9c294e4ef70ad207cbb86b78eb8847";
+  };
+
+  # 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-requests/default.nix b/nixpkgs/pkgs/development/python-modules/robotframework-requests/default.nix
new file mode 100644
index 000000000000..a81c24db7a78
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/robotframework-requests/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, unittest2
+, robotframework
+, lxml
+, requests
+}:
+
+buildPythonPackage rec {
+  version = "0.9.3";
+  pname = "robotframework-requests";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-C754uOezq5vsSWilG/N5XiZxABp4Cyt+vyriFSmI2jU=";
+  };
+
+  buildInputs = [ unittest2 ];
+  propagatedBuildInputs = [ robotframework lxml requests ];
+
+  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;
+  };
+
+}
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..806387f1095e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/robotframework-seleniumlibrary/default.nix
@@ -0,0 +1,31 @@
+{ stdenv, lib, buildPythonPackage, fetchFromGitHub, python, robotframework, selenium, mockito, robotstatuschecker, approvaltests }:
+
+buildPythonPackage rec {
+  version = "6.0.0";
+  pname = "robotframework-seleniumlibrary";
+
+  # no tests included in PyPI tarball
+  src = fetchFromGitHub {
+    owner = "robotframework";
+    repo = "SeleniumLibrary";
+    rev = "v${version}";
+    sha256 = "1rjzz6mrx4zavcck2ry8269rf3dkvvs1qfa9ra7dkppbarrjin3f";
+  };
+
+  propagatedBuildInputs = [ robotframework selenium ];
+  checkInputs = [ mockito robotstatuschecker approvaltests ];
+
+  # Only execute Unit Tests. Acceptance Tests require headlesschrome, currently
+  # not available in nixpkgs
+  checkPhase = ''
+    ${python.interpreter} utest/run.py
+  '';
+
+  meta = with lib; {
+    broken = (stdenv.isLinux && stdenv.isAarch64) || stdenv.isDarwin;
+    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..2c2fe3945b09
--- /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 [])," ""
+  '';
+
+  checkInputs = [ 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 = [ maintainers.costrouc ];
+  };
+}
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..4f925c341dcf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/robotframework/default.nix
@@ -0,0 +1,26 @@
+{ lib, fetchFromGitHub, buildPythonPackage, jsonschema }:
+
+buildPythonPackage rec {
+  pname = "robotframework";
+  version = "5.0.1";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-aJUXqY6OFlbdLIr5Qpg27mGFm6hD+WvCrqXmf204WUo=";
+  };
+
+  checkInputs = [ 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..74810c7761f5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/robotstatuschecker/default.nix
@@ -0,0 +1,27 @@
+{ lib, buildPythonPackage, fetchFromGitHub, python, robotframework }:
+
+buildPythonPackage rec {
+  version = "2.1.0";
+  pname = "robotstatuschecker";
+
+  # no tests included in PyPI tarball
+  src = fetchFromGitHub {
+    owner = "robotframework";
+    repo = "statuschecker";
+    rev = "refs/tags/v${version}";
+    sha256 = "0hy1390j3l4kkfna9x9xax4y5mqaa3hdndv3fiyg9wr5f7sx3wnz";
+  };
+
+  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..6e7897413ec2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/robotsuite/default.nix
@@ -0,0 +1,27 @@
+{ lib, buildPythonPackage, fetchPypi
+, unittest2, lxml, robotframework
+}:
+
+buildPythonPackage rec {
+  pname = "robotsuite";
+  version = "2.3.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-iugVKUPl6HTTO8K1EbSqAk1fl/fsEPoOcsOnnAgcEas=";
+  };
+
+  buildInputs = [ unittest2 ];
+  propagatedBuildInputs = [ robotframework lxml ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace robotframework-python3 robotframework
+  '';
+
+  meta = with lib; {
+    description = "Python unittest test suite for Robot Framework";
+    homepage = "https://github.com/collective/robotsuite/";
+    license = licenses.gpl3;
+  };
+}
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..29970e7fd281
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rocket-errbot/default.nix
@@ -0,0 +1,24 @@
+{ 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 {
+    url = "https://github.com/errbotio/rocket/pull/1.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..c82eda6e35c0
--- /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 ];
+
+  checkInputs = [ 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..e584fcdda879
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rokuecp/default.nix
@@ -0,0 +1,79 @@
+{ lib
+, aiohttp
+, aresponses
+, awesomeversion
+, backoff
+, buildPythonPackage
+, cachetools
+, fetchFromGitHub
+, poetry-core
+, pytest-asyncio
+, pytest-freezegun
+, pytestCheckHook
+, pythonOlder
+, xmltodict
+, yarl
+}:
+
+buildPythonPackage rec {
+  pname = "rokuecp";
+  version = "0.17.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "ctalkington";
+    repo = "python-rokuecp";
+    rev = version;
+    hash = "sha256-M4eZzFphhc96Pf1bspD+Hvl9SUN1N72xnxdtVFiPc78=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    backoff
+    cachetools
+    xmltodict
+    awesomeversion
+    yarl
+  ];
+
+  checkInputs = [
+    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";
+    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..93a0349b9bdc
--- /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 = "0.16.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-AjE9/GBxDsc2qwM9D4yWnYV6i5kc1n4MGpFiDooE7eI=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    six
+  ];
+
+  checkInputs = [
+    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..dff19589dcc4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/roombapy/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, amqtt
+, buildPythonPackage
+, fetchFromGitHub
+, paho-mqtt
+, poetry-core
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "roombapy";
+  version = "1.6.5";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "pschmitt";
+    repo = "roombapy";
+    rev = version;
+    sha256 = "sha256-Xjeh29U+FCzI5n/i5s6wC0B88Ktmb8pnNDdOzCiKWi4=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    paho-mqtt
+  ];
+
+  checkInputs = [
+    amqtt
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    # hbmqtt was replaced by amqtt
+    substituteInPlace tests/test_roomba_integration.py \
+      --replace "from hbmqtt.broker import Broker" "from amqtt.broker import Broker"
+  '';
+
+  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";
+    license = licenses.mit;
+    maintainers = with maintainers; [ justinas ];
+  };
+}
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..84909ca05659
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/roonapi/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, ifaddr
+, poetry-core
+, pythonOlder
+, requests
+, six
+, websocket-client
+}:
+
+buildPythonPackage rec {
+  pname = "roonapi";
+  version = "0.1.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "pavoni";
+    repo = "pyroon";
+    rev = version;
+    sha256 = "sha256-GEgm250uALTXIEMBWmluqGw/dw2TfGmUIcItfzonGkU=";
+  };
+
+  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";
+    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..21d5886efe21
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rope/default.nix
@@ -0,0 +1,33 @@
+{ lib, buildPythonPackage, fetchPypi, fetchpatch, nose }:
+
+buildPythonPackage rec {
+  pname = "rope";
+  version = "0.18.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "786b5c38c530d4846aa68a42604f61b4e69a493390e3ca11b88df0fbfdc3ed04";
+  };
+
+  patches = [
+    # Python 3.9 ast changes
+    (fetchpatch {
+      url = "https://github.com/python-rope/rope/pull/333.patch";
+      excludes = [ ".github/workflows/main.yml" ];
+      sha256 = "1gq7n1zs18ndmv0p8jg1h5pawabi1m9m9z2w5hgidvqmpmcziky0";
+    })
+  ];
+
+  checkInputs = [ nose ];
+  checkPhase = ''
+    # tracked upstream here https://github.com/python-rope/rope/issues/247
+    NOSE_IGNORE_FILES=type_hinting_test.py nosetests ropetest
+  '';
+
+  meta = with lib; {
+    description = "Python refactoring library";
+    homepage = "https://github.com/python-rope/rope";
+    maintainers = with maintainers; [ goibhniu ];
+    license = licenses.gpl3Plus;
+  };
+}
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..65a80e399d1e
--- /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 = "6.8";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "JonathanSalwan";
+    repo = "ROPgadget";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-hnqjyZC3RJNQf8JdtaQ5L3PU+96p4cxdd+P4YlW9jjI=";
+  };
+
+  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..681ecfaefe3b
--- /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.7";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "sashs";
+    repo = "Ropper";
+    rev = "v${version}";
+    hash = "sha256-3tWWIYqh/G/b7Z6BMua5bRvtSh4SibT6pv/NArhmqPE=";
+  };
+
+  propagatedBuildInputs = [
+    capstone
+    filebytes
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "ropper"
+  ];
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    description = "Show information about files in different file formats";
+    homepage = "https://scoding.de/ropper/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ bennofs ];
+  };
+}
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..bdf6f0f31993
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rpcq/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, msgpack
+, numpy
+, pytest-asyncio
+, pytestCheckHook
+, python-rapidjson
+, pythonOlder
+, pyzmq
+, ruamel-yaml
+}:
+
+buildPythonPackage rec {
+  pname = "rpcq";
+  version = "3.10.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "rigetti";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-J7jtGXJIF3jp0a0IQZmSR4TWf9D02Luau+Bupmi/d68=";
+  };
+
+  propagatedBuildInputs = [
+    msgpack
+    python-rapidjson
+    pyzmq
+    ruamel-yaml
+  ];
+
+  checkInputs = [
+    numpy
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "msgpack>=0.6,<1.0" "msgpack"
+  '';
+
+  disabledTests = [
+    # Test doesn't work properly on Hydra
+    "test_client_backlog"
+  ];
+
+  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/rpi-bad-power/default.nix b/nixpkgs/pkgs/development/python-modules/rpi-bad-power/default.nix
new file mode 100644
index 000000000000..205cefad6143
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rpi-bad-power/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, 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";
+  };
+
+  pythonImportsCheck = [
+    "rpi_bad_power"
+  ];
+
+  checkInputs = [
+    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..2618f9f0ea91
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rpi-gpio/default.nix
@@ -0,0 +1,23 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "rpi-gpio";
+  version = "0.7.1";
+
+  src = fetchPypi {
+    pname = "RPi.GPIO";
+    inherit version;
+    sha256 = "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;
+    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..3adf7a35ea74
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rpi-gpio2/default.nix
@@ -0,0 +1,28 @@
+{ lib, libgpiod, buildPythonPackage, fetchurl }:
+
+buildPythonPackage rec {
+  pname = "rpi-gpio2";
+  version = "0.3.0a3";
+
+  # PyPi source does not work for some reason
+  src = fetchurl {
+    url = "https://github.com/underground-software/RPi.GPIO2/archive/refs/tags/v${version}.tar.gz";
+    sha256 = "sha256-AY1AD2Yu66eJUqB4OStZnUeEhmISLVRrTOAcmEHjuOM=";
+  };
+
+  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..c404317f027e
--- /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.0";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "RPLCD";
+    sha256 = "sha256-AIEiL+IPU76DF+P08c5qokiJcZdNNDJ/Jjng2Z292LY=";
+  };
+
+  # 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..33f8547496db
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rply/default.nix
@@ -0,0 +1,27 @@
+{ lib, pytest, fetchFromGitHub, buildPythonPackage, appdirs }:
+
+buildPythonPackage rec {
+  pname = "rply";
+  version = "0.7.7";
+
+  src = fetchFromGitHub {
+    owner = "alex";
+    repo = "rply";
+    rev = "v${version}";
+    sha256 = "1qv37hn7hhxd388znri76g0zjxsbwhxhcaic94dvw9pq4l60vqp6";
+  };
+
+  propagatedBuildInputs = [ appdirs ];
+
+  checkInputs = [ pytest ];
+  checkPhase = ''
+    HOME=$(mktemp -d) py.test tests
+  '';
+
+  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..e5d656795c2a
--- /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 = "1.0.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "e56cfc10e1a7d953b1890d81652a89400c614f4cdd9909464aece434d93c3a3e";
+  };
+
+  # 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 = teams.determinatesystems.members;
+  };
+}
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..ac5eb3a90e75
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rpy2/default.nix
@@ -0,0 +1,95 @@
+{ 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.3";
+    pname = "rpy2";
+
+    disabled = isPyPy;
+    src = fetchPypi {
+      inherit version pname;
+      sha256 = "sha256-U6CS1ItE9GQo+zDLMVVmTW0vevCOvExF35jfTEWkLMs=";
+    };
+
+    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;
+
+    checkInputs = [
+      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..a8849fd17cd3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rpyc/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, plumbum
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "rpyc";
+  version = "5.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "tomerfiliba";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-Xeot4QEgTZjvdO0ydmKjccp6zwC93Yp/HkRlSgyDf8k=";
+  };
+
+  propagatedBuildInputs = [
+    plumbum
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Disable tests that requires network access
+    "test_api"
+    "test_pruning"
+    "test_rpyc"
+    # Test is outdated
+    # ssl.SSLError: [SSL: NO_CIPHERS_AVAILABLE] no ciphers available (_ssl.c:997)
+    "test_ssl_conenction"
+  ];
+
+  pythonImportsCheck = [
+    "rpyc"
+  ];
+
+  meta = with lib; {
+    description = "Remote Python Call (RPyC), a transparent and symmetric RPC library";
+    homepage = "https://rpyc.readthedocs.org";
+    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..24001f176ae2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rq/default.nix
@@ -0,0 +1,29 @@
+{ lib, fetchFromGitHub, buildPythonPackage, isPy27, click, redis }:
+
+buildPythonPackage rec {
+  pname = "rq";
+  version = "1.10.1";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "rq";
+    repo = "rq";
+    rev = "v${version}";
+    sha256 = "1f4fi1rvn97d2b524q45k6s10b007pr23k0mf44q7hy8q4vnjmh5";
+  };
+
+  # test require a running redis rerver, which is something we can't do yet
+  doCheck = false;
+
+  pythonImportsCheck = [ "rq" ];
+
+  propagatedBuildInputs = [ click redis ];
+
+  meta = with lib; {
+    description = "A simple, lightweight library for creating background jobs, and processing them";
+    homepage = "https://github.com/nvie/rq/";
+    maintainers = with maintainers; [ mrmebelman ];
+    license = licenses.bsd2;
+  };
+}
+
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..ccfd237862d7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rsa/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, unittest2
+, pyasn1
+, mock
+, isPy3k
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "rsa";
+  version = "4.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5c6bd9dc7a543b7fe4304a631f8a8a3b674e2bbfc49c2ae96200cdbe55df6b17";
+  };
+
+  checkInputs = [ unittest2 mock ];
+  propagatedBuildInputs = [ pyasn1 ];
+
+  preConfigure = lib.optionalString (isPy3k && pythonOlder "3.7") ''
+    substituteInPlace setup.py --replace "open('README.md')" "open('README.md',encoding='utf-8')"
+  '';
+
+  # No tests in archive
+  doCheck = false;
+
+  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/rst2ansi/default.nix b/nixpkgs/pkgs/development/python-modules/rst2ansi/default.nix
new file mode 100644
index 000000000000..e161f56d3177
--- /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;
+    sha256 = "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/rstcheck-core/default.nix b/nixpkgs/pkgs/development/python-modules/rstcheck-core/default.nix
new file mode 100644
index 000000000000..b296f5dc168d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rstcheck-core/default.nix
@@ -0,0 +1,64 @@
+{ 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.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "rstcheck";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-XNr+prK9VDP66ZaFvh3Qrx+eJs6mnVO8lvoMC/qrCLs=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    docutils
+    importlib-metadata
+    pydantic
+    types-docutils
+    typing-extensions
+  ];
+
+  checkInputs = [
+    mock
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'types-docutils = ">=0.18, <0.19"' 'types-docutils = ">=0.18"' \
+      --replace 'docutils = ">=0.7, <0.19"' 'docutils = ">=0.7"'
+  '';
+
+  pythonImportsCheck = [
+    "rstcheck_core"
+  ];
+
+  meta = with lib; {
+    description = "Library for checking syntax of reStructuredText";
+    homepage = "https://github.com/rstcheck/rstcheck-core";
+    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..b5a3ccefc08c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rstcheck/default.nix
@@ -0,0 +1,74 @@
+{ lib
+, buildPythonPackage
+, colorama
+, docutils
+, fetchFromGitHub
+, importlib-metadata
+, poetry-core
+, pydantic
+, pytestCheckHook
+, pythonOlder
+, rstcheck-core
+, shellingham
+, typer
+, types-docutils
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "rstcheck";
+  version = "6.0.0.post1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "rstcheck";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-Ljg1cciT9qKL9xtBxQ8OLygDpV/1yR5XiJOzHrLr6xw=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    colorama
+    docutils
+    rstcheck-core
+    shellingham
+    types-docutils
+    typing-extensions
+    pydantic
+    typer
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    typing-extensions
+    importlib-metadata
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'types-docutils = ">=0.18, <0.19"' 'types-docutils = ">=0.18"'
+  '';
+
+  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";
+    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..1d9b8114df7b
--- /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.1";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "spatialaudio";
+    repo = "python-rtmixer";
+    rev = version;
+    sha256 = "1bvgzzxiypvvb3qacbcry6761x9sk3dnx7jga7pli63f69vakg4y";
+    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..2d2aef6f7226
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rtoml/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, libiconv
+, pytestCheckHook
+, pythonOlder
+, rustPlatform
+, setuptools-rust
+}:
+
+buildPythonPackage rec {
+  pname = "rtoml";
+  version = "0.7";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "samuelcolvin";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-h4vY63pDkrMHt2X244FssLxHsphsfjNd6gnVFUeZZTY=";
+  };
+
+  cargoDeps = rustPlatform.fetchCargoTarball {
+    inherit src;
+    name = "${pname}-${version}";
+    sha256 = "05fwcs6w023ihw3gyihzbnfwjaqy40d6h0z2yas4kqkkvz9x4f8j";
+  };
+
+  nativeBuildInputs = with rustPlatform; [
+    setuptools-rust
+    rust.rustc
+    rust.cargo
+    cargoSetupHook
+  ];
+
+  buildInputs = [
+    libiconv
+  ];
+
+  pythonImportsCheck = [
+    "rtoml"
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    cd tests
+  '';
+
+  pytestFlagsArray = [
+    "-W"
+    "ignore::DeprecationWarning"
+  ];
+
+  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/rtslib/default.nix b/nixpkgs/pkgs/development/python-modules/rtslib/default.nix
new file mode 100644
index 000000000000..ac0c0fb692ba
--- /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.75";
+
+  src = fetchFromGitHub {
+    owner = "open-iscsi";
+    repo = "${pname}-fb";
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-qBlr4K+LeJIC6Hwy6dN9n/VjHIUYCy8pLlRtPvooWyE=";
+  };
+
+  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..2c8fd9e40ba2
--- /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
+  ];
+
+  checkInputs = [
+    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..2db8a335e895
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ruamel-base/default.nix
@@ -0,0 +1,27 @@
+{ 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" ];
+
+  meta = with lib; {
+    description = "Common routines for ruamel packages";
+    homepage = "https://sourceforge.net/projects/ruamel-base/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..143452274abb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ruamel-yaml-clib/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchhg
+}:
+
+buildPythonPackage rec {
+  pname = "ruamel-yaml-clib";
+  version = "0.2.6";
+  format = "setuptools";
+
+  src = fetchhg {
+    url = "http://hg.code.sf.net/p/ruamel-yaml-clib/code";
+    rev = version;
+    sha256 = "sha256-mpkh9JhYKRX47jfKprjt1Vpm9DMz8LcWzkotJ+/xoxY=";
+  };
+
+  # no tests
+  doCheck = false;
+
+  # circular depedency with ruamel-yaml
+  # 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-clib/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..31d76d78ac7e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ruamel-yaml/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, ruamel-base
+, ruamel-yaml-clib
+, isPyPy
+}:
+
+buildPythonPackage rec {
+  pname = "ruamel-yaml";
+  version = "0.17.21";
+
+  src = fetchPypi {
+    pname = "ruamel.yaml";
+    inherit version;
+    sha256 = "sha256-i3zml6LyEnUqNcGsQURx3BbEJMlXO+SSa1b/P10jt68=";
+  };
+
+  # 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/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..714ffebd8a4e
--- /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 ];
+
+  checkInputs = [
+    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/runway-python/default.nix b/nixpkgs/pkgs/development/python-modules/runway-python/default.nix
new file mode 100644
index 000000000000..ffe21701dd2b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/runway-python/default.nix
@@ -0,0 +1,91 @@
+{ lib
+, buildPythonPackage
+, pythonAtLeast
+, fetchFromGitHub
+, colorcet
+, cryptography
+, flask
+, flask-compress
+, flask-cors
+, flask-sockets
+, gevent
+, imageio
+, numpy
+, pillow
+, pyopenssl
+, scipy
+, six
+, unidecode
+, urllib3
+, wget
+, deepdiff
+, pytestCheckHook
+, pytest-cov
+, pythonOlder
+, websocket-client
+}:
+
+buildPythonPackage rec {
+  pname = "runway-python";
+  version = "0.6.1";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "runwayml";
+    repo = "model-sdk";
+    rev = version;
+    sha256 = "1ww2wai1qnly8i7g42vhkkbs4yp7wi9x4fjdxsg9fl3izjra0zs2";
+  };
+
+  propagatedBuildInputs = [
+    colorcet
+    cryptography
+    flask
+    flask-compress
+    flask-cors
+    flask-sockets
+    gevent
+    imageio
+    numpy
+    pillow
+    pyopenssl
+    scipy
+    six
+    unidecode
+    urllib3
+    wget
+  ];
+
+  pythonImportsCheck = [
+    "runway"
+  ];
+
+  checkInputs = [
+    deepdiff
+    pytestCheckHook
+    pytest-cov
+    websocket-client
+  ];
+
+  disabledTests = [
+    # these tests require network
+    "test_file_deserialization_remote"
+    "test_file_deserialization_absolute_directory"
+    "test_file_deserialization_remote_directory"
+    # Fails with a decoding error at the moment
+    "test_inference_async"
+  ] ++ lib.optionals (pythonAtLeast "3.9") [
+     # AttributeError: module 'base64' has no attribute 'decodestring
+     # https://github.com/runwayml/model-sdk/issues/99
+     "test_image_serialize_and_deserialize"
+     "test_segmentation_serialize_and_deserialize_colormap"
+     "test_segmentation_serialize_and_deserialize_labelmap"
+  ];
+
+  meta = {
+    description = "Helper library for creating Runway models";
+    homepage = "https://github.com/runwayml/model-sdk";
+    license = with lib.licenses; [ mit ];
+    maintainers = with lib.maintainers; [ prusnak ];
+  };
+}
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..bb0728bd2639
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ruyaml/default.nix
@@ -0,0 +1,50 @@
+{ 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
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  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..8d7277823a7b
--- /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";
+  };
+
+  checkInputs = [ 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..9d59efd9bd35
--- /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
+  ];
+
+  checkInputs = [
+    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..8c365070857c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rzpipe/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "rzpipe";
+  version = "0.4.0";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-RSgBwmtpI58caRWov+cDWLKhti+7r70VxJbCxJveEiM=";
+  };
+
+  # No native rz_core library
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "rzpipe"
+  ];
+
+  meta = with lib; {
+    description = "Python interface for rizin";
+    homepage = "https://rizin.re";
+    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..13431569d505
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/s3-credentials/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, click
+, click-default-group
+, boto3
+, pytestCheckHook
+, hypothesis
+, pytest-mock
+}:
+
+buildPythonPackage rec {
+  pname = "s3-credentials";
+  version = "0.12.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "simonw";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-w0pwQidSAh/CQPVbv4UocbbETyyOT/rcNFE1ixYz4lY=";
+  };
+
+  propagatedBuildInputs = [
+    click
+    click-default-group
+    boto3
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    hypothesis
+    pytest-mock
+  ];
+
+  pythonImportsCheck = [
+    "s3_credentials"
+  ];
+
+  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..bb4d5828284f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/s3fs/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, stdenv
+, aiobotocore
+, aiohttp
+, buildPythonPackage
+, docutils
+, fetchPypi
+, fsspec
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "s3fs";
+  version = "2022.5.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-tAo8v6+Ay6uvDjMjMRF8ysaSkO/aw0cYT7OrYAP3BGU=";
+  };
+
+  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;
+    homepage = "https://github.com/dask/s3fs/";
+    description = "A Pythonic file interface for S3";
+    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..acd739d854e9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/s3transfer/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, botocore
+, buildPythonPackage
+, docutils
+, fetchFromGitHub
+, mock
+, pytestCheckHook
+, pythonOlder
+, stdenv
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "s3transfer";
+  version = "0.6.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "boto";
+    repo = pname;
+    rev = version;
+    hash = "sha256-LM1/joc6TeyLLeAHpuCTz2vgpQ3TMkHrKitfiUp5ZrY=";
+  };
+
+  propagatedBuildInputs = [ botocore ];
+
+  buildInputs = [ docutils mock pytestCheckHook wheel ];
+
+  disabledTestPaths = [
+    # Requires network access
+    "tests/integration/test_copy.py"
+    "tests/integration/test_delete.py"
+    "tests/integration/test_download.py"
+    "tests/integration/test_processpool.py"
+    "tests/integration/test_s3transfer.py"
+    "tests/integration/test_upload.py"
+  ] ++
+  # 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";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
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..4ae2b044ab87
--- /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.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-ei/SnVg4Oy6cBBPxg14lMMQBgbNR4Fg0aa+8sVBTY0Y=";
+  };
+
+  # 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..ff432f6f3a00
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sacn/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+}:
+
+buildPythonPackage rec {
+  pname = "sacn";
+  version = "1.8.1";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "cdc9af732f4ca5badbf732499775575c4f815c73f857720c0a61a3fc80257f7a";
+  };
+
+  # no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "sacn" ];
+
+  meta = with lib; {
+    description = "A simple ANSI E1.31 (aka sACN) module for python";
+    homepage = "https://github.com/Hundemeier/sacn";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
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..4ffea014001b
--- /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 ];
+
+  checkInputs = [ 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/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/safety/default.nix b/nixpkgs/pkgs/development/python-modules/safety/default.nix
new file mode 100644
index 000000000000..5394a2af99a7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/safety/default.nix
@@ -0,0 +1,72 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, setuptools
+, click
+, requests
+, packaging
+, dparse
+, ruamel-yaml
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "safety";
+  version = "2.1.1";
+
+  disabled = pythonOlder "3.6";
+
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-28Xf+i5H2nbMQ9/oy7v8qZ0pEY0MbFTfz6EcK9NJ3/Y=";
+  };
+
+  postPatch = ''
+    substituteInPlace safety/safety.py \
+      --replace "telemetry=True" "telemetry=False"
+    substituteInPlace safety/cli.py \
+      --replace "telemetry', default=True" "telemetry', default=False"
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    setuptools
+    click
+    requests
+    packaging
+    dparse
+    ruamel-yaml
+  ];
+
+  checkInputs = [
+    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..77d4cc5aa280
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sagemaker/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, attrs
+, boto3
+, google-pasta
+, importlib-metadata
+, numpy
+, protobuf
+, protobuf3-to-dict
+, smdebug-rulesconfig
+, pandas
+, pathos
+, packaging
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "sagemaker";
+  version = "2.103.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-0iXIUWvoL6+kT+KaJq7yzdEzYA0orKBbQkGAVUYcSKk=";
+  };
+
+  propagatedBuildInputs = [
+    attrs
+    boto3
+    google-pasta
+    importlib-metadata
+    numpy
+    packaging
+    pathos
+    protobuf
+    protobuf3-to-dict
+    smdebug-rulesconfig
+    pandas
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "attrs==20.3.0" "attrs>=20.3.0"
+  '';
+
+  postFixup = ''
+    [ "$($out/bin/sagemaker-upgrade-v2 --help 2>&1 | grep -cim1 'pandas failed to import')" -eq "0" ]
+  '';
+
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "sagemaker"
+    "sagemaker.lineage.visualizer"
+  ];
+
+  meta = with lib; {
+    description = "Library for training and deploying machine learning models on Amazon SageMaker";
+    homepage = "https://github.com/aws/sagemaker-python-sdk/";
+    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..fcb51c4303a8
--- /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";
+  };
+
+  checkInputs = [ 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..99424bbc67c2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/samplerate/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, numpy
+, pkgs
+, fetchFromGitHub
+}:
+
+buildPythonPackage {
+  pname = "scikits.samplerate";
+  version = "0.3.3";
+
+  src = fetchFromGitHub {
+    owner = "cournape";
+    repo = "samplerate";
+    rev = "a536c97eb2d6195b5f266ea3cc3a35364c4c2210";
+    sha256 = "sha256-7x03Q6VXfP9p8HCk15IDZ9HeqTyi5F1AlGX/otdh8VU=";
+  };
+
+  buildInputs =  [ pkgs.libsamplerate ];
+  propagatedBuildInputs = [ numpy ];
+
+  preConfigure = ''
+     cat > site.cfg << END
+     [samplerate]
+     library_dirs=${pkgs.libsamplerate.out}/lib
+     include_dirs=${pkgs.libsamplerate.dev}/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/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..2e97bae92b6a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/samsungtvws/default.nix
@@ -0,0 +1,69 @@
+{ 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.5.0";
+  format = "setuptools";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "xchwarze";
+    repo = "samsung-tv-ws-api";
+    rev = "v${version}";
+    hash = "sha256-AimG5tyTRBETpivC2BwCuoR4o7y98YT6u5sogJlcmoo=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    websocket-client
+  ];
+
+  passthru.optional-dependencies = {
+    async = [
+      aiohttp
+      websockets
+    ];
+    encrypted = [
+      cryptography
+      py3rijndael
+    ];
+  };
+
+  checkInputs = [
+    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";
+    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..e92e464a9c91
--- /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.5.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d6074f1959041342ab41d74a6f904720ffbcf63c94467858e0e22e17e3c43d41";
+  };
+
+  dontConfigure = true;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    pyyaml
+  ];
+
+  checkInputs = [
+    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 = teams.determinatesystems.members;
+  };
+}
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..9e915dd66ed1
--- /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
+  ];
+
+  checkInputs = [
+    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..cb06b5d1f2b3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sanic-routing/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pytest-asyncio
+}:
+
+buildPythonPackage rec {
+  pname = "sanic-routing";
+  version = "22.3.0";
+
+  src = fetchFromGitHub {
+    owner = "sanic-org";
+    repo = "sanic-routing";
+    rev = "v${version}";
+    hash = "sha256-dX+uxrVjtPxX0ba3WUE/JKgj0PZzvFdKr/lXQgASN6Y=";
+  };
+
+  checkInputs = [ pytestCheckHook pytest-asyncio ];
+  pythonImportsCheck = [ "sanic_routing" ];
+
+  meta = with lib; {
+    description = "Core routing component for the Sanic web framework";
+    homepage = "https://github.com/sanic-org/sanic-routing";
+    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..120f80b57e22
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sanic-testing/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, httpx
+, sanic
+, websockets
+, callPackage
+}:
+
+buildPythonPackage rec {
+  pname = "sanic-testing";
+  version = "22.3.1";
+
+  src = fetchFromGitHub {
+    owner = "sanic-org";
+    repo = "sanic-testing";
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-6aJyc5B9e65RPG3FwXAoQByVNdrLAWTEu2/Dqf9hf+g=";
+  };
+
+  outputs = [
+    "out"
+    "testsout"
+  ];
+
+  postPatch = ''
+    sed -i 's/httpx>=.*"/httpx"/' setup.py
+  '';
+
+  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";
+    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..6a228a982310
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sanic-testing/tests.nix
@@ -0,0 +1,26 @@
+{ buildPythonPackage
+, sanic
+, sanic-testing
+, pytest-asyncio
+, pytestCheckHook
+}:
+
+buildPythonPackage {
+  pname = "sanic-testing-tests";
+  inherit (sanic-testing) version;
+
+  src = sanic-testing.testsout;
+
+  dontBuild = true;
+  dontInstall = true;
+
+  checkInputs = [
+    pytest-asyncio
+    pytestCheckHook
+    sanic
+  ];
+
+  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..45dec8763357
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sanic/default.nix
@@ -0,0 +1,140 @@
+{ lib
+, stdenv
+, aiofiles
+, beautifulsoup4
+, buildPythonPackage
+, doCheck ? true
+, fetchFromGitHub
+, gunicorn
+, httptools
+, multidict
+, pytest-asyncio
+, pytest-benchmark
+, pytest-sugar
+, pytestCheckHook
+, pythonOlder
+, pythonAtLeast
+, sanic-routing
+, sanic-testing
+, ujson
+, uvicorn
+, uvloop
+, websockets
+}:
+
+buildPythonPackage rec {
+  pname = "sanic";
+  version = "22.3.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "sanic-org";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-4zdPp3X22dfZ5YlW3G5/OqeUxrt+NiFO9dk2XjEKXEg=";
+  };
+
+  postPatch = ''
+    # Loosen dependency requirements.
+    substituteInPlace setup.py \
+      --replace "pytest==6.2.5" "pytest" \
+      --replace "gunicorn==20.0.4" "gunicorn"
+  '';
+
+  propagatedBuildInputs = [
+    aiofiles
+    httptools
+    multidict
+    sanic-routing
+    ujson
+    uvloop
+    websockets
+  ];
+
+  checkInputs = [
+    beautifulsoup4
+    gunicorn
+    pytest-asyncio
+    pytestCheckHook
+    sanic-testing
+    uvicorn
+  ];
+
+  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"
+  ];
+
+  disabledTests = [
+    # Fails to parse cmdline arguments
+    "test_dev"
+    "test_auto_reload"
+    "test_host_port_ipv6_loopback"
+    "test_num_workers"
+    "test_debug"
+    "test_access_logs"
+    "test_noisy_exceptions"
+    # OSError: foo
+    "test_bad_headers"
+    "test_create_server_trigger_events"
+    "test_json_body_requests"
+    "test_missing_startup_raises_exception"
+    "test_no_body_requests"
+    "test_oserror_warning"
+    "test_running_multiple_offset_warning"
+    "test_streaming_body_requests"
+    "test_trigger_before_events_create_server"
+    "test_keep_alive_connection_context"
+    # Racy tests
+    "test_keep_alive_client_timeout"
+    "test_keep_alive_server_timeout"
+    "test_zero_downtime"
+    # broke with ujson 5.4 upgrade
+    # https://github.com/sanic-org/sanic/pull/2504
+    "test_json_response_json"
+  ];
+
+  disabledTestPaths = [
+    # We are not interested in benchmarks
+    "benchmark/"
+    # 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; {
+    broken = stdenv.isDarwin;
+    description = "Web server and web framework";
+    homepage = "https://github.com/sanic-org/sanic/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ costrouc 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..98187f96af9f
--- /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;
+    sha256 = "sha256-bT1DbcQi+SbeRBsL7ILuQbSnAj3BBB4+FNl+Zek5xU4=";
+  };
+
+  checkInputs = [
+    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..700fb05bc67f
--- /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.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "SasView";
+    repo = "sasmodels";
+    rev = "v${version}";
+    hash = "sha256-RVEPu07gp1ScciJQmjizyELcOD2WSjIlxunj5LnmXdw=";
+  };
+
+  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
+  checkInputs = [
+    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..3806ffb9d46b
--- /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";
+  };
+
+  checkInputs = [ 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..40c52962e51d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scancode-toolkit/default.nix
@@ -0,0 +1,164 @@
+{ lib
+, attrs
+, beautifulsoup4
+, bitarray
+, boolean-py
+, buildPythonPackage
+, chardet
+, click
+, colorama
+, commoncode
+, container-inspector
+, debian-inspector
+, dparse2
+, extractcode
+, extractcode-7z
+, extractcode-libarchive
+, fasteners
+, fetchPypi
+, fingerprints
+, ftfy
+, gemfileparser
+, 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 = "31.0.0b4";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-sPFHaIbbWw/wk3Q1PBDj5O4il9ntigoyanecg938a9A=";
+  };
+
+  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
+    gemfileparser
+    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
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  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"
+  '';
+
+  # 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";
+    license = with licenses; [ asl20 cc-by-40 ];
+    maintainers = teams.determinatesystems.members;
+  };
+}
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..d412c94a4bca
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scapy/default.nix
@@ -0,0 +1,78 @@
+{ buildPythonPackage, fetchFromGitHub, lib, isPyPy
+, pycrypto, ecdsa # TODO
+, tox, mock, coverage, can, brotli
+, withOptionalDeps ? true, tcpdump, ipython
+, withCryptography ? true, cryptography
+, withVoipSupport ? true, sox
+, withPlottingSupport ? true, matplotlib
+, withGraphicsSupport ? false, pyx, texlive, graphviz, imagemagick
+, withManufDb ? false, wireshark
+# 2D/3D graphics and graphs TODO: VPython
+# TODO: nmap, numpy
+}:
+
+buildPythonPackage rec {
+  pname = "scapy";
+  version = "2.4.5";
+
+  disabled = isPyPy;
+
+  src = fetchFromGitHub {
+    owner = "secdev";
+    repo = "scapy";
+    rev = "v${version}";
+    sha256 = "0nxci1v32h5517gl9ic6zjq8gc8drwr0n5pz04c91yl97xznnw94";
+  };
+
+  postPatch = ''
+    printf "${version}" > scapy/VERSION
+  '' + 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 texlive.combined.scheme-minimal graphviz imagemagick ];
+
+  # Running the tests seems too complicated:
+  doCheck = false;
+  checkInputs = [ tox mock coverage can brotli ];
+  checkPhase = ''
+    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/schedule/default.nix b/nixpkgs/pkgs/development/python-modules/schedule/default.nix
new file mode 100644
index 000000000000..4aad4dc1abd4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/schedule/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, mock
+}:
+
+buildPythonPackage rec {
+  pname = "schedule";
+  version = "1.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "e6ca13585e62c810e13a08682e0a6a8ad245372e376ba2b8679294f377dfc8e4";
+  };
+
+  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))"
+  '';
+
+  meta = with lib; {
+    description = "Python job scheduling for humans";
+    homepage = "https://github.com/dbader/schedule";
+    license = licenses.mit;
+  };
+
+}
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..e35c1bb69109
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/schema-salad/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, black
+, buildPythonPackage
+, fetchPypi
+, cachecontrol
+, lockfile
+, mistune
+, rdflib
+, ruamel-yaml
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "schema-salad";
+  version = "8.3.20220626185350";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-g8h3dAdN+tbdLRO3ctmsW+ZLiyhU0zPd1XR+XvEBpwo=";
+  };
+
+  propagatedBuildInputs = [
+    cachecontrol
+    lockfile
+    mistune
+    rdflib
+    ruamel-yaml
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ] ++ passthru.optional-dependencies.pycodegen;
+
+  disabledTests = [
+    # Setup for these tests requires network access
+    "test_secondaryFiles"
+    "test_outputBinding"
+    # Test requires network
+    "test_yaml_tab_error"
+  ];
+
+  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";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ veprbl ];
+  };
+}
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..dabe046e4861
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/schema/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, contextlib2
+, fetchPypi
+, mock
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "schema";
+  version = "0.7.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-8GcXESxhiVyrxHB3UriHFuhCCogZ1xQEUB4RT5EEMZc=";
+  };
+
+  propagatedBuildInputs = [
+    contextlib2
+  ];
+
+  checkInputs = [
+    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/schiene/default.nix b/nixpkgs/pkgs/development/python-modules/schiene/default.nix
new file mode 100644
index 000000000000..952a00440d92
--- /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.24";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-y1gbeavZNFniRiOBbJ4Mgmb0F01HedSmpAWaeZEv0Go=";
+  };
+
+  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..84b411de9059
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/schwifty/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, importlib-resources
+, importlib-metadata
+, iso3166
+, pycountry
+, pytestCheckHook
+, pytest-cov
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "schwifty";
+  version = "2022.7.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-X0zp35iF/nQhHxm5WfRvrODRt7mkHTKP6zYMZlCTAa8=";
+  };
+
+  propagatedBuildInputs = [
+    iso3166
+    pycountry
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-resources
+  ] ++ lib.optionals (pythonOlder "3.7") [
+    importlib-metadata
+  ];
+
+  checkInputs = [
+    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..e86b384f9c4a
--- /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.7";
+  pname = "scikit-bio";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-Y0PKDGIeL8xdHAQsi+MgBmTFMllWqDvqdRzxvMddHak=";
+  };
+
+  nativeBuildInputs = [ cython ];
+  checkInputs = [ 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 = [ maintainers.costrouc ];
+  };
+}
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..4a466fcef06d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scikit-build/default.nix
@@ -0,0 +1,85 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, distro
+, packaging
+, python
+, setuptools
+, setuptools-scm
+, wheel
+  # Test Inputs
+, cmake
+, cython
+, flake8
+, ninja
+, path
+, pytestCheckHook
+, pytest-mock
+, pytest-virtualenv
+, requests
+, six
+, virtualenv
+}:
+
+buildPythonPackage rec {
+  pname = "scikit-build";
+  version = "0.15.0";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-5yPNDzSJoEI3C56piLu5z9dyXoslsgyhx5gYIfz2X7k=";
+  };
+
+  propagatedBuildInputs = [
+    distro
+    packaging
+    setuptools
+    setuptools-scm
+    wheel
+  ];
+
+  checkInputs = [
+    cmake
+    cython
+    ninja
+    path
+    pytestCheckHook
+    pytest-mock
+    pytest-virtualenv
+    requests
+    six
+    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"
+    # distutils.errors.DistutilsArgError: no commands supplied
+    "test_invalid_command"
+    "test_manifest_in_sdist"
+    "test_no_command"
+  ];
+
+  meta = with lib; {
+    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..34cf4ddaae02
--- /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 = "2022.3.26";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-wxVfltcz3qh5FRS3CXYsYdL3z94x7Y0rjCbKFnNW3o4=";
+  };
+
+  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; [ costrouc ];
+  };
+}
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..ef921c543e1f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scikit-fuzzy/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, isPy27
+, fetchFromGitHub
+, matplotlib
+, networkx
+, nose
+, numpy
+, scipy
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "scikit-fuzzy";
+  version = "unstable-2021-03-31";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "92ad3c382ac19707086204ac6cdf6e81353345a7";
+    sha256 = "0q89p385nsg3lymlsqm3mw6y45vgrk6w9p30igbm59b7r9mkgdj8";
+  };
+
+  propagatedBuildInputs = [ networkx numpy scipy ];
+  checkInputs = [ matplotlib nose pytestCheckHook ];
+
+  # test error: "ValueError: could not convert string to float: '2.6.2'"
+  disabledTestPaths = [ "skfuzzy/control/tests/test_controlsystem.py" ];
+
+  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..7b9707278d5c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scikit-hep-testdata/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, fetchFromGitHub
+, pythonAtLeast
+, buildPythonPackage
+, importlib-resources
+, pyyaml
+, requests
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "scikit-hep-testdata";
+  version = "0.4.15";
+  format = "pyproject";
+
+  # fetch from github as we want the data files
+  # https://github.com/scikit-hep/scikit-hep-testdata/issues/60
+  src = fetchFromGitHub {
+    owner = "scikit-hep";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-cEEtuLmGg/bDRYTUQXQiplzES28+xh8iQge6xZUTWIA=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+  propagatedBuildInputs = [
+    pyyaml
+    requests
+  ] ++ lib.optional (!pythonAtLeast "3.9") importlib-resources;
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  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";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ veprbl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/scikit-image/add-testing-data.patch b/nixpkgs/pkgs/development/python-modules/scikit-image/add-testing-data.patch
new file mode 100644
index 000000000000..60f9287f8b1c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scikit-image/add-testing-data.patch
@@ -0,0 +1,17 @@
+diff --git a/skimage/data/setup.py b/skimage/data/setup.py
+index 528e9c284ce..ba0e155559c 100644
+--- a/skimage/data/setup.py
++++ b/skimage/data/setup.py
+@@ -11,7 +11,11 @@ def configuration(parent_package='', top_path=None):
+     # further notice.
+     # Testing data and additional datasets should only
+     # be made available via pooch
+-    config.add_data_files(*legacy_datasets)
++    # Nix patch: add ALL images to facilitate testing of a fully-built package
++    from pathlib import Path
++    config.add_data_files(
++        *(path.name for path in Path(__file__).parent.glob("*") if path.suffix != ".py")
++    )
+     # It seems hard to create a consistent hash for README.txt since
+     # the line endings keep getting converted
+     config.add_data_files('README.txt')
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..45239f64fbef
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scikit-image/default.nix
@@ -0,0 +1,113 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, buildPythonPackage
+, python
+, cython
+, numpy
+, scipy
+, matplotlib
+, networkx
+, six
+, pillow
+, pywavelets
+, dask
+, cloudpickle
+, imageio
+, tifffile
+, pytestCheckHook
+, doCheck ? false
+}:
+
+let
+  installedPackageRoot = "${builtins.placeholder "out"}/${python.sitePackages}";
+  self = buildPythonPackage rec {
+    pname = "scikit-image";
+    version = "0.18.3";
+
+    src = fetchFromGitHub {
+      owner = pname;
+      repo = pname;
+      rev = "v${version}";
+      sha256 = "0a2h3bw5rkk23k4r04qc9maccg00nddssd7lfsps8nhp5agk1vyh";
+    };
+
+    patches = [ ./add-testing-data.patch ];
+
+    nativeBuildInputs = [ cython ];
+
+    propagatedBuildInputs = [
+      cloudpickle
+      dask
+      imageio
+      matplotlib
+      networkx
+      numpy
+      pillow
+      pywavelets
+      scipy
+      six
+      tifffile
+    ];
+
+    # test suite is very cpu intensive, move to passthru.tests
+    inherit doCheck;
+    checkInputs = [ 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::"
+    ]);
+
+    # Check cythonized modules
+    pythonImportsCheck = [
+      "skimage"
+      "skimage._shared"
+      "skimage.draw"
+      "skimage.feature"
+      "skimage.restoration"
+      "skimage.filters"
+      "skimage.future.graph"
+      "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";
+      license = lib.licenses.bsd3;
+      maintainers = with lib.maintainers; [ yl3dy ];
+    };
+  };
+in
+  self
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..f198b49c7ad2
--- /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.2.0";
+
+  src = fetchFromGitHub {
+    owner = "scikit-learn-contrib";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "09v7a9jdycdrlqq349m1gbn8ppzv1bl5g3l72k6ywsx2xb01qw13";
+  };
+
+  nativeBuildInputs = [ numpy cython ];
+  propagatedBuildInputs = [ numpy scipy scikit-learn ];
+  checkInputs = [ 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..6a97bcd46846
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scikit-learn/default.nix
@@ -0,0 +1,103 @@
+{ 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.1.1";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-Pne3Ho5kT4bItb5/HChe9ZfeTDhJYTie4+nKNsRFslY=";
+  };
+
+  buildInputs = [
+    pillow
+    glibcLocales
+  ] ++ lib.optionals stdenv.cc.isClang [
+    llvmPackages.openmp
+  ];
+
+  nativeBuildInputs = [
+    cython
+    gfortran
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    scipy
+    numpy.blas
+    joblib
+    threadpoolctl
+  ];
+
+  checkInputs = [ 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"
+  ];
+
+  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 = replaceChars ["."] ["-"] 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..bfe0ab7d5b34
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scikit-misc/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, cython
+, gfortran
+, pytestCheckHook
+, numpy }:
+
+buildPythonPackage rec {
+  pname = "scikit-misc";
+  version = "0.1.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-93RqA0eBEGPh7PkSHflINXhQA5U8OLW6hPY/xQjCKRE=";
+  };
+
+  postPatch = ''
+    substituteInPlace pytest.ini \
+      --replace "--cov --cov-report=xml" ""
+  '';
+
+  nativeBuildInputs = [
+    gfortran
+  ];
+
+  buildInputs = [
+    cython
+    numpy
+  ];
+
+  # Tests fail because of infinite recursion error
+  doCheck = false;
+
+  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..5e87c585116a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scikit-optimize/default.nix
@@ -0,0 +1,43 @@
+{ 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
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Sequential model-based optimization toolbox";
+    homepage = "https://scikit-optimize.github.io/";
+    license = licenses.bsd3;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..1dd50b6380d8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scikit-survival/default.nix
@@ -0,0 +1,74 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchPypi
+, cython
+, ecos
+, joblib
+, numexpr
+, numpy
+, osqp
+, pandas
+, setuptools-scm
+, scikit-learn
+, scipy
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "scikit-survival";
+  version = "0.18.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-LfQESmKxSJ4tWlp3EZTBajOxZC3IEOUtJmX8A5ROpmU=";
+  };
+
+  nativeBuildInputs = [
+    cython
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    ecos
+    joblib
+    numexpr
+    numpy
+    osqp
+    pandas
+    scikit-learn
+    scipy
+  ];
+
+  pythonImportsCheck = [ "sksurv" ];
+
+  checkInputs = [ pytestCheckHook ];
+
+  # 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"
+  ];
+
+  meta = with lib; {
+    broken = (stdenv.isLinux && stdenv.isAarch64);
+    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..cf2e524337de
--- /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
+  ];
+
+  checkInputs = [
+    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 = [ maintainers.costrouc ];
+  };
+}
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..21baa7bfa37e
--- /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.6.4";
+
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-fS9E0kO+ZEcGjiWQPAQHa52zOz9RafNSBPNKypm0GhA=";
+  };
+
+  nativeBuildInputs = [
+    gfortran
+    cython
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    sundials
+    scipy
+  ] ++ lib.optionals (!isPy3k) [ enum34 ];
+
+  doCheck = true;
+  checkInputs = [ 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/scipy/default.nix b/nixpkgs/pkgs/development/python-modules/scipy/default.nix
new file mode 100644
index 000000000000..4b6342691d43
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scipy/default.nix
@@ -0,0 +1,81 @@
+{ lib
+, stdenv
+, fetchPypi
+, python
+, buildPythonPackage
+, cython
+, gfortran
+, pythran
+, nose
+, pytest
+, pytest-xdist
+, numpy
+, pybind11
+}:
+
+buildPythonPackage rec {
+  pname = "scipy";
+  version = "1.8.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-nj+xsOiW8UqFqpoo1fdV2q7rVMiXt0bfelXMsCs0DzM=";
+  };
+
+  nativeBuildInputs = [ cython gfortran pythran ];
+
+  buildInputs = [ numpy.blas pybind11 ];
+
+  propagatedBuildInputs = [ numpy ];
+
+  checkInputs = [ nose pytest pytest-xdist ];
+
+  # Remove tests because of broken wrapper
+  prePatch = ''
+    rm scipy/linalg/tests/test_lapack.py
+  '';
+
+  doCheck = !(stdenv.isx86_64 && stdenv.isDarwin);
+
+  preConfigure = ''
+    sed -i '0,/from numpy.distutils.core/s//import setuptools;from numpy.distutils.core/' setup.py
+    export NPY_NUM_BUILD_JOBS=$NIX_BUILD_CORES
+  '';
+
+  preBuild = ''
+    ln -s ${numpy.cfg} site.cfg
+  '';
+
+  # 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
+    pushd dist
+    ${python.interpreter} -c "import scipy; scipy.test('fast', verbose=10, parallel=$NIX_BUILD_CORES)"
+    popd
+    runHook postCheck
+  '';
+
+  passthru = {
+    blas = numpy.blas;
+  };
+
+  setupPyBuildFlags = [ "--fcompiler='gnu95'" ];
+
+  SCIPY_USE_G77_ABI_WRAPPER = 1;
+
+  meta = with lib; {
+    description = "SciPy (pronounced 'Sigh Pie') is open-source software for mathematics, science, and engineering";
+    homepage = "https://www.scipy.org/";
+    license = licenses.bsd3;
+    maintainers = [ maintainers.fridh ];
+  };
+}
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..e61ac1e5b9b5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scmrepo/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, asyncssh
+, buildPythonPackage
+, dulwich
+, fetchFromGitHub
+, fsspec
+, funcy
+, GitPython
+, pathspec
+, pygit2
+, pygtrie
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "scmrepo";
+  version = "0.0.25";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "iterative";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-269vJNclTBWEqM9AJbF96R1I6Ru3q8YBd5A8Rmw7Jjo=";
+  };
+
+  propagatedBuildInputs = [
+    asyncssh
+    dulwich
+    fsspec
+    funcy
+    GitPython
+    pathspec
+    pygit2
+    pygtrie
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "asyncssh>=2.7.1,<2.9" "asyncssh>=2.7.1"
+  '';
+
+  # Requires a running Docker instance
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "scmrepo"
+  ];
+
+  meta = with lib; {
+    description = "SCM wrapper and fsspec filesystem";
+    homepage = "https://github.com/iterative/scmrepo";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..a8a152b0a34c
--- /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.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-VGmbkstorjS1koxIqIjquXIqISUCy6iap5W9Vll1Bb0=";
+  };
+
+  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..30e728940230
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scramp/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, asn1crypto
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "scramp";
+  version = "1.4.1";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "tlocke";
+    repo = "scramp";
+    rev = version;
+    sha256 = "sha256-HEt2QxNHX9Oqx+o0++ZtS61SVHra3nLAqv7NbQWVV+E=";
+  };
+
+  propagatedBuildInputs = [
+    asn1crypto
+  ];
+
+  checkInputs = [
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "scramp" ];
+
+  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..69351e2e6ab6
--- /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.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-rMZRD/fE1ed8R5GwS3aZcHLScQ1+uSpX29LwBXtXEao=";
+  };
+
+  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..643afd6dc8bf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scrapy-fake-useragent/default.nix
@@ -0,0 +1,24 @@
+{ lib, fetchFromGitHub, buildPythonPackage, pytestCheckHook, pytest-cov, pytest-mock, fake-useragent, faker, scrapy }:
+
+buildPythonPackage rec {
+  pname = "scrapy-fake-useragent";
+  version = "1.4.4";
+
+  # PyPi tarball is corrupted
+  src = fetchFromGitHub {
+    owner = "alecxe";
+    repo = pname;
+    rev = "59c20d38c58c76618164760d546aa5b989a79b8b"; # no tags
+    sha256 = "0yb7d51jws665rdfqkmi077w0pjxmb2ni7ysphj7lx7b18whq54j";
+  };
+
+  propagatedBuildInputs = [ fake-useragent faker ];
+
+  checkInputs = [ pytestCheckHook scrapy pytest-cov pytest-mock ];
+
+  meta = with lib; {
+    description = "Random User-Agent middleware based on fake-useragent";
+    homepage = "https://github.com/alecxe/scrapy-fake-useragent";
+    license = licenses.mit;
+  };
+}
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..9be77facf08e
--- /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.8.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a7c17735415151ae01f07b03c7624e7276a343779b3c5f4546f655f6133df42f";
+  };
+
+  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..72e1c832da08
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scrapy/default.nix
@@ -0,0 +1,142 @@
+{ lib
+, stdenv
+, botocore
+, buildPythonPackage
+, cryptography
+, cssselect
+, fetchPypi
+, fetchpatch
+, glibcLocales
+, installShellFiles
+, itemadapter
+, itemloaders
+, jmespath
+, lxml
+, parsel
+, protego
+, pydispatcher
+, pyopenssl
+, pytestCheckHook
+, pythonOlder
+, queuelib
+, service-identity
+, sybil
+, testfixtures
+, tldextract
+, twisted
+, w3lib
+, zope_interface
+}:
+
+buildPythonPackage rec {
+  pname = "scrapy";
+  version = "2.6.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "Scrapy";
+    sha256 = "55e21181165f25337105fff1efc8393296375cea7de699a7e703bbd265595f26";
+  };
+
+  nativeBuildInputs = [
+    installShellFiles
+  ];
+
+  propagatedBuildInputs = [
+    cryptography
+    cssselect
+    itemadapter
+    itemloaders
+    lxml
+    parsel
+    protego
+    pydispatcher
+    pyopenssl
+    queuelib
+    service-identity
+    tldextract
+    twisted
+    w3lib
+    zope_interface
+  ];
+
+  checkInputs = [
+    botocore
+    glibcLocales
+    jmespath
+    pytestCheckHook
+    sybil
+    testfixtures
+  ];
+
+  LC_ALL = "en_US.UTF-8";
+
+  preCheck = ''
+    # Disable doctest plugin because it causes pytest to hang
+    substituteInPlace pytest.ini \
+      --replace "--doctest-modules" ""
+  '';
+
+  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"
+    # 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_timeout_download_from_spider_nodata_rcvd"
+    "test_timeout_download_from_spider_server_hangs"
+    # Fails with AssertionError
+    "test_peek_fifo"
+    "test_peek_one_element"
+    "test_peek_lifo"
+    "test_callback_kwargs"
+  ] ++ lib.optionals stdenv.isDarwin [
+    "test_xmliter_encoding"
+    "test_download"
+    "test_reactor_default_twisted_reactor_select"
+  ];
+
+  postInstall = ''
+    installManPage extras/scrapy.1
+    install -m 644 -D extras/scrapy_bash_completion $out/share/bash-completion/completions/scrapy
+    install -m 644 -D extras/scrapy_zsh_completion $out/share/zsh/site-functions/_scrapy
+  '';
+
+  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 ];
+    platforms = platforms.unix;
+  };
+}
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..886854d1f2af
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/screeninfo/default.nix
@@ -0,0 +1,52 @@
+{ stdenv
+, lib
+, buildPythonApplication
+, dataclasses
+, fetchPypi
+, libX11
+, libXinerama
+, libXrandr
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonApplication rec {
+  pname = "screeninfo";
+  version = "0.8";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9501bf8b8458c7d1be4cb0ac9abddddfa80b932fb3f65bfcb54f5586434b1dc5";
+  };
+
+  propagatedBuildInputs = lib.optionals (pythonOlder "3.7") [
+    dataclasses
+  ];
+
+  buildInputs = [
+    libX11
+    libXinerama
+    libXrandr
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # We don't have a screen
+    "screeninfo/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..ca137888ce7c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/screenlogicpy/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytest-asyncio
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "screenlogicpy";
+  version = "0.5.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "dieselrabbit";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-1tBr7k7RutCHvea/56J7drl9P+WZ5bQpDeQwhgktc1s=";
+  };
+
+  checkInputs = [
+    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";
+    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..5fe4b2b2ee6f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scripttest/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+}:
+
+buildPythonPackage rec {
+  version = "1.3";
+  pname = "scripttest";
+
+  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.python.org/pypi/ScriptTest/";
+    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..24b7d36343a8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scs/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, blas
+, lapack
+, numpy
+, scipy
+  # check inputs
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "scs";
+  version = "3.0.0";
+
+  src = fetchFromGitHub {
+    owner = "bodono";
+    repo = "scs-python";
+    rev = version;
+    sha256 = "sha256-7OgqCo21S0FDev8xv6/8iGFXg8naVi93zd8v1f9iaWw=";
+    fetchSubmodules = true;
+  };
+
+  buildInputs = [
+    lapack
+    blas
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    scipy
+  ];
+
+  checkInputs = [ pytestCheckHook ];
+  pythonImportsCheck = [ "scs" ];
+
+  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; [ 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..fa4493916410
--- /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.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "pylhc";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-l9j+YJ5VNMzL6JW59kq0hQS7XIj53UxW5bNnfdURz/o=";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  checkInputs = [
+    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/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..8d94264721b7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/seaborn/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, matplotlib
+, pytestCheckHook
+, numpy
+, pandas
+, pythonOlder
+, scipy
+}:
+
+buildPythonPackage rec {
+  pname = "seaborn";
+  version = "0.11.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "cf45e9286d40826864be0e3c066f98536982baf701a7caa386511792d61ff4f6";
+  };
+
+  propagatedBuildInputs = [
+    matplotlib
+    numpy
+    pandas
+    scipy
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # incompatible with matplotlib 3.5
+    "TestKDEPlotBivariate"
+    "TestBoxPlotter"
+    "TestCatPlot"
+    "TestKDEPlotUnivariate"
+    "test_with_rug"
+    "test_bivariate_kde_norm"
+  ] ++ lib.optionals (!stdenv.hostPlatform.isx86) [
+    # overly strict float tolerances
+    "TestDendrogram"
+  ];
+
+  pythonImportsCheck = [
+    "seaborn"
+  ];
+
+  meta = with lib; {
+    description = "Statisitical data visualization";
+    homepage = "https://seaborn.pydata.org/";
+    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..6f048144dfa1
--- /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
+  checkInputs = [
+    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/seatconnect/default.nix b/nixpkgs/pkgs/development/python-modules/seatconnect/default.nix
new file mode 100644
index 000000000000..25b1773472ff
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/seatconnect/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, aiohttp
+, beautifulsoup4
+, buildPythonPackage
+, cryptography
+, fetchFromGitHub
+, lxml
+, pyjwt
+, pythonOlder
+, setuptools-scm
+, xmltodict
+}:
+
+buildPythonPackage rec {
+  pname = "seatconnect";
+  version = "1.1.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "farfar";
+    repo = pname;
+    rev = version;
+    hash = "sha256-8ZqqNDLygHgtUzTgdb34+4BHuStXJXnl9fBfo0WSNZw=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    beautifulsoup4
+    cryptography
+    lxml
+    pyjwt
+    xmltodict
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "'pytest>=5,<6'," ""
+    substituteInPlace requirements.txt \
+      --replace "pytest-asyncio" ""
+  '';
+
+  # 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";
+    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..f13f763974b6
--- /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 ];
+
+  checkInputs = [ 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..a9f336d18df9
--- /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.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "SecretStorage";
+    inherit version;
+    hash = "sha256-Co65ZFsyCIHCIugnwm9M/PVTY+izdKAhmB74hmV6kS8=";
+  };
+
+  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/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/securetar/default.nix b/nixpkgs/pkgs/development/python-modules/securetar/default.nix
new file mode 100644
index 000000000000..68b25355744d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/securetar/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, cryptography
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "securetar";
+  version = "2022.02.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "pvizeli";
+    repo = pname;
+    rev = version;
+    hash = "sha256-FwQp08jwcGh07zpHqRNoUUmeLZJh78wI8wCXySi3Tdc=";
+  };
+
+  propagatedBuildInputs = [
+    cryptography
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "securetar"
+  ];
+
+  meta = with lib; {
+    description = "Module to handle tarfile backups";
+    homepage = "https://github.com/pvizeli/securetar";
+    license = licenses.asl20;
+    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..dbfe45107769
--- /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 ];
+
+  checkInputs = [ 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..f1c0ad3bf0ef
--- /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
+  ];
+
+  checkInputs = [
+    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..5db60d0d0bdb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/segno/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pypng
+, pyzbar
+}:
+
+buildPythonPackage rec {
+  pname = "segno";
+  version = "1.5.2";
+
+  src = fetchFromGitHub {
+    owner = "heuer";
+    repo = "segno";
+    rev = version;
+    sha256 = "sha256-+OEXG5OvrZ5Ft7IO/7zodf+SgiRF+frwjltrBENNnHo=";
+  };
+
+  checkInputs = [
+    pytestCheckHook
+    pypng
+    pyzbar
+  ];
+
+  pythonImportsCheck = [ "segno" ];
+
+  meta = with lib; {
+    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..546f1117e80d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/segyio/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, cmake
+, ninja
+, python
+, scikit-build
+, pytest
+, numpy
+, fetchpatch
+}:
+
+stdenv.mkDerivation rec {
+  pname = "segyio";
+  version = "1.9.9";
+
+  patches = [
+    # PR https://github.com/equinor/segyio/pull/531
+    (fetchpatch {
+        url = "https://github.com/equinor/segyio/commit/628bc5e02d0f98b89fe70b072df9b8e677622e9e.patch";
+        sha256 = "sha256-j+vqHZNfPIh+yWBgqbGD3W04FBvFiDJKnmcC/oTk3a8=";
+    })
+  ];
+
+  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 = version;
+    sha256 = "sha256-L3u5BHS5tARS2aIiQbumADkuzw1Aw4Yuav8H8tRNYNg=";
+  };
+
+  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
+  checkInputs = [ 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..dc108502ce9c
--- /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
+  ];
+
+  checkInputs = [ 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 = [ maintainers.costrouc ];
+  };
+}
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..101135794385
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/selenium/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, geckodriver
+, pytestCheckHook
+, pythonOlder
+, trio
+, trio-websocket
+, urllib3
+, nixosTests
+}:
+
+buildPythonPackage rec {
+  pname = "selenium";
+  version = "4.3.0";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "SeleniumHQ";
+    repo = "selenium";
+    rev = "refs/tags/selenium-${version}"; # check if there is a newer tag with -python suffix
+    sha256 = "sha256-tD2sJGVBwqB0uOM3zwdNn71+ILYEHPAvWHvoJN24w6E=";
+  };
+
+  postPatch = ''
+    substituteInPlace py/selenium/webdriver/firefox/service.py \
+      --replace 'DEFAULT_EXECUTABLE_PATH = "geckodriver"' 'DEFAULT_EXECUTABLE_PATH = "${geckodriver}/bin/geckodriver"'
+  '';
+
+  preConfigure = ''
+    cd py
+  '';
+
+  propagatedBuildInputs = [
+    trio
+    trio-websocket
+    urllib3
+  ] ++ urllib3.optional-dependencies.secure
+  ++ urllib3.optional-dependencies.socks;
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  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..131cf230ef78
--- /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;
+    sha256 = "sha256-vau20zaZjLs3jUuds6S1ah4yNXAdwF6iaQ2amX7VBBw=";
+  };
+
+  checkInputs = [
+    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/semver/default.nix b/nixpkgs/pkgs/development/python-modules/semver/default.nix
new file mode 100644
index 000000000000..a86b51c005ba
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/semver/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "semver";
+  version = "2.13.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "python-semver";
+    repo = "python-semver";
+    rev = version;
+    hash = "sha256-IWTo/P9JRxBQlhtcH3JMJZZrwAA8EALF4dtHajWUc4w=";
+  };
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    sed -i "/--cov/d" setup.cfg
+    sed -i "/--no-cov-on-fail/d" setup.cfg
+  '';
+
+  preCheck = ''
+    # Confuses source vs dist imports in pytest
+    rm -r dist
+  '';
+
+  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/";
+    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..8a35d3ed71a6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/send2trash/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "Send2Trash";
+  version = "1.8.1b0";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "hsoft";
+    repo = "send2trash";
+    rev = version;
+    sha256 = "sha256-kDUEfyMTk8CXSxTEi7E6kl09ohnWHeaoif+EIaIJh9Q=";
+  };
+
+  doCheck = !stdenv.isDarwin;
+  checkPhase = "HOME=$TMPDIR pytest";
+  checkInputs = [ pytest ];
+
+  meta = with lib; {
+    description = "Send file to trash natively under macOS, Windows and Linux";
+    homepage = "https://github.com/hsoft/send2trash";
+    license = licenses.bsd3;
+  };
+}
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..8462b9924eda
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sendgrid/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, flask
+, pytestCheckHook
+, python-http-client
+, pythonOlder
+, pyyaml
+, starkbank-ecdsa
+, six
+, werkzeug
+}:
+
+buildPythonPackage rec {
+  pname = "sendgrid";
+  version = "6.9.7";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = "sendgrid-python";
+    rev = version;
+    sha256 = "sha256-Lx84jmgJz/J5MJtJyqDTVIbN6H63gD2rkJrdNeojd08=";
+  };
+
+  propagatedBuildInputs = [
+    python-http-client
+    starkbank-ecdsa
+    six
+  ];
+
+  checkInputs = [
+    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";
+    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..b3f2d6955709
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sense-energy/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, aiohttp
+, pythonOlder
+, requests
+, websocket-client
+, websockets
+}:
+
+buildPythonPackage rec {
+  pname = "sense-energy";
+  version = "0.10.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "scottbonline";
+    repo = "sense";
+    rev = version;
+    hash = "sha256-yflI17lLZMXXB0ye+jz3VWWMdZtcBTwbg8deA4ENmWw=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    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";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
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..a3abd9f4037b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sensor-state-data/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, home-assistant-bluetooth
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+, sensor-state-data
+}:
+
+buildPythonPackage rec {
+  pname = "sensor-state-data";
+  version = "2.2.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "Bluetooth-Devices";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-ThROGmCNsOOJ65sOXRS1FefwN8Wf2DmHP294y3JVQvk=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  checkInputs = [
+    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";
+    license = with licenses; [ asl20 ];
+    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..00a01dc0df9a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sensorpush-ble/default.nix
@@ -0,0 +1,55 @@
+{ 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.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "Bluetooth-Devices";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-64DywtZwfDFjW8WUzw3ZTT462sBGFgAHGc0bGnKCJpY=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    bluetooth-sensor-state-data
+    home-assistant-bluetooth
+    sensor-state-data
+  ];
+
+  checkInputs = [
+    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";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..c1ad64b3f5e4
--- /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 = "source/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..0fd10294bbe9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sentinel/default.nix
@@ -0,0 +1,17 @@
+{ lib, buildPythonPackage, fetchPypi}:
+
+buildPythonPackage rec {
+  pname = "sentinel";
+  version = "0.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f28143aa4716dbc8f6193f5682176a3c33cd26aaae05d9ecf66c186a9887cc2d";
+  };
+
+  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..17c2c94a30ff
--- /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
+  ];
+
+  checkInputs = [
+    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..91b0fb6b72a9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sentry-sdk/default.nix
@@ -0,0 +1,161 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+
+# runtime
+, certifi
+, urllib3
+
+# optionals
+, aiohttp
+, apache-beam
+, blinker
+, botocore
+, bottle
+, celery
+, chalice
+, django
+, falcon
+, flask
+, flask_login
+, httpx
+, pure-eval
+, pyramid
+, pyspark
+, rq
+, sanic
+, sqlalchemy
+, tornado
+, trytond
+, werkzeug
+
+# tests
+, asttokens
+, executing
+, gevent
+, jsonschema
+, mock
+, pyrsistent
+, pytest-forked
+, pytest-localserver
+, pytest-watch
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "sentry-sdk";
+  version = "1.9.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "getsentry";
+    repo = "sentry-python";
+    rev = version;
+    hash = "sha256-sZpM9wgybyt/5Rw3X05whLvQNMC55o+s7eYA4QJdj6c=";
+  };
+
+  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
+    ];
+  };
+
+  checkInputs = [
+    asttokens
+    executing
+    gevent
+    jsonschema
+    mock
+    pure-eval
+    pyrsistent
+    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";
+    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..bc46aa5198d1
--- /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.5.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "raphaelm";
+    repo = "python-sepaxml";
+    rev = version;
+    hash = "sha256-9gPUAZ60q5o11eAnkzTBrFCpBUGxw3MGuKY4MtPxoSA=";
+  };
+
+  propagatedBuildInputs = [
+    text-unidecode
+    xmlschema
+  ];
+
+  checkInputs = [
+    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..c27a2eb2c91c
--- /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;
+    sha256 = "sha256-Dh9JMx50Nexi0q39rYr9MpkKmQRAfT7lzsNOXoTuphg=";
+  };
+
+  propagatedBuildInputs = [
+    blockdiag
+    setuptools
+  ];
+
+  checkInputs = [
+    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..73ad00332bf8
--- /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
+  ];
+
+  checkInputs = [
+    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/serpent/default.nix b/nixpkgs/pkgs/development/python-modules/serpent/default.nix
new file mode 100644
index 000000000000..2ab2b081f2b1
--- /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;
+    sha256 = "sha256-BAcDX+PGZEOH1Iz/FGfVqp/v+BTQc3K3hnftDuPtcJU=";
+  };
+
+  propagatedBuildInputs = lib.optionals isPy27 [ enum34 ];
+
+  checkInputs = [ 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..7a1b8348a0e6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/serpy/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchPypi,
+  flake8, py, pyflakes, six, tox
+}:
+
+buildPythonPackage rec {
+  pname = "serpy";
+  version = "0.3.1";
+
+  meta = {
+    description = "ridiculously fast object serialization";
+    homepage = "https://github.com/clarkduvall/serpy";
+    license = lib.licenses.mit;
+  };
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3772b2a9923fbf674000ff51abebf6ea8f0fca0a2cfcbfa0d63ff118193d1ec5";
+  };
+
+  buildInputs = [ flake8 py pyflakes tox ];
+  propagatedBuildInputs = [ six ];
+
+  # ImportError: No module named 'tests
+  doCheck = false;
+}
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..8fdd294b506f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/servefile/default.nix
@@ -0,0 +1,45 @@
+{ stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, lib
+, pyopenssl
+, pytestCheckHook
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "servefile";
+  version = "0.5.3";
+
+  src = fetchFromGitHub {
+    owner = "sebageek";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-/ZEMZIH/ImuZ2gh5bwB0FlaWnG/ELxfBGEJ2SuNSEb8=";
+  };
+
+  propagatedBuildInputs = [ pyopenssl ];
+
+  checkInputs = [ 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; {
+    broken = stdenv.isDarwin;
+    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/serverlessrepo/default.nix b/nixpkgs/pkgs/development/python-modules/serverlessrepo/default.nix
new file mode 100644
index 000000000000..d3cc7e9c633b
--- /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
+  ];
+
+  checkInputs = [
+    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..10eac468a150
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/service-identity/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, attrs
+, buildPythonPackage
+, cryptography
+, fetchFromGitHub
+, idna
+, pyasn1
+, pyasn1-modules
+, six
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "service-identity";
+  version = "21.1.0";
+
+  src = fetchFromGitHub {
+    owner = "pyca";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-pWc2rU3ULqEukMhd1ySY58lTm3s8f/ayQ7CY4nG24AQ=";
+  };
+
+  propagatedBuildInputs = [
+    attrs
+    cryptography
+    idna
+    pyasn1
+    pyasn1-modules
+    six
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "service_identity" ];
+
+  meta = with lib; {
+    description = "Service identity verification for pyOpenSSL";
+    homepage = "https://service-identity.readthedocs.io";
+    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..c48b7b9e1b3c
--- /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.2.3";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-7PKLHAenmddvQyblCBV7ca7aB7hLkDaOpFHAcQ29MsA=";
+  };
+
+  checkInputs = [ 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..f58515679e1f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/setupmeta/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, git
+, mock
+, pep440
+, pytestCheckHook
+, pythonOlder
+, setuptools-scm
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "setupmeta";
+  version = "3.3.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "codrsquad";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-kX7S5NSqO1LDRkfBHaNfTjzW+l0Pd+5KvQHiNF3eH/M=";
+  };
+
+  preBuild = ''
+    export PYGRADLE_PROJECT_VERSION=${version};
+  '';
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  checkInputs = [
+    git
+    mock
+    pep440
+    pytestCheckHook
+    six
+  ];
+
+  preCheck = ''
+    unset PYGRADLE_PROJECT_VERSION
+  '';
+
+  disabledTests = [
+    # Tests want to scan site-packages
+    "test_check_dependencies"
+    "test_clean"
+    "test_scenario"
+    "test_git_versioning"
+  ];
+
+  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-declarative-requirements/default.nix b/nixpkgs/pkgs/development/python-modules/setuptools-declarative-requirements/default.nix
new file mode 100644
index 000000000000..86d2784beb71
--- /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;
+    sha256 = "sha256-V6W5u5rTUMJ46Kpr5M3rvNklubpx1qcSoXimGM+4mPc=";
+  };
+
+  buildInputs = [ setuptools-scm ];
+
+  checkInputs = [ 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-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-rust/default.nix b/nixpkgs/pkgs/development/python-modules/setuptools-rust/default.nix
new file mode 100644
index 000000000000..04284a703b3c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/setuptools-rust/default.nix
@@ -0,0 +1,39 @@
+{ callPackage
+, lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, semantic-version
+, setuptools
+, setuptools-scm
+, typing-extensions
+, toml
+}:
+
+buildPythonPackage rec {
+  pname = "setuptools-rust";
+  version = "1.4.1";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-GP+FCDH1juIdV4OCXJn61jLaIeR2RelCf9fewEgCnnY=";
+  };
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  propagatedBuildInputs = [ semantic-version setuptools typing-extensions ];
+
+  doCheck = false;
+  pythonImportsCheck = [ "setuptools_rust" ];
+
+  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; [ SuperSandro2000 ];
+  };
+}
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..31730d6ff2dc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/setuptools-rust/pyo3-test/default.nix
@@ -0,0 +1,25 @@
+{ callPackage
+, rustPlatform
+, 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 ] ++ (with rustPlatform; [
+    cargoSetupHook
+    rust.cargo
+    rust.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..556f1e0a375b
--- /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 ];
+
+  checkInputs = [ 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..229460e55723
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/setuptools-scm/default.nix
@@ -0,0 +1,45 @@
+{ buildPythonPackage
+, callPackage
+, fetchPypi
+, packaging
+, typing-extensions
+, tomli
+, setuptools
+, lib
+}:
+
+buildPythonPackage rec {
+  pname = "setuptools-scm";
+  version = "7.0.5";
+
+  src = fetchPypi {
+    pname = "setuptools_scm";
+    inherit version;
+    sha256 = "sha256-Ax4Tr3cdb4krlBrbbqBFRbv5Hrxc5ox4qvP/9uH7SEQ=";
+  };
+
+  propagatedBuildInputs = [
+    packaging
+    typing-extensions
+    tomli
+    setuptools
+  ];
+
+  pythonImportsCheck = [
+    "setuptools_scm"
+  ];
+
+  # check in passhtru.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; [ SuperSandro2000 ];
+  };
+}
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..b90797abf7eb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/setuptools-scm/tests.nix
@@ -0,0 +1,32 @@
+{ buildPythonPackage
+, setuptools-scm
+, pytestCheckHook
+, git
+, mercurial
+, pip
+, virtualenv
+}:
+
+buildPythonPackage rec {
+  pname = "setuptools-scm-tests";
+  inherit (setuptools-scm) version;
+
+  src = setuptools-scm.src;
+
+  dontBuild = true;
+  dontInstall = true;
+
+  checkInputs = [
+    pytestCheckHook
+    setuptools-scm
+    pip
+    virtualenv
+    git
+    mercurial
+  ];
+
+  disabledTests = [
+    # network access
+    "test_pip_download"
+  ];
+}
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..883ca18e93e4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/setuptools/default.nix
@@ -0,0 +1,81 @@
+{ stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, python
+, bootstrapped-pip
+, lib
+, pipInstallHook
+, setuptoolsBuildHook
+}:
+
+let
+  pname = "setuptools";
+  version = "63.2.0";
+
+  # Create an sdist of setuptools
+  sdist = stdenv.mkDerivation rec {
+    name = "${pname}-${version}-sdist.tar.gz";
+
+    src = fetchFromGitHub {
+      owner = "pypa";
+      repo = pname;
+      rev = "v${version}";
+      hash = "sha256-GyQjc0XulUxl3Btpj7Q6KHTpd1FDZnXCYviYjjgK7tY=";
+      name = "${pname}-${version}-source";
+    };
+
+    patches = [
+      ./tag-date.patch
+      ./setuptools-distutils-C++.patch
+    ];
+
+    buildPhase = ''
+      ${python.pythonForBuild.interpreter} setup.py egg_info
+      ${python.pythonForBuild.interpreter} setup.py sdist --formats=gztar
+
+      # Here we untar the sdist and retar it in order to control the timestamps
+      # of all the files included
+      tar -xzf dist/${pname}-${version}.post0.tar.gz -C dist/
+      tar -czf dist/${name} -C dist/ --mtime="@$SOURCE_DATE_EPOCH" --sort=name ${pname}-${version}.post0
+    '';
+
+    installPhase = ''
+      echo "Moving sdist..."
+      mv dist/${name} $out
+    '';
+  };
+in buildPythonPackage rec {
+  inherit pname version;
+  # Because of bootstrapping we don't use the setuptoolsBuildHook that comes with format="setuptools" directly.
+  # Instead, we override it to remove setuptools to avoid a circular dependency.
+  # The same is done for pip and the pipInstallHook.
+  format = "other";
+
+  src = sdist;
+
+  nativeBuildInputs = [
+    bootstrapped-pip
+    (pipInstallHook.override{pip=null;})
+    (setuptoolsBuildHook.override{setuptools=null; wheel=null;})
+  ];
+
+  preBuild = lib.optionalString (!stdenv.hostPlatform.isWindows) ''
+    export SETUPTOOLS_INSTALL_WINDOWS_SPECIFIC_FILES=0
+  '';
+
+  pipInstallFlags = [ "--ignore-installed" ];
+
+  # Adds setuptools to nativeBuildInputs causing infinite recursion.
+  catchConflicts = false;
+
+  # Requires pytest, causing infinite recursion.
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Utilities to facilitate the installation of Python packages";
+    homepage = "https://pypi.python.org/pypi/setuptools";
+    license = with licenses; [ psfl zpl20 ];
+    platforms = python.meta.platforms;
+    priority = 10;
+  };
+}
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..ae844ecd2d3f
--- /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 445e2e51..2fdbdcca 100644
+--- a/setuptools/_distutils/cygwinccompiler.py
++++ b/setuptools/_distutils/cygwinccompiler.py
+@@ -131,14 +131,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=('%s -mcygwin %s' % (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
+@@ -170,9 +175,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)
+ 
+@@ -323,9 +331,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='%s %s' % (self.linker_dll, shared_option),
++            linker_exe_cxx='%s' % self.cxx,
++            linker_so_cxx='%s %s' % (self.linker_dll_cxx, shared_option)
+         )
+ 
+         # Maybe we should also append -mthreads, but then the finished
+diff --git a/setuptools/_distutils/sysconfig.py b/setuptools/_distutils/sysconfig.py
+index e41d51ee..f7ded14b 100644
+--- a/setuptools/_distutils/sysconfig.py
++++ b/setuptools/_distutils/sysconfig.py
+@@ -280,6 +280,7 @@ def customize_compiler(compiler):
+             cflags,
+             ccshared,
+             ldshared,
++            ldcxxshared,
+             shlib_suffix,
+             ar,
+             ar_flags,
+@@ -289,11 +290,14 @@ def customize_compiler(compiler):
+             '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):
+@@ -305,19 +309,27 @@ def customize_compiler(compiler):
+             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:
+@@ -326,13 +338,17 @@ def customize_compiler(compiler):
+             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 4be74fdf..66f95aef 100644
+--- a/setuptools/_distutils/unixccompiler.py
++++ b/setuptools/_distutils/unixccompiler.py
+@@ -112,9 +112,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,
+     }
+@@ -174,8 +177,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)
+ 
+@@ -243,7 +251,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/setuptoolstrial/default.nix b/nixpkgs/pkgs/development/python-modules/setuptoolstrial/default.nix
new file mode 100644
index 000000000000..f959458d2653
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/setuptoolstrial/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+, virtualenv
+, pytest-runner
+, pytest-virtualenv
+, twisted
+, pathlib2
+}:
+
+buildPythonPackage rec {
+  pname = "setuptools_trial";
+  version = "0.6.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "14220f8f761c48ba1e2526f087195077cf54fad7098b382ce220422f0ff59b12";
+  };
+
+  buildInputs = [ pytest virtualenv pytest-runner pytest-virtualenv ];
+  propagatedBuildInputs = [ twisted pathlib2 ];
+
+  postPatch = ''
+    sed -i '12,$d' tests/test_main.py
+  '';
+
+  # Couldn't get tests working
+  doCheck = false;
+
+  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/seventeentrack/default.nix b/nixpkgs/pkgs/development/python-modules/seventeentrack/default.nix
new file mode 100644
index 000000000000..8e70b4af51d4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/seventeentrack/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, aiohttp
+, aresponses
+, async-timeout
+, attrs
+, buildPythonPackage
+, fetchFromGitHub
+, 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=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    async-timeout
+    attrs
+    pytz
+  ];
+
+  checkInputs = [
+    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..fd7d99fbb3fc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sexpdata/default.nix
@@ -0,0 +1,23 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "sexpdata";
+  version = "0.0.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1ac827a616c5e87ebb60fd6686fb86f8a166938c645f4089d92de3ffbdd494e0";
+  };
+
+  doCheck = false;
+
+  meta = with lib; {
+    description = "S-expression parser for Python";
+    homepage = "https://github.com/tkf/sexpdata";
+    license = licenses.bsd0;
+  };
+
+}
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..03f3b64ee509
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sfepy/default.nix
@@ -0,0 +1,77 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchFromGitHub
+, numpy
+, scipy
+, matplotlib
+, pyparsing
+, tables
+, cython
+, python
+, sympy
+, meshio
+, mpi4py
+, psutil
+, openssh
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "sfepy";
+  version = "2022.1";
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "sfepy";
+    repo = "sfepy";
+    rev = "release_${version}";
+    sha256 = "sha256-OayULh/dGI5sEynYMc+JLwUd67zEGdIGEKo6CTOdZS8=";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    cython
+    scipy
+    matplotlib
+    pyparsing
+    tables
+    sympy
+    meshio
+    mpi4py
+    psutil
+    openssh
+  ];
+
+  postPatch = ''
+    # broken tests
+    rm tests/test_meshio.py
+
+    # slow tests
+    rm tests/test_input_*.py
+    rm tests/test_elasticity_small_strain.py
+    rm tests/test_term_call_modes.py
+    rm tests/test_refine_hanging.py
+    rm tests/test_hyperelastic_tlul.py
+    rm tests/test_poly_spaces.py
+    rm tests/test_linear_solvers.py
+    rm tests/test_quadratures.py
+  '';
+
+  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} run_tests.py -o $TMPDIR/test_outputs --raise
+  '';
+
+  meta = with lib; {
+    broken = stdenv.isLinux && stdenv.isAarch64;
+    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/sgmllib3k/default.nix b/nixpkgs/pkgs/development/python-modules/sgmllib3k/default.nix
new file mode 100644
index 000000000000..c4b0d9bdb94d
--- /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";
+  };
+
+  checkInputs = [
+    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/sh/default.nix b/nixpkgs/pkgs/development/python-modules/sh/default.nix
new file mode 100644
index 000000000000..a08920a39e2b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sh/default.nix
@@ -0,0 +1,36 @@
+{ lib, buildPythonPackage, fetchPypi, python, coverage, lsof, glibcLocales, coreutils }:
+
+buildPythonPackage rec {
+  pname = "sh";
+  version = "1.14.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9d7bd0334d494b2a4609fe521b2107438cdb21c0e469ffeeb191489883d6fe0d";
+  };
+
+  patches = [
+    # Disable tests that fail on Darwin sandbox
+    ./disable-broken-tests-darwin.patch
+  ];
+
+  postPatch = ''
+    sed -i 's#/usr/bin/env python#${python.interpreter}#' test.py
+    sed -i 's#/bin/sleep#${coreutils.outPath}/bin/sleep#' test.py
+  '';
+
+  checkInputs = [ coverage lsof glibcLocales ];
+
+  # A test needs the HOME directory to be different from $TMPDIR.
+  preCheck = ''
+    export LC_ALL="en_US.UTF-8"
+    HOME=$(mktemp -d)
+  '';
+
+  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/sh/disable-broken-tests-darwin.patch b/nixpkgs/pkgs/development/python-modules/sh/disable-broken-tests-darwin.patch
new file mode 100644
index 000000000000..dfeb50db8d0e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sh/disable-broken-tests-darwin.patch
@@ -0,0 +1,48 @@
+From c596ad546fe7460b57a62799837757eb641309c1 Mon Sep 17 00:00:00 2001
+From: Sirio Balmelli <sirio@b-ad.ch>
+Date: Mon, 20 Jul 2020 19:51:20 +0200
+Subject: [PATCH] Disable tests that fail on Darwin (macOS) or with sandboxing
+
+Signed-off-by: Sirio Balmelli <sirio@b-ad.ch>
+--- a/test.py
++++ b/test.py
+@@ -377,6 +377,7 @@ exit(3)
+         self.assertEqual(sed(_in="one test three", e="s/test/two/").strip(),
+                          "one two three")
+ 
++    @not_macos
+     def test_ok_code(self):
+         from sh import ls, ErrorReturnCode_1, ErrorReturnCode_2
+ 
+@@ -982,6 +983,7 @@ print(sys.argv[1])
+         now = time.time()
+         self.assertGreater(now - start, sleep_time)
+ 
++    @not_macos
+     def test_background_exception(self):
+         from sh import ls, ErrorReturnCode_1, ErrorReturnCode_2
+         p = ls("/ofawjeofj", _bg=True, _bg_exc=False)  # should not raise
+@@ -1779,6 +1781,7 @@ exit(49)
+         p = python(py.name, _ok_code=49, _bg=True)
+         self.assertEqual(49, p.exit_code)
+ 
++    @not_macos
+     def test_cwd(self):
+         from sh import pwd
+         from os.path import realpath
+@@ -2777,6 +2780,7 @@ print("cool")
+     # on osx.  so skip it for now if osx
+     @not_macos
+     @requires_progs("lsof")
++    @skipUnless(False, "Flaky on Hydra")
+     def test_no_fd_leak(self):
+         import sh
+         import os
+@@ -2879,6 +2883,7 @@ print("hi")
+         python(py.name, _in=stdin)
+ 
+     @requires_utf8
++    @skipUnless(False, "Does not work in sandbox")
+     def test_unicode_path(self):
+         from sh import Command
+ 
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..737156ad83fd
--- /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}";
+    sha256 = "sha256-b9tBXN9dBdAeGg3xf5ZBdd6kPpFzseJl6wRTTfNZEwo=";
+  };
+
+  propagatedBuildInputs = [
+    attrs
+    click
+    colorama
+  ];
+
+  checkInputs = [ 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..3041a7d92a74
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/shap/default.nix
@@ -0,0 +1,72 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, isPy27
+, pytestCheckHook
+, numpy
+, scipy
+, scikit-learn
+, pandas
+, tqdm
+, slicer
+, numba
+, matplotlib
+, nose
+, ipython
+}:
+
+buildPythonPackage rec {
+  pname = "shap";
+  version = "0.41.0";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "slundberg";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-rYVWQ3VRvIObSQPwDRsxhTOGOKNkYkLtiHzVwoB3iJ0=";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    scipy
+    scikit-learn
+    pandas
+    tqdm
+    slicer
+    numba
+  ];
+
+  preCheck = ''
+    export HOME=$TMPDIR
+    # when importing the local copy the extension is not found
+    rm -r shap
+  '';
+  checkInputs = [ pytestCheckHook matplotlib nose ipython ];
+  # Those tests access the network
+  disabledTests = [
+    "test_kernel_shap_with_a1a_sparse_zero_background"
+    "test_kernel_shap_with_a1a_sparse_nonzero_background"
+    "test_kernel_shap_with_high_dim_sparse"
+    "test_sklearn_random_forest_newsgroups"
+    "test_sum_match_random_forest"
+    "test_sum_match_extra_trees"
+    "test_single_row_random_forest"
+    "test_sum_match_gradient_boosting_classifier"
+    "test_single_row_gradient_boosting_classifier"
+    "test_HistGradientBoostingClassifier_proba"
+    "test_HistGradientBoostingClassifier_multidim"
+    "test_sum_match_gradient_boosting_regressor"
+    "test_single_row_gradient_boosting_regressor"
+  ];
+
+  meta = with lib; {
+    description = "A unified approach to explain the output of any machine learning model";
+    homepage = "https://github.com/slundberg/shap";
+    license = licenses.mit;
+    maintainers = with maintainers; [ evax ];
+    platforms = platforms.unix;
+    # ModuleNotFoundError: No module named 'sklearn.ensemble.iforest'
+    broken = true;
+  };
+}
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..a41381fe35bf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/shapely/default.nix
@@ -0,0 +1,71 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, substituteAll
+, pythonOlder
+, geos
+, pytestCheckHook
+, cython
+, numpy
+}:
+
+buildPythonPackage rec {
+  pname = "Shapely";
+  version = "1.8.2";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-Vyr51QBv1eMhPjfuVIkSsDQfsmck1tyKTjlQwQGX67Y=";
+  };
+
+  nativeBuildInputs = [
+    geos # for geos-config
+    cython
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  # Environment variable used in shapely/_buildcfg.py
+  GEOS_LIBRARY_PATH = "${geos}/lib/libgeos_c${stdenv.hostPlatform.extensions.sharedLibrary}";
+
+  patches = [
+    # Patch to search form GOES .so/.dylib files in a Nix-aware way
+    (substituteAll {
+      src = ./library-paths.patch;
+      libgeos_c = GEOS_LIBRARY_PATH;
+      libc = lib.optionalString (!stdenv.isDarwin) "${stdenv.cc.libc}/lib/libc${stdenv.hostPlatform.extensions.sharedLibrary}.6";
+    })
+    (fetchpatch {
+      name = "fix-tests-geos-3.11.patch";
+      url = "https://github.com/shapely/shapely/commit/21c8e8a7909e7fb3cce6daa5c5b8284ac927fcb0.patch";
+      includes = [ "tests/test_parallel_offset.py" ];
+      sha256 = "sha256-85c8NlmAzzfCgepe/411ug5Sq+665dFMb3ySaUt9Kew=";
+    })
+ ];
+
+  preCheck = ''
+    rm -r shapely # prevent import of local shapely
+  '';
+
+  disabledTests = [
+    "test_collection"
+  ];
+
+  pythonImportsCheck = [ "shapely" ];
+
+  meta = with lib; {
+    description = "Geometric objects, predicates, and operations";
+    homepage = "https://pypi.python.org/pypi/Shapely/";
+    license = with licenses; [ bsd3 ];
+    maintainers = with maintainers; [ knedlsepp ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/shapely/library-paths.patch b/nixpkgs/pkgs/development/python-modules/shapely/library-paths.patch
new file mode 100644
index 000000000000..d095eada9d6e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/shapely/library-paths.patch
@@ -0,0 +1,31 @@
+diff --git a/shapely/geos.py b/shapely/geos.py
+index 88c5f53..1ccd6e4 100644
+--- a/shapely/geos.py
++++ b/shapely/geos.py
+@@ -96,6 +96,7 @@ if sys.platform.startswith('linux'):
+         alt_paths = [
+             'libgeos_c.so.1',
+             'libgeos_c.so',
++            '@libgeos_c@',
+         ]
+         _lgeos = load_dll('geos_c', fallbacks=alt_paths)
+ 
+@@ -160,6 +161,7 @@ elif sys.platform == 'darwin':
+             "/usr/local/lib/libgeos_c.dylib",
+             # homebrew Apple Silicon
+             "/opt/homebrew/lib/libgeos_c.dylib",
++            "@libgeos_c@",
+         ]
+         _lgeos = load_dll('geos_c', fallbacks=alt_paths)
+ 
+diff --git a/tests/test_dlls.py b/tests/test_dlls.py
+index c71da8e..c36262c 100644
+--- a/tests/test_dlls.py
++++ b/tests/test_dlls.py
+@@ -18,4 +18,5 @@ class LoadingTestCase(unittest.TestCase):
+             '/opt/homebrew/lib/libgeos_c.dylib',  # homebrew (macOS)
+             os.path.join(sys.prefix, "lib", "libgeos_c.so"), # anaconda (Linux)
+             'libgeos_c.so.1',
+-            'libgeos_c.so'])
++            'libgeos_c.so',
++            '@libgeos_c@'])
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..e41205fba737
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sharkiq/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchPypi
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "sharkiq";
+  version = "0.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "e5efb0ad13a66cf6a097da5c128347ef7bd0b2abe53a8ca65cbc847ec1190c8b";
+  };
+
+  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/shellescape/default.nix b/nixpkgs/pkgs/development/python-modules/shellescape/default.nix
new file mode 100644
index 000000000000..2d7309d88215
--- /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=";
+  };
+
+  checkInputs = [ 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..1d1a1fc46bdd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/shellingham/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "shellingham";
+  version = "1.4.0";
+  format = "pyproject";
+  disabled = pythonOlder "3.4";
+
+  src = fetchFromGitHub {
+    owner = "sarugaku";
+    repo = pname;
+    rev = version;
+    sha256 = "0f686ym3ywjffis5jfqkhsshjgii64060hajysczflhffrjn9jcp";
+  };
+
+  checkInputs = [
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "shellingham" ];
+
+  meta = with lib; {
+    description = "Tool to detect the surrounding shell";
+    homepage = "https://github.com/sarugaku/shellingham";
+    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..c4210cfeda2e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/shiboken2/default.nix
@@ -0,0 +1,42 @@
+{ python, lib, stdenv, pyside2
+, cmake, qt5, llvmPackages }:
+
+stdenv.mkDerivation {
+  pname = "shiboken2";
+
+  inherit (pyside2) version src;
+
+  patches = [
+    ./nix_compile_cflags.patch
+  ];
+
+  postPatch = ''
+    cd sources/shiboken2
+  '';
+
+  CLANG_INSTALL_DIR = llvmPackages.libclang.out;
+
+  nativeBuildInputs = [ cmake ];
+  buildInputs = [ llvmPackages.libclang python python.pkgs.setuptools qt5.qtbase qt5.qtxmlpatterns ];
+
+  cmakeFlags = [
+    "-DBUILD_TESTS=OFF"
+  ];
+
+  dontWrapQtApps = true;
+
+  postInstall = ''
+    cd ../../..
+    ${python.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/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..ab873da47a7b
--- /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.1";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ec16095a0565906536af7f5e57771e9ae7a061b646ed63ad66ebbc70c30f4d2a";
+  };
+
+  propagatedBuildInputs = [ click pip setuptools wheel ];
+
+  pythonImportsCheck = [ "shiv" ];
+
+  checkInputs = [ 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/shodan/default.nix b/nixpkgs/pkgs/development/python-modules/shodan/default.nix
new file mode 100644
index 000000000000..1a17905f3b83
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/shodan/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, click-plugins
+, colorama
+, requests
+, setuptools
+, pythonOlder
+, XlsxWriter
+}:
+
+buildPythonPackage rec {
+  pname = "shodan";
+  version = "1.28.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-GL0q6BEUtwg24OMxUicyXhQ5gnUiOZiowjWwmUMvSws=";
+  };
+
+  propagatedBuildInputs = [
+    click-plugins
+    colorama
+    requests
+    setuptools
+    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";
+    license = licenses.mit;
+    maintainers = with maintainers; [ 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..b443e319290c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/shortuuid/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "shortuuid";
+  version = "1.0.9";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-RZ8S+hrMNP8hOxNxRnwDJRaWRaMe2YniaIcjOa91Y9U=";
+  };
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "shortuuid"
+  ];
+
+  pytestFlagsArray = [
+    "shortuuid/tests.py"
+  ];
+
+  meta = with lib; {
+    description = "Library to generate concise, unambiguous and URL-safe UUIDs";
+    homepage = "https://github.com/stochastic-technologies/shortuuid/";
+    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..b733c1c95162
--- /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";
+  };
+
+  checkInputs = [ 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/showit/default.nix b/nixpkgs/pkgs/development/python-modules/showit/default.nix
new file mode 100644
index 000000000000..0cc379161324
--- /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
+  ];
+
+  checkInputs = [
+    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 = [ maintainers.costrouc ];
+  };
+}
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..f5a276497502
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/shtab/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-timeout
+, pytestCheckHook
+, pythonOlder
+, setuptools-scm
+, bashInteractive
+}:
+
+buildPythonPackage rec {
+  pname = "shtab";
+  version = "1.5.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "iterative";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-I6De64eawNi36c8NiyVxj63PkxnZfUYYT4Dw4l42Ztk=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  checkInputs = [
+    bashInteractive
+    pytest-timeout
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace " --cov=shtab --cov-report=term-missing --cov-report=xml" ""
+  '';
+
+  pythonImportsCheck = [
+    "shtab"
+  ];
+
+  meta = with lib; {
+    description = "Module for shell tab completion of Python CLI applications";
+    homepage = "https://docs.iterative.ai/shtab/";
+    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..a30e23c894e0
--- /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";
+  };
+
+  checkInputs = [ 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..4e0e058ac947
--- /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;
+    sha256 = "sha256-7cubQWqYWjzFt9f01+wBPjcuv5DmTJ2eAOIDEpmvOP0=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  checkInputs = [
+    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/signedjson/default.nix b/nixpkgs/pkgs/development/python-modules/signedjson/default.nix
new file mode 100644
index 000000000000..c7604126c7a3
--- /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
+  ];
+
+  checkInputs = [
+    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..dbad1a8167db
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/signify/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, asn1crypto
+, certvalidator
+, oscrypto
+, pyasn1
+, pyasn1-modules
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "signify";
+  version = "0.4.0";
+  disabled = pythonOlder "3.6";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "ralphje";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-YJc9RIqkEL7dd1ahE4IbxyyZgsZWBDqbXZAvI/nK24M=";
+  };
+
+  propagatedBuildInputs = [
+    asn1crypto
+    certvalidator
+    oscrypto
+    pyasn1
+    pyasn1-modules
+  ];
+
+  pythonImportsCheck = [
+    "signify"
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # chain doesn't validate because end-entitys certificate expired
+    # https://github.com/ralphje/signify/issues/27
+    "test_revoked_certificate"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/ralphje/signify";
+    description = "library that verifies PE Authenticode-signed binaries";
+    license = licenses.mit;
+    maintainers = with maintainers; [ baloo ];
+  };
+}
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/sigtools/default.nix b/nixpkgs/pkgs/development/python-modules/sigtools/default.nix
new file mode 100644
index 000000000000..e1a0cc33821b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sigtools/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, sphinx
+, mock
+, coverage
+, unittest2
+, attrs
+, funcsigs
+, six
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "sigtools";
+  version = "4.0.0";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-fMhKC6VuNLfxXkM3RCaPEODEp21r/s6JzswaHKkROLY=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    attrs
+  ];
+
+  patchPhase = ''sed -i s/test_suite="'"sigtools.tests"'"/test_suite="'"unittest2.collector"'"/ setup.py'';
+
+  # repeated_test no longer exists in nixpkgs
+  # Also see: https://github.com/epsy/sigtools/issues/26
+  doCheck = false;
+  checkInputs = [ sphinx mock coverage unittest2 ];
+
+  meta = with lib; {
+    description = "Utilities for working with 3.3's inspect.Signature objects.";
+    homepage = "https://pypi.python.org/pypi/sigtools";
+    license = licenses.mit;
+  };
+
+}
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..c712edf5ca8b
--- /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;
+    sha256 = "sha256-yKZHkrf6fM0WsHczIEK5Kxusz5dSBgydK3fLu1nDyvk=";
+  };
+
+  checkInputs = [ 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..68e9638c350a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/simber/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, colorama
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "simber";
+  version = "0.2.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "deepjyoti30";
+    repo = pname;
+    rev = version;
+    hash = "sha256-P4bhxu9Di4E2Zkd0vIkyDi1S6Y0V/EQSMF4ftWoiXKE=";
+  };
+
+  propagatedBuildInputs = [
+    colorama
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "simber"
+  ];
+
+  meta = with lib; {
+    description = "Simple, minimal and powerful logger for Python";
+    homepage = "https://github.com/deepjyoti30/simber";
+    license = licenses.mit;
+    maintainers = with maintainers; [ j0hax ];
+  };
+}
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..c79b58f8a629
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/simple-di/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, setuptools
+, typing-extensions
+, dataclasses
+}:
+
+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
+  ] ++ lib.optional (pythonOlder "3.7") [
+    dataclasses
+  ];
+
+  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..4b5b2ed06811
--- /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.1.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "allisson";
+    repo = "python-simple-rest-client";
+    rev = version;
+    sha256 = "sha256-HdGYLDrqQvd7hvjwhC5dY2amdHUZHTYJvD1QP89lcXU=";
+  };
+
+  propagatedBuildInputs = [
+    httpx
+    python-slugify
+    python-status
+  ];
+
+  checkInputs = [
+    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..29a4e957e84c
--- /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.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5c4a9c58f1b742f7fa8af0fe4ea6ff9fb02294ae041912f771570dfaf339d2b9";
+  };
+
+  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..e508ab9dbf97
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/simple-salesforce/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, authlib
+, requests
+, nose
+, pythonOlder
+, pytz
+, responses
+, zeep
+}:
+
+buildPythonPackage rec {
+  pname = "simple-salesforce";
+  version = "1.12.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-eDaqL4CsP5wOqfwrkeWJdg+rlcMnFT3l7A9xgVnhx0w=";
+  };
+
+  propagatedBuildInputs = [
+    authlib
+    requests
+    zeep
+  ];
+
+  checkInputs = [
+    nose
+    pytz
+    responses
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+    nosetests -v
+    runHook postCheck
+  '';
+
+  meta = with lib; {
+    description = "A very simple Salesforce.com REST API client for Python";
+    homepage = "https://github.com/simple-salesforce/simple-salesforce";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ costrouc ];
+  };
+
+}
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/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..06fe8e236b37
--- /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";
+  };
+
+  checkInputs = [ 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..a296a721a8e0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/simpleeval/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "simpleeval";
+  version = "0.9.12";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "danthedeckie";
+    repo = pname;
+    rev = version;
+    sha256 = "0khgl729q5133fgc00d550f4r77707rkkn7r56az4v8bvx0q8xp4";
+  };
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "test_simpleeval.py"
+  ];
+
+  pythonImportsCheck = [
+    "simpleeval"
+  ];
+
+  meta = with lib; {
+    description = "Simple, safe single expression evaluator library";
+    homepage = "https://github.com/danthedeckie/simpleeval";
+    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..fc241ce278ac
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/simplefix/default.nix
@@ -0,0 +1,25 @@
+{ lib, python, buildPythonPackage, fetchFromGitHub }:
+
+buildPythonPackage rec {
+  pname = "simplefix";
+  version = "1.0.15";
+
+  src = fetchFromGitHub {
+    repo = "simplefix";
+    owner = "da4089";
+    rev = "v${version}";
+    sha256 = "sha256-GQHMotxNRuRv6zXhrD02T+aFgfYe3RnvUGADsBeSPbA=";
+  };
+
+  checkPhase = ''
+    cd test
+    ${python.interpreter} -m unittest all
+  '';
+
+  meta = with lib; {
+    description = "Simple FIX Protocol implementation for Python";
+    homepage = "https://github.com/da4089/simplefix";
+    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..1ecd446c5b48
--- /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 ];
+
+  checkInputs = [
+    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/simplejson/default.nix b/nixpkgs/pkgs/development/python-modules/simplejson/default.nix
new file mode 100644
index 000000000000..74530b3fb830
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/simplejson/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, stdenv
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "simplejson";
+  version = "3.17.6";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "1irlp5sakbdfcf717qmrx0r9rjlmwk0vza6zm3y55d32zw5c1cxg";
+  };
+
+  checkInputs = [
+    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";
+    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/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/simplisafe-python/default.nix b/nixpkgs/pkgs/development/python-modules/simplisafe-python/default.nix
new file mode 100644
index 000000000000..42a9fa1ebf79
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/simplisafe-python/default.nix
@@ -0,0 +1,88 @@
+{ lib
+, aiohttp
+, aresponses
+, asynctest
+, backoff
+, beautifulsoup4
+, buildPythonPackage
+, docutils
+, fetchFromGitHub
+, poetry-core
+, pytest-aiohttp
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, pytz
+, types-pytz
+, voluptuous
+, websockets
+}:
+
+buildPythonPackage rec {
+  pname = "simplisafe-python";
+  version = "2022.07.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "bachya";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-mbdL1fX86OPMw6I7Lk7NDhm2kE6/iamYbyvYvJrkwLQ=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    backoff
+    beautifulsoup4
+    docutils
+    pytz
+    voluptuous
+    websockets
+  ];
+
+  checkInputs = [
+    aresponses
+    asynctest
+    pytest-aiohttp
+    pytest-asyncio
+    pytestCheckHook
+    types-pytz
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'docutils = "<0.18"' 'docutils = "*"'
+  '';
+
+  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; {
+    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..ff139523e1f4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/simpy/default.nix
@@ -0,0 +1,27 @@
+{ buildPythonPackage, fetchPypi, isPy27, lib, setuptools, setuptools-scm
+, pytestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "simpy";
+  version = "4.0.1";
+
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b36542e2faab612f861c5ef4da17220ac1553f5892b3583c67281dbe4faad404";
+  };
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  propagatedBuildInputs = [ setuptools ];
+
+  checkInputs = [ 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-version/0001-set-poetry-core.patch b/nixpkgs/pkgs/development/python-modules/single-version/0001-set-poetry-core.patch
new file mode 100644
index 000000000000..4c6f869c0c27
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/single-version/0001-set-poetry-core.patch
@@ -0,0 +1,21 @@
+From d949b37151cd538d4c6a15e1ba6c1343f8bff76d Mon Sep 17 00:00:00 2001
+From: "P. R. d. O" <d.ol.rod@protonmail.com>
+Date: Mon, 6 Dec 2021 15:26:19 -0600
+Subject: [PATCH] set poetry-core
+
+---
+ pyproject.toml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/pyproject.toml b/pyproject.toml
+index d3fdc52..bd7ddc2 100644
+--- a/pyproject.toml
++++ b/pyproject.toml
+@@ -27,4 +27,4 @@ black = "^19.10b0"
+
+ [build-system]
+ requires = ["poetry>=0.12"]
+-build-backend = "poetry.masonry.api"
++build-backend = "poetry.core.masonry.api"
+--
+2.33.1
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..39cd92f5f67e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/single-version/default.nix
@@ -0,0 +1,31 @@
+{ lib, buildPythonPackage, fetchFromGitHub, poetry-core, pytestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "single-version";
+  version = "1.5.1";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "hongquan";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-I8ATQzPRH9FVjqPoqrNjYMBU5azpmkLjRmHcz943C10=";
+  };
+
+  patches = [
+    ./0001-set-poetry-core.patch
+  ];
+
+  nativeBuildInputs = [ poetry-core ];
+
+  checkInputs = [ 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..3da681dd97c7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/siobrultech-protocols/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, pytest-asyncio
+, pytestCheckHook
+, pyyaml
+}:
+
+buildPythonPackage rec {
+  pname = "siobrultech-protocols";
+  version = "0.6.0";
+
+  disabled = pythonOlder "3.8";
+
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "sdwilsh";
+    repo = "siobrultech-protocols";
+    rev = "v${version}";
+    hash = "sha256-d4zAwcSCyC78dJZtxFkpdYurxDRon2cRgzInllP2qJQ=";
+  };
+
+  checkInputs = [
+    pytest-asyncio
+    pytestCheckHook
+    pyyaml
+  ];
+
+  pythonImportsCheck = [
+    "siobrultech_protocols.gem.api"
+    "siobrultech_protocols.gem.protocol"
+  ];
+
+  meta = {
+    description = "A Sans-I/O Python client library for Brultech Devices";
+    homepage = "https://github.com/sdwilsh/siobrultech-protocols";
+    license = lib.licenses.mit;
+    maintainers = with lib.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..d588c2dff625
--- /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.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-k2+qTtxkF0rT5LLPW8icePbf9jNopdo9uDp3NPA9SRo=";
+  };
+
+  propagatedBuildInputs = [
+    trio
+  ];
+
+  checkInputs = [
+    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..5f6a3a5f82f2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sip/4.x.nix
@@ -0,0 +1,44 @@
+{ lib, fetchurl, buildPythonPackage, python, isPyPy, 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";
+  };
+
+  configurePhase = ''
+    ${python.executable} ./configure.py \
+      --sip-module ${sip-module} \
+      -d $out/${python.sitePackages} \
+      -b $out/bin -e $out/include
+  '';
+
+  enableParallelBuilding = true;
+
+  installCheckPhase = let
+    modules = [
+      sip-module
+      "sipconfig"
+    ];
+    imports = lib.concatMapStrings (module: "import ${module};") modules;
+  in ''
+    echo "Checking whether modules can be imported..."
+    PYTHONPATH=$out/${python.sitePackages}:$PYTHONPATH ${python.interpreter} -c "${imports}"
+  '';
+
+  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..68052145766c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sip/default.nix
@@ -0,0 +1,54 @@
+{ lib, stdenv, fetchPypi, buildPythonPackage, packaging, ply, toml, fetchpatch }:
+
+buildPythonPackage rec {
+  pname = "sip";
+  version = "6.6.2";
+
+  src = fetchPypi {
+    pname = "sip";
+    inherit version;
+    sha256 = "sha256-Dj76wcXf2OUlrlcUCSffJpk+E/WLidFXfDFPQQW/2Q0=";
+  };
+
+  patches = [
+    # on non-x86 Linux platforms, sip incorrectly detects the manylinux version
+    # and PIP will refuse to install the resulting wheel.
+    # remove once upstream fixes this, hopefully in 6.5.2
+    ./fix-manylinux-version.patch
+
+    # fix issue triggered by QGIS 3.26.x, already fixed upstream
+    # in SIP, waiting for release past 6.6.2
+    (fetchpatch {
+      url = "https://riverbankcomputing.com/hg/sip/raw-diff/323d39a2d602/sipbuild/generator/parser/instantiations.py";
+      hash = "sha256-QEQuRzXA+wK9Dt22U/LgIwtherY9pJURGJYpKpJkiok=";
+    })
+  ];
+
+  propagatedBuildInputs = [ packaging ply toml ];
+
+  # There aren't tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "sipbuild" ];
+
+  # FIXME: Why isn't this detected automatically?
+  # Needs to be specified in pyproject.toml, e.g.:
+  # [tool.sip.bindings.MODULE]
+  # tags = [PLATFORM_TAG]
+  platform_tag =
+    if stdenv.targetPlatform.isLinux then
+      "WS_X11"
+    else if stdenv.targetPlatform.isDarwin then
+      "WS_MACX"
+    else if stdenv.targetPlatform.isWindows then
+      "WS_WIN"
+    else
+      throw "unsupported platform";
+
+  meta = with lib; {
+    description = "Creates C++ bindings for Python modules";
+    homepage    = "https://riverbankcomputing.com/";
+    license     = licenses.gpl3Only;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sip/fix-manylinux-version.patch b/nixpkgs/pkgs/development/python-modules/sip/fix-manylinux-version.patch
new file mode 100644
index 000000000000..4b8e99ae8e47
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sip/fix-manylinux-version.patch
@@ -0,0 +1,19 @@
+diff --git a/sipbuild/project.py b/sipbuild/project.py
+--- a/sipbuild/project.py
++++ b/sipbuild/project.py
+@@ -336,13 +336,13 @@ class Project(AbstractProject, Configurable):
+             # We expect a two part tag so leave anything else unchanged.
+             parts = platform_tag.split('-')
+             if len(parts) == 2:
+-                if self.minimum_glibc_version > (2, 17):
++                if self.minimum_glibc_version > (2, 17) or parts[1] not in {"x86_64", "i686", "aarch64", "armv7l", "ppc64", "ppc64le", "s390x"}:
+                     # PEP 600.
+                     parts[0] = 'manylinux'
+                     parts.insert(1,
+                             '{}.{}'.format(self.minimum_glibc_version[0],
+                                     self.minimum_glibc_version[1]))
+-                elif self.minimum_glibc_version > (2, 12):
++                elif self.minimum_glibc_version > (2, 12) or parts[1] not in {"x86_64", "i686"}:
+                     # PEP 599.
+                     parts[0] = 'manylinux2014'
+                 elif self.minimum_glibc_version > (2, 5):
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..24fe639211d1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/six/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "six";
+  version = "1.16.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926";
+  };
+
+  checkInputs = [ pytest ];
+
+  checkPhase = ''
+    py.test test_six.py
+  '';
+
+  # To prevent infinite recursion with pytest
+  doCheck = false;
+
+  meta = {
+    description = "A Python 2 and 3 compatibility library";
+    homepage = "https://pypi.python.org/pypi/six/";
+    license = lib.licenses.mit;
+  };
+}
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..41da6669b54f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sjcl/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pycryptodome
+, python
+}:
+
+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 ];
+
+  checkPhase = ''
+    runHook preCheck
+    ${python.interpreter} -m unittest discover
+    runHook postCheck
+  '';
+
+  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..8dc3391e9e97
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/skein/default.nix
@@ -0,0 +1,61 @@
+{ buildPythonPackage
+, callPackage
+, fetchPypi
+, isPy27
+, lib
+, cryptography
+, grpcio
+, pyyaml
+, grpcio-tools
+, hadoop
+, pytestCheckHook
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "skein";
+  version = "0.8.1";
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "04208b4be9df2dc68ac5b3e3ae51fd9b589add95ea1b67222a8de754d17b1efa";
+  };
+  # Update this hash if bumping versions
+  jarHash = "sha256-UGiEoTZ17IhLG72FZ18Zb+Ej4T8z9rMIMDUxzSZGZyY=";
+  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" ];
+
+  checkInputs = [ 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..d559f237bf71
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/skein/skeinjar.nix
@@ -0,0 +1,20 @@
+{ fetchPypi, unzip, stdenv, pname, version, jarHash }:
+
+stdenv.mkDerivation rec {
+  inherit pname version;
+
+  src = fetchPypi {
+    inherit pname version;
+    format = "wheel";
+    hash = jarHash;
+  };
+
+  dontUnpack = true;
+
+  nativeBuildInputs = [ unzip ];
+
+  installPhase = ''
+    unzip ${src}
+    mv ./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..b537d5a9bf6f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/skia-pathops/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, cython
+, ninja
+, setuptools-scm
+, setuptools
+, fetchPypi
+, gn
+, pytestCheckHook
+, xcodebuild
+, ApplicationServices
+, OpenGL
+}:
+
+buildPythonPackage rec {
+  pname = "skia-pathops";
+  version = "0.7.2";
+
+  src = fetchPypi {
+    pname = "skia-pathops";
+    inherit version;
+    extension = "zip";
+    sha256 = "sha256-Gdhcmv77oVr5KxPIiJlk935jgvWPQsYEC0AZ6yjLppA=";
+  };
+
+  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]'
+  '';
+
+  nativeBuildInputs = [ cython ninja setuptools-scm ]
+    ++ lib.optionals stdenv.isDarwin [ xcodebuild ];
+
+  buildInputs = lib.optionals stdenv.isDarwin [ ApplicationServices OpenGL ];
+
+  propagatedBuildInputs = [ setuptools ];
+
+  checkInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "pathops" ];
+
+  meta = {
+    description = "Python access to operations on paths using the Skia library";
+    homepage = "https://skia.org/dev/present/pathops";
+    license = lib.licenses.bsd3;
+    maintainers = [ lib.maintainers.BarinovMaxim ];
+    broken = stdenv.isDarwin && stdenv.isAarch64; # clang-11: error: the clang compiler does not support '-march=armv7-a'
+  };
+}
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/sklearn-deap/default.nix b/nixpkgs/pkgs/development/python-modules/sklearn-deap/default.nix
new file mode 100644
index 000000000000..2530b9652032
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sklearn-deap/default.nix
@@ -0,0 +1,38 @@
+{ lib, buildPythonPackage, fetchFromGitHub, fetchpatch, numpy, scipy, deap, scikit-learn, python }:
+
+buildPythonPackage rec {
+  pname = "sklearn-deap";
+  version = "0.2.3";
+
+  # No tests in Pypi
+  src = fetchFromGitHub {
+    owner = "rsteca";
+    repo = pname;
+    rev = version;
+    sha256 = "1yqnmy8h08i2y6bb2s0a5nx9cwvyg45293whqh420c195gpzg1x3";
+  };
+
+  patches = [
+    # Fix for scikit-learn v0.21.1. See: https://github.com/rsteca/sklearn-deap/pull/62
+    (fetchpatch {
+      url = "https://github.com/rsteca/sklearn-deap/commit/3ae62990fc87f36b59382e7c4db3c74cf99ec3bf.patch";
+      sha256 = "1na6wf4v0dcmyz3pz8aiqkmv76d1iz3hi4iyfq9kfnycgzpv1kxk";
+    })
+  ];
+
+  propagatedBuildInputs = [ numpy scipy deap scikit-learn ];
+
+  checkPhase = ''
+    ${python.interpreter} test.py
+  '';
+
+  meta = with lib; {
+    description = "Use evolutionary algorithms instead of gridsearch in scikit-learn";
+    homepage = "https://github.com/rsteca/sklearn-deap";
+    license = licenses.lgpl3;
+    maintainers = with maintainers; [ psyanticy ];
+    # broken by scikit-learn 0.24.1
+    broken = true;
+  };
+}
+
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..292b40f4cbfb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/skodaconnect/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, aiohttp
+, beautifulsoup4
+, buildPythonPackage
+, cryptography
+, fetchFromGitHub
+, lxml
+, pyjwt
+, pythonOlder
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "skodaconnect";
+  version = "1.1.21";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "lendy007";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-4VM1bOiSkmzlDegtIRUh1O9FG2DPyK77MIQgQcGQ+ZM=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    beautifulsoup4
+    cryptography
+    lxml
+    pyjwt
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "'pytest>=5,<6'," ""
+    substituteInPlace requirements.txt \
+      --replace "pytest-asyncio" ""
+  '';
+
+  # 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";
+    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..0b2056979e41
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/skorch/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pytest
+, pytest-cov
+, flaky
+, numpy
+, pandas
+, pytorch
+, scikit-learn
+, scipy
+, tabulate
+, tqdm
+}:
+
+buildPythonPackage rec {
+  pname = "skorch";
+  version = "0.11.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b35cb4e50045742f0ffcfad33044af691d5d36b50212573753a804483a947ca9";
+  };
+
+  propagatedBuildInputs = [ numpy pytorch scikit-learn scipy tabulate tqdm ];
+  checkInputs = [ pytest pytest-cov flaky pandas pytestCheckHook ];
+
+  disabledTests = [
+    # on CPU, these expect artifacts from previous GPU run
+    "test_load_cuda_params_to_cpu"
+    # failing tests
+    "test_pickle_load"
+    "test_grid_search_with_slds_"
+    "test_grid_search_with_dict_works"
+  ];
+
+  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 ];
+    # TypeError: __init__() got an unexpected keyword argument 'iid'
+    broken = true;
+  };
+}
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..c94b03bcc667
--- /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
+  ];
+
+  checkInputs = [
+    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/skytemple-dtef/default.nix b/nixpkgs/pkgs/development/python-modules/skytemple-dtef/default.nix
new file mode 100644
index 000000000000..9a050e9c2b5a
--- /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.1.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "SkyTemple";
+    repo = pname;
+    rev = version;
+    hash = "sha256-QL+nLmjz0wCED2RjidIDK0tB6mAPnoaSJWpyLFu0pP4=";
+  };
+
+  propagatedBuildInputs = [
+    pillow
+    skytemple-files
+  ];
+
+  checkInputs = [
+    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..123f4ba6d853
--- /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.0.0";
+
+  src = fetchFromGitHub {
+    owner = "SkyTemple";
+    repo = pname;
+    rev = version;
+    sha256 = "1xcf7ljvi5ixhwx9rkg3hnwcyv4wsgd2yb6is11jffbrdp00j2bq";
+  };
+
+  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; [ 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..2f43d04ba168
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/skytemple-files/default.nix
@@ -0,0 +1,36 @@
+{ stdenv, lib, buildPythonPackage, fetchFromGitHub, appdirs, dungeon-eos, explorerscript
+, ndspy, pillow, setuptools, skytemple-rust, tilequant, armips
+}:
+
+buildPythonPackage rec {
+  pname = "skytemple-files";
+  version = "1.3.9";
+
+  src = fetchFromGitHub {
+    owner = "SkyTemple";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-Z/jbr9o0WKPjkAsfZzxuwAKKdwYV3rLGkUMlMgyC5s0=";
+    fetchSubmodules = true;
+  };
+
+  postPatch = ''
+    substituteInPlace skytemple_files/patch/arm_patcher.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 ];
+
+  doCheck = false; # requires Pokémon Mystery Dungeon ROM
+  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..6066407dafd4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/skytemple-rust/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, libiconv
+, Foundation
+, rustPlatform
+, setuptools-rust }:
+
+buildPythonPackage rec {
+  pname = "skytemple-rust";
+  version = "1.3.7";
+
+  src = fetchFromGitHub {
+    owner = "SkyTemple";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-rC7KA79va8gZpMKJQ7s3xYdbopNqmWdRYDCbaWaxsR0=";
+  };
+
+  cargoDeps = rustPlatform.fetchCargoTarball {
+    inherit src;
+    name = "${pname}-${version}";
+    sha256 = "sha256-lXPCxRbaqUC5EfyeBPtJDuGADYOA+DWMaOZRwXppP8E=";
+  };
+
+  buildInputs = lib.optionals stdenv.isDarwin [ libiconv Foundation ];
+  nativeBuildInputs = [ setuptools-rust ] ++ (with rustPlatform; [ cargoSetupHook rust.cargo rust.rustc ]);
+
+  GETTEXT_SYSTEM = true;
+
+  doCheck = false; # there are no tests
+  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..8ca4a45b3710
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/skytemple-ssb-debugger/default.nix
@@ -0,0 +1,38 @@
+{ lib, buildPythonPackage, fetchFromGitHub, gobject-introspection, gtk3, gtksourceview3
+, wrapGAppsHook, nest-asyncio, pycairo, py-desmume, pygtkspellcheck, setuptools
+, skytemple-files, skytemple-icons
+}:
+
+buildPythonPackage rec {
+  pname = "skytemple-ssb-debugger";
+  version = "1.3.8.post2";
+
+  src = fetchFromGitHub {
+    owner = "SkyTemple";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-dd0qsSNBwxuSopjz2PLqEFddZpvMgeJIjBXY5P6OAow=";
+  };
+
+  buildInputs = [ gobject-introspection gtk3 gtksourceview3 ];
+  nativeBuildInputs = [ gobject-introspection wrapGAppsHook ];
+  propagatedBuildInputs = [
+    nest-asyncio
+    pycairo
+    py-desmume
+    pygtkspellcheck
+    setuptools
+    skytemple-files
+    skytemple-icons
+  ];
+
+  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; [ xfix ];
+  };
+}
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..06ab6cd78832
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/slack-sdk/default.nix
@@ -0,0 +1,83 @@
+{ stdenv
+, lib
+, aiodns
+, aiohttp
+, boto3
+, buildPythonPackage
+, codecov
+, databases
+, fetchFromGitHub
+, flake8
+, flask-sockets
+, moto
+, pythonOlder
+, psutil
+, pytest-asyncio
+, pytestCheckHook
+, sqlalchemy
+, websocket-client
+, websockets
+}:
+
+buildPythonPackage rec {
+  pname = "slack-sdk";
+  version = "3.18.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "slackapi";
+    repo = "python-slack-sdk";
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-pHIsYOY+/LlH9+kmp2ETEY1IE8izy5+R4tm0iY7NmQk=";
+  };
+
+  propagatedBuildInputs = [
+    aiodns
+    aiohttp
+    boto3
+    sqlalchemy
+    websocket-client
+    websockets
+  ];
+
+  checkInputs = [
+    codecov
+    databases
+    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"
+  ];
+
+  pythonImportsCheck = [
+    "slack_sdk"
+  ];
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    description = "Slack Developer Kit for Python";
+    homepage = "https://slack.dev/python-slack-sdk/";
+    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..1c02d592d679
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/slackclient/default.nix
@@ -0,0 +1,76 @@
+{ lib
+, stdenv
+, aiohttp
+, buildPythonPackage
+, codecov
+, fetchFromGitHub
+, flake8
+, isPy3k
+, mock
+, psutil
+, pytest-cov
+, pytest-mock
+, pytestCheckHook
+, pytest-runner
+, requests
+, responses
+, six
+, websocket-client
+}:
+
+buildPythonPackage rec {
+  pname = "slackclient";
+  version = "2.9.3";
+
+  disabled = !isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "slackapi";
+    repo = "python-slack-sdk";
+    rev = "v${version}";
+    sha256 = "1rfb7izgddv28ag37gdnv3sd8z2zysrxs7ad8x20x690zshpaq16";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    websocket-client
+    requests
+    six
+  ];
+
+  checkInputs = [
+    codecov
+    flake8
+    mock
+    psutil
+    pytest-cov
+    pytest-mock
+    pytestCheckHook
+    pytest-runner
+    responses
+  ];
+
+  # Exclude tests that requires network features
+  pytestFlagsArray = [ "--ignore=integration_tests" ];
+
+  disabledTests = [
+    "test_start_raises_an_error_if_rtm_ws_url_is_not_returned"
+  ] ++ 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";
+    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..506fad5db48d
--- /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
+, scikitimage
+, 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
+    scikitimage
+    six
+    tifffile
+  ] ++ lib.optionals isPy27 [ pathlib enum34 ];
+
+  checkInputs = [
+    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 = [ maintainers.costrouc ];
+  };
+}
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..2033c94fefc1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/slicer/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, pytestCheckHook
+, pandas
+, pytorch
+, scipy
+}:
+
+buildPythonPackage rec {
+  pname = "slicer";
+  version = "0.0.7";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f5d5f7b45f98d155b9c0ba6554fa9770c6b26d5793a3e77a1030fb56910ebeec";
+  };
+
+  checkInputs = [ pytestCheckHook pandas pytorch 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..a1240f47c4e8
--- /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; [ costrouc ];
+  };
+}
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..d3295cbb1f8b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/slither-analyzer/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, makeWrapper
+, pythonOlder
+, crytic-compile
+, prettytable
+, setuptools
+, solc
+, withSolc ? false
+}:
+
+buildPythonPackage rec {
+  pname = "slither-analyzer";
+  version = "0.8.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "crytic";
+    repo = "slither";
+    rev = version;
+    sha256 = "sha256-Kh5owlkRB9hDlfIRiS+aNFe4YtZj38CLeE3Fe+R7diM=";
+  };
+
+  nativeBuildInputs = [
+    makeWrapper
+  ];
+
+  propagatedBuildInputs = [
+    crytic-compile
+    prettytable
+    setuptools
+  ];
+
+  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";
+    license = licenses.agpl3Plus;
+    maintainers = with maintainers; [ arturcygan fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/slixmpp/0001-xep_0030-allow-extra-args-in-get_info_from_domain.patch b/nixpkgs/pkgs/development/python-modules/slixmpp/0001-xep_0030-allow-extra-args-in-get_info_from_domain.patch
new file mode 100644
index 000000000000..3f73ab91e3a2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/slixmpp/0001-xep_0030-allow-extra-args-in-get_info_from_domain.patch
@@ -0,0 +1,36 @@
+From 7b5ac168892dedc5bd6be4244b18dc32d37d00fd Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?F=C3=A9lix=20Baylac-Jacqu=C3=A9?= <felix@alternativebit.fr>
+Date: Fri, 22 Apr 2022 15:26:05 +0200
+Subject: [PATCH] xep_0030: allow extra args in get_info_from_domain
+
+Aftermath of ea2d851a.
+
+http_upload from xep_0363 is now forwarding all its extra input args
+to get_info_from_domain. Sadly for us, get_info_from_domain won't
+accept any extra args passed that way and will yield a "got an
+unexpected keyword argument".
+
+Modifying get_info_from_domain to accept these extra args.
+
+I hit this bug by passing a timeout_callback argument to http_upload.
+Adding this scenario to the relevant integration test.
+---
+ itests/test_httpupload.py         | 1 +
+ slixmpp/plugins/xep_0030/disco.py | 2 +-
+ 2 files changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/slixmpp/plugins/xep_0030/disco.py b/slixmpp/plugins/xep_0030/disco.py
+index 37d453aa..9f9a45f2 100644
+--- a/slixmpp/plugins/xep_0030/disco.py
++++ b/slixmpp/plugins/xep_0030/disco.py
+@@ -307,7 +307,7 @@ class XEP_0030(BasePlugin):
+         return self.api['has_identity'](jid, node, ifrom, data)
+
+     async def get_info_from_domain(self, domain=None, timeout=None,
+-                                   cached=True, callback=None):
++                                   cached=True, callback=None, **iqkwargs):
+         """Fetch disco#info of specified domain and one disco#items level below
+         """
+
+--
+2.35.1
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..30bdd8b31ff4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/slixmpp/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, buildPythonPackage
+, aiodns
+, aiohttp
+, fetchPypi
+, gnupg
+, pyasn1
+, pyasn1-modules
+, pytestCheckHook
+, substituteAll
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "slixmpp";
+  version = "1.8.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-U7lD2iVy2gS5Ktop4PVKg+cUbIg4MJt+m6tH5aOb1Y4=";
+  };
+
+  propagatedBuildInputs = [
+    aiodns
+    aiohttp
+    pyasn1
+    pyasn1-modules
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  patches = [
+    (substituteAll {
+      src = ./hardcode-gnupg-path.patch;
+      inherit gnupg;
+    })
+    # Upstream MR: https://lab.louiz.org/poezio/slixmpp/-/merge_requests/198
+    ./0001-xep_0030-allow-extra-args-in-get_info_from_domain.patch
+  ];
+
+  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/";
+    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..72af69e3e7c2
--- /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/slowapi/default.nix b/nixpkgs/pkgs/development/python-modules/slowapi/default.nix
new file mode 100644
index 000000000000..430c17dfb61e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/slowapi/default.nix
@@ -0,0 +1,71 @@
+{ lib
+, buildPythonPackage
+, fastapi
+, fetchFromGitHub
+, limits
+, mock
+, hiro
+, poetry-core
+, pytestCheckHook
+, pythonAtLeast
+, pythonOlder
+, redis
+, starlette
+}:
+
+buildPythonPackage rec {
+  pname = "slowapi";
+  version = "0.1.5";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "laurentS";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1wjnlhjfgil86h6i5yij723ncg18rqdprs1q6i68w4msaspwpxg9";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    limits
+    redis
+  ];
+
+  checkInputs = [
+    fastapi
+    hiro
+    mock
+    pytestCheckHook
+    starlette
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'limits = "^1.5"' 'limits = "*"' \
+      --replace 'redis = "^3.4.1"' 'redis = "*"'
+  '';
+
+  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";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..273972cbe4ee
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sly/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "sly";
+  version = "0.4";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0an31bm5m8wqwphanmcsbbnmycy6l4xkmg4za4bwq8hk4dm2dwp5";
+  };
+
+  checkInputs = [ pytest ];
+
+  # tests not included with pypi release
+  doCheck = false;
+
+  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 = [ maintainers.costrouc ];
+  };
+}
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..d7d568602358
--- /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.1";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "grahamwetzler";
+    repo = "smart-meter-texas";
+    rev = "v${version}";
+    hash = "sha256-rjMRV5MekwRkipes2nWos/1zi3sD+Ls8LyD3+t5FOZc=";
+  };
+
+  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..b124a7c887e9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/smart-open/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, azure-common
+, azure-core
+, azure-storage-blob
+, boto3
+, google-cloud-storage
+, requests
+, moto
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "smart-open";
+  version = "6.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "RaRe-Technologies";
+    repo = "smart_open";
+    rev = "v${version}";
+    sha256 = "sha256-FEIJ1DBW0mz7n+J03C1Lg8uAs2ZxI0giM7+mvuNPyGg=";
+  };
+
+  propagatedBuildInputs = [
+    azure-common
+    azure-core
+    azure-storage-blob
+    boto3
+    google-cloud-storage
+    requests
+  ];
+
+  checkInputs = [
+    moto
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "smart_open"
+  ];
+
+  pythonImportsCheck = [
+    "smart_open"
+  ];
+
+  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..29a1e3c9a201
--- /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";
+  };
+
+  checkInputs = [
+    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..562346b1a476
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/smbprotocol/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, cryptography
+, fetchFromGitHub
+, pyspnego
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "smbprotocol";
+  version = "1.9.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "jborean93";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-u3brP3WsnoqRy3R0OQQkIbq+avS7nemx9GKpvTq+vxg=";
+  };
+
+  propagatedBuildInputs = [
+    cryptography
+    pyspnego
+    six
+  ];
+
+  checkInputs = [
+    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";
+    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..ffb22d1c4b42
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/smbus-cffi/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, cffi
+, 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";
+      sha256 = "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" ];
+
+  checkInputs = [ 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..262e765ad0da
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/smbus2/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, nose
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "smbus2";
+  version = "0.4.2";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "kplindegaard";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-6JzFbhUq8XR1nYkadPeYqItcLZDIFAwTe3BriEW2nVI=";
+  };
+
+  checkInputs = [
+    nose
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+    nosetests
+    runHook postCheck
+  '';
+
+  pythonImportsCheck = [
+    "smbus2"
+  ];
+
+  meta = with lib; {
+    description = "Drop-in replacement for smbus-cffi/smbus-python";
+    homepage = "https://smbus2.readthedocs.io/";
+    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..f6693da46be7
--- /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.15";
+
+  src = fetchFromGitHub {
+    owner = "joysoftware";
+    repo = "pypi_smhi";
+    rev = version;
+    sha256 = "sha256-tBNmfn2hBkS36B9zKDP+TgqeumbgzBVDiJ5L54RaSc8=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  checkInputs = [
+    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..5e8344e3d637
--- /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";
+  };
+
+  checkInputs = [ 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/smpplib/default.nix b/nixpkgs/pkgs/development/python-modules/smpplib/default.nix
new file mode 100644
index 000000000000..179ab7ce1bfc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/smpplib/default.nix
@@ -0,0 +1,29 @@
+{ buildPythonPackage, fetchPypi, lib, python, six, tox, mock, pytest }:
+
+buildPythonPackage rec {
+  pname = "smpplib";
+  version = "2.2.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c0b01947b47e404f42ccb59e906b6e4eb507963c971d59b44350db0f29c76166";
+  };
+
+  propagatedBuildInputs = [ six ];
+  checkInputs = [ tox mock pytest ];
+
+  checkPhase = ''
+    pytest
+  '';
+
+  postInstall = ''
+    rm -rf $out/${python.sitePackages}/tests
+  '';
+
+  meta = with lib; {
+    description = "SMPP library for Python";
+    homepage = "https://github.com/python-smpplib/python-smpplib";
+    license = licenses.lgpl3Plus;
+    maintainers = [ maintainers.globin ];
+  };
+}
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..b4d83e672271
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/snakebite/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, tox
+, virtualenv
+, protobuf
+}:
+
+buildPythonPackage rec {
+  pname = "snakebite";
+  version = "2.11.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "085238b4944cb9c658ee62d5794de936ac3d0c337c504b2cc86424a205ae978a";
+  };
+
+  checkInputs = [
+    tox
+    virtualenv
+  ];
+
+  propagatedBuildInputs = [
+    protobuf
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "'argparse'" ""
+  '';
+
+  # tests require hadoop hdfs
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Pure Python HDFS client";
+    homepage = "https://github.com/spotify/snakebite";
+    license = licenses.asl20;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..95253b7c1593
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/snakeviz/default.nix
@@ -0,0 +1,22 @@
+{ lib, fetchPypi, buildPythonPackage, tornado }:
+
+buildPythonPackage rec {
+  pname = "snakeviz";
+  version = "2.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0d96c006304f095cb4b3fb7ed98bb866ca35a7ca4ab9020bbc27d295ee4c94d9";
+  };
+
+  # Upstream doesn't run tests from setup.py
+  doCheck = false;
+  propagatedBuildInputs = [ tornado ];
+
+  meta = with lib; {
+    description = "Browser based viewer for profiling data";
+    homepage = "https://jiffyclub.github.io/snakeviz";
+    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..0acf9cfd22c4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/snapcast/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, construct
+, packaging
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "snapcast";
+  version = "2.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "happyleavesaoc";
+    repo = "python-snapcast";
+    rev = "refs/tags/${version}";
+    hash = "sha256-H41X5bfRRu+uE7eUsmUkONm6hugNs43+O7MvVPH0e+8=";
+  };
+
+  propagatedBuildInputs = [
+    construct
+    packaging
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "snapcast"
+  ];
+
+  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..b20f9afff9e6
--- /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 ];
+
+  checkInputs = [ 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; [ SuperSandro2000 ];
+  };
+}
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..5b91bade0098
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sniffio/default.nix
@@ -0,0 +1,31 @@
+{ buildPythonPackage, lib, fetchPypi, glibcLocales, isPy3k, contextvars
+, pythonOlder, pytest, curio
+}:
+
+buildPythonPackage rec {
+  pname = "sniffio";
+  version = "1.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c4666eecec1d3f50960c6bdf61ab7bc350648da6c126e3cf6898d8cd4ddcd3de";
+  };
+
+  disabled = !isPy3k;
+
+  buildInputs = [ glibcLocales ];
+
+  propagatedBuildInputs = lib.optionals (pythonOlder "3.7") [ contextvars ];
+
+  checkInputs = [ pytest curio ];
+
+  checkPhase = ''
+    pytest
+  '';
+
+  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..1b7bd7341ebf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/snitun/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, stdenv
+, async-timeout
+, attrs
+, buildPythonPackage
+, cryptography
+, fetchFromGitHub
+, pytest-aiohttp
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "snitun";
+  version = "0.31.0";
+
+  src = fetchFromGitHub {
+    owner = "NabuCasa";
+    repo = pname;
+    rev = version;
+    hash = "sha256-Ehafb35H462Ffn6omGh/MDJKQX5qJJZeiIBO3n0IGlA=";
+  };
+
+  propagatedBuildInputs = [
+    async-timeout
+    attrs
+    cryptography
+  ];
+
+  checkInputs = [
+    pytest-aiohttp
+    pytestCheckHook
+  ];
+
+  disabledTests = 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"
+  ];
+
+  pythonImportsCheck = [ "snitun" ];
+
+  meta = with lib; {
+    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/snowballstemmer/default.nix b/nixpkgs/pkgs/development/python-modules/snowballstemmer/default.nix
new file mode 100644
index 000000000000..a1813fac54e2
--- /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..500a392b1162
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/snowflake-connector-python/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, asn1crypto
+, buildPythonPackage
+, certifi
+, cffi
+, charset-normalizer
+, fetchPypi
+, idna
+, oscrypto
+, pycryptodomex
+, pyjwt
+, pyopenssl
+, pythonOlder
+, pytz
+, requests
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "snowflake-connector-python";
+  version = "2.7.9";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-HQ/d7luqdG1BriuP8QXzZk5JZwwLJH1JQIN3BtEDpM4=";
+  };
+
+  propagatedBuildInputs = [
+    asn1crypto
+    certifi
+    cffi
+    charset-normalizer
+    idna
+    oscrypto
+    pycryptodomex
+    pyjwt
+    pyopenssl
+    pytz
+    requests
+    setuptools
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "pyOpenSSL>=16.2.0,<23.0.0" "pyOpenSSL" \
+      --replace "cryptography>=3.1.0,<37.0.0" "cryptography" \
+      --replace "charset-normalizer~=2.0.0" "charset_normalizer>=2"
+  '';
+
+  # 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; {
+    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..6d30f143ce22
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/snowflake-sqlalchemy/default.nix
@@ -0,0 +1,34 @@
+{ buildPythonPackage
+, lib
+, fetchPypi
+, six
+, snowflake-connector-python
+, sqlalchemy
+}:
+
+buildPythonPackage rec {
+  pname = "snowflake-sqlalchemy";
+  version = "1.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-9IooTfzXRmOE22huBSduM4kX8ltI6F50nvkUnXRkAFo=";
+  };
+
+  propagatedBuildInputs = [
+    six
+    snowflake-connector-python
+    sqlalchemy
+  ];
+
+  # Pypi does not include tests
+  doCheck = false;
+  pythonImportsCheck = [ "snowflake.sqlalchemy" ];
+
+  meta = with lib; {
+    description = "Snowflake SQLAlchemy Dialect";
+    homepage = "https://www.snowflake.net/";
+    license = licenses.asl20;
+    maintainers = [ ];
+  };
+}
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..379159180a06
--- /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.4.3.20220106";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "JustAnotherArchivist";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-gphNT1IYSiAw22sqHlV8Rm4WRP4EWUvP0UkITuepmMc=";
+  };
+
+  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..f88b6080fdf3
--- /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 ];
+
+  checkInputs = [ 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..bd38ef3a5a24
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/social-auth-app-django/default.nix
@@ -0,0 +1,34 @@
+{ lib, buildPythonPackage, fetchFromGitHub, social-auth-core, django, python }:
+
+buildPythonPackage rec {
+  pname = "social-auth-app-django";
+  version = "5.0.0";
+
+  src = fetchFromGitHub {
+    owner = "python-social-auth";
+    repo = "social-app-django";
+    rev = version;
+    sha256 = "sha256-ONhdXxclHRpVtijpKEZlmGDhjid/jnTaPq6LQtjxCC4=";
+  };
+
+  propagatedBuildInputs = [
+    social-auth-core
+  ];
+
+  pythonImportsCheck = [ "social_django" ];
+
+  checkInputs = [
+    django
+  ];
+
+  checkPhase = ''
+    ${python.interpreter} -m django test --settings="tests.settings"
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/python-social-auth/social-app-django";
+    description = "Python Social Auth - Application - Django";
+    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..b00e5044c64f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/social-auth-core/default.nix
@@ -0,0 +1,83 @@
+{ 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.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "python-social-auth";
+    repo = "social-core";
+    rev = "refs/tags/${version}";
+    hash = "sha256-P9IWnu1/PWVNl/tZZ4bqz0WnruKu/jXASZBoaWXWeYI=";
+  };
+
+  propagatedBuildInputs = [
+    cryptography
+    defusedxml
+    oauthlib
+    pyjwt
+    python3-openid
+    requests
+    requests-oauthlib
+  ];
+
+  passthru.optional-dependencies = {
+    openidconnect = [
+      python-jose
+    ];
+    saml = [
+      lxml
+      python3-saml
+    ];
+    azuread = [
+      cryptography
+    ];
+  };
+
+  checkInputs = [
+    pytestCheckHook
+    httpretty
+  ] ++ passthru.optional-dependencies.openidconnect
+  ++ passthru.optional-dependencies.saml
+  ++ passthru.optional-dependencies.azuread;
+
+  # 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..9e51ccd81d37
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/socialscan/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, colorama
+, pythonOlder
+, tqdm
+}:
+
+buildPythonPackage rec {
+  pname = "socialscan";
+  version = "1.4.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "iojw";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "rT+/j6UqDOzuNBdN3I74YIxS6qkhd7BjHCGX+gGjprc=";
+  };
+
+  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";
+    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..de552ca673c9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/socid-extractor/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, beautifulsoup4
+, buildPythonPackage
+, fetchFromGitHub
+, python-dateutil
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "socid-extractor";
+  version = "0.0.23";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "soxoj";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-tDKwYgW1vEyPzuouPGK9tdTf3vNr+UaosHtQe23srG0=";
+  };
+
+  propagatedBuildInputs = [
+    beautifulsoup4
+    python-dateutil
+    requests
+  ];
+
+  postPatch = ''
+    # https://github.com/soxoj/socid-extractor/pull/125
+    substituteInPlace requirements.txt \
+      --replace "beautifulsoup4~=4.10.0" "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";
+    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..2842e3751732
--- /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;
+    sha256 = "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/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..5d42ed6e8ecc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/socksio/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, 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=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  # remove coverage configuration
+  preCheck = ''
+    rm pytest.ini
+  '';
+
+  checkInputs = [
+    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..894bdb9d0ba6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/soco/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, graphviz
+, appdirs
+, ifaddr
+, pythonOlder
+, lxml
+, mock
+, nix-update-script
+, pytestCheckHook
+, requests
+, requests-mock
+, xmltodict
+}:
+
+buildPythonPackage rec {
+  pname = "soco";
+  version = "0.28.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "SoCo";
+    repo = "SoCo";
+    rev = "v${version}";
+    hash = "sha256-rH6EfPK4EEQDO63VEIM7jJO5OM4tyYfZ5yYUskPf8dE=";
+  };
+
+  propagatedBuildInputs = [
+    appdirs
+    ifaddr
+    lxml
+    requests
+    xmltodict
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    graphviz
+    mock
+    requests-mock
+  ];
+
+  pythonImportsCheck = [
+    "soco"
+  ];
+
+  passthru.updateScript = nix-update-script {
+    attrPath = "python3Packages.${pname}";
+  };
+
+  meta = with lib; {
+    description = "CLI and library to control Sonos speakers";
+    homepage = "http://python-soco.com/";
+    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..6c3df4eb6f98
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/softlayer/default.nix
@@ -0,0 +1,78 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, click
+, fetchFromGitHub
+, mock
+, prompt-toolkit
+, ptable
+, pygments
+, pytestCheckHook
+, pythonOlder
+, requests
+, sphinx
+, testtools
+, tkinter
+, urllib3
+, prettytable
+, rich
+, zeep
+}:
+
+buildPythonPackage rec {
+  pname = "softlayer";
+  version = "6.1.0";
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = "softlayer-python";
+    rev = "v${version}";
+    sha256 = "sha256-T49KVAsgcAZySkaJi47IrFcMHGZvEkGDjPWsdMarzwM=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+        --replace 'rich == 12.3.0' 'rich >= 12.3.0'
+  '';
+
+  propagatedBuildInputs = [
+    click
+    prompt-toolkit
+    ptable
+    pygments
+    requests
+    urllib3
+    prettytable
+    rich
+  ];
+
+  checkInputs = [
+    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"
+  ];
+
+  pythonImportsCheck = [ "SoftLayer" ];
+
+  meta = with lib; {
+    description = "Python libraries that assist in calling the SoftLayer API";
+    homepage = "https://github.com/softlayer/softlayer-python";
+    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..6a8c483ada84
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/solax/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchPypi
+, pytest-asyncio
+, pytest-cov
+, pytest-httpserver
+, pytestCheckHook
+, setuptools-scm
+, voluptuous
+}:
+
+buildPythonPackage rec {
+  pname = "solax";
+  version = "0.2.10";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-DUXaz9BF1NOG+RSeks9CxLGDz/wWwpZBxwWh4MQapio=";
+  };
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  propagatedBuildInputs = [ aiohttp voluptuous ];
+
+  checkInputs = [
+    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..e51f1cd143f1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/solc-select/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "solc-select";
+  version = "0.2.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-6VawTcffIgnR+zuC4rti+Ocwu1VMTX+VihT/L7LzchI=";
+  };
+
+  # 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..4e4a807729cf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/solo-python/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, click
+, cryptography
+, ecdsa
+, fido2
+, intelhex
+, pyserial
+, pyusb
+, requests
+}:
+
+ buildPythonPackage rec {
+  pname = "solo-python";
+  version = "0.0.31";
+  format = "flit";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "solokeys";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-OguAHeNpom+zthREzdhejy5HJUIumrtwB0WJAwUNiSA=";
+  };
+
+  patchPhase = ''
+    sed -i '/fido2/c\"fido2",' pyproject.toml
+  '';
+
+  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";
+    homepage = "https://github.com/solokeys/solo-python";
+    maintainers = with maintainers; [ wucke13 ];
+    license = with licenses; [ asl20 mit ];
+  };
+}
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..a03052c7e429
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/somajo/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, buildPythonPackage
+, pythonOlder
+, regex
+}:
+
+buildPythonPackage rec {
+  pname = "somajo";
+  version = "2.2.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "tsproisl";
+    repo = "SoMaJo";
+    rev = "v${version}";
+    sha256 = "sha256-M0WtONhsqmmK0PBB+Df4YrFpT+vfVidDkt80eBHOo04=";
+  };
+
+  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/somecomfort/default.nix b/nixpkgs/pkgs/development/python-modules/somecomfort/default.nix
new file mode 100644
index 000000000000..89c5dedf5065
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/somecomfort/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, prettytable
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "somecomfort";
+  version = "0.8.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "56e60e4e9f76c12c0c9dd1016e9f1334be6800409e0762f5f143f9069d7292d3";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    prettytable
+  ];
+
+  # tests require network access
+  doCheck = false;
+
+  pythonImportsCheck = [ "somecomfort" ];
+
+  meta = with lib; {
+    description = "Client for Honeywell's US-based cloud devices";
+    homepage = "https://github.com/kk7ds/somecomfort";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
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..9f73522def4d
--- /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
+  ];
+
+  checkInputs = [
+    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/sopel/default.nix b/nixpkgs/pkgs/development/python-modules/sopel/default.nix
new file mode 100644
index 000000000000..ac0a39363134
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sopel/default.nix
@@ -0,0 +1,73 @@
+{ 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=";
+  };
+
+  propagatedBuildInputs = [
+    dnspython
+    geoip2
+    ipython
+    praw
+    pyenchant
+    pygeoip
+    pytz
+    sqlalchemy
+    xmltodict
+  ];
+
+  checkInputs = [
+    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/sorl_thumbnail/default.nix b/nixpkgs/pkgs/development/python-modules/sorl_thumbnail/default.nix
new file mode 100644
index 000000000000..61150ac45bbf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sorl_thumbnail/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "sorl-thumbnail";
+  version = "12.8.0";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-7io8nwuInlmRk4PTeB8TF9ycSSf7RLIvsUN/b+cFS5Y=";
+  };
+
+  nativeBuildInputs = [ setuptools-scm ];
+  # Disabled due to an improper configuration error when tested against django. This looks like something broken in the test cases for sorl.
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://sorl-thumbnail.readthedocs.org/en/latest/";
+    description = "Thumbnails for Django";
+    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..9f9f99a1856c
--- /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}";
+    sha256 = "sha256-GkZO8afUAgDpDjIa3dhO6nxykqrljeKldunKMODSXfg=";
+  };
+
+  propagatedBuildInputs = [ sortedcontainers ];
+
+  checkInputs = [
+    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..4edd68f1f07d
--- /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}";
+      sha256 = "sha256-YRbSM2isWi7AzfquFvuZBlpEMNUnBJTBLBn0/XYVHKQ=";
+    };
+
+    doCheck = false;
+
+    checkInputs = [
+      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; [ SuperSandro2000 ];
+    };
+  };
+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..81f99d76d6ca
--- /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.4";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-9pD1qkGKViaMe9vJfWl8ha3QE0xcedRLiirXobhdp4k=";
+  };
+
+  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/default.nix b/nixpkgs/pkgs/development/python-modules/soundfile/default.nix
new file mode 100644
index 000000000000..c1b68e61088e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/soundfile/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, pytestCheckHook
+, numpy
+, libsndfile
+, cffi
+, isPyPy
+, stdenv
+}:
+
+buildPythonPackage rec {
+  pname = "soundfile";
+  version = "0.10.3.post1";
+  # https://github.com/bastibe/python-soundfile/issues/157
+  disabled = isPyPy || stdenv.isi686;
+
+  src = fetchPypi {
+    pname = "SoundFile";
+    inherit version;
+    sha256 = "0yqhrfz7xkvqrwdxdx2ydy4h467sk7z3gf984y1x2cq7cm1gy329";
+  };
+
+  patches = [
+    # Fix build on macOS arm64, https://github.com/bastibe/python-soundfile/pull/332
+    (fetchpatch {
+      url = "https://github.com/bastibe/python-soundfile/commit/e554e9ce8bed96207d587e6aa661e4b08f1c6a79.patch";
+      sha256 = "sha256-vu/7s5q4I3yBnoNHmmFmcXvOLFcPwY9ri9ri6cKLDwU=";
+    })
+  ];
+
+  postPatch = ''
+    substituteInPlace soundfile.py --replace "_find_library('sndfile')" "'${libsndfile.out}/lib/libsndfile${stdenv.hostPlatform.extensions.sharedLibrary}'"
+  '';
+
+  checkInputs = [ pytestCheckHook ];
+  propagatedBuildInputs = [ numpy libsndfile cffi ];
+  propagatedNativeBuildInputs = [ cffi ];
+
+  # Test fails on aarch64-darwin with `MemoryError`, 53 failed, 31 errors, see
+  # https://github.com/bastibe/python-soundfile/issues/331
+  doCheck = stdenv.system != "aarch64-darwin";
+
+  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..632894e8697a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/soupsieve/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, hatchling
+, isPy3k
+, backports_functools_lru_cache
+}:
+
+buildPythonPackage rec {
+  pname = "soupsieve";
+  version = "2.3.2.post1";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-/FOJOz2iwz3ilWZ6DhnweMFL+GVErzBzVN5fzxKj8w0=";
+  };
+
+  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/spacy-alignments/default.nix b/nixpkgs/pkgs/development/python-modules/spacy-alignments/default.nix
new file mode 100644
index 000000000000..95ba3c946343
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/spacy-alignments/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, stdenv
+, fetchPypi
+, fetchpatch
+, buildPythonPackage
+, isPy3k
+, rustPlatform
+, setuptools-rust
+, libiconv
+}:
+
+buildPythonPackage rec {
+  pname = "spacy-alignments";
+  version = "0.8.4";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-1HApl/RZ0w5Tf2OPu1QBUa36uIqilp+dDbPjujn0e9s=";
+  };
+
+  cargoDeps = rustPlatform.fetchCargoTarball {
+    inherit src;
+    name = "${pname}-${version}";
+    sha256 = "sha256-oFSruBnoodv6/0/OrmJ/2SVoWm3u3FGtzVJ9xgp0+Cg=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-rust
+  ] ++ (with rustPlatform; [
+    cargoSetupHook
+    rust.cargo
+    rust.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..9de42f2a6c0f
--- /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.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-APb9VU25/R/eZQGyPh8Ocvbu8Uux5/wVRW0R0dLekso=";
+  };
+
+  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..30778ab633dc
--- /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.31";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit version;
+    pname = "spacy_pkuseg";
+    hash = "sha256-C/6uYeXjmmZiWFIvk/2P8+CEX4ZBhYNnRX1T4rD75N8=";
+  };
+
+  # 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..d0be2d1c335a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/spacy-transformers/annotation-test/annotate.py
@@ -0,0 +1,68 @@
+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',
+        'take',
+        'tell',
+        'shake',
+        'turn',
+        'be',
+        '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..11a927a0a627
--- /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;
+
+  checkInputs = [ 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..93bd22f1f650
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/spacy-transformers/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, callPackage
+, fetchPypi
+, buildPythonPackage
+, dataclasses
+, pytorch
+, pythonOlder
+, spacy
+, spacy-alignments
+, srsly
+, transformers
+}:
+
+buildPythonPackage rec {
+  pname = "spacy-transformers";
+  version = "1.1.7";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-lrC1JEQu3/YX4o5azs4UDTsrtfim3IJyD6plCbx5G3E=";
+  };
+
+  propagatedBuildInputs = [
+    pytorch
+    spacy
+    spacy-alignments
+    srsly
+    transformers
+  ] ++ lib.optionals (pythonOlder "3.7") [
+    dataclasses
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "transformers>=3.4.0,<4.18.0" "transformers>=3.4.0 # ,<4.18.0"
+  '';
+
+  # 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";
+    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..515b8f57b7ef
--- /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', 'GPE'),
+        ('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',
+        'be',
+        '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..1b066ff3c39d
--- /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;
+
+  checkInputs = [ 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..e4f5868d8457
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/spacy/default.nix
@@ -0,0 +1,96 @@
+{ lib
+, blis
+, buildPythonPackage
+, callPackage
+, catalogue
+, cymem
+, fetchPypi
+, jinja2
+, jsonschema
+, langcodes
+, murmurhash
+, numpy
+, packaging
+, pathy
+, preshed
+, pydantic
+, pytest
+, python
+, pythonOlder
+, requests
+, setuptools
+, spacy-legacy
+, spacy-loggers
+, srsly
+, thinc
+, tqdm
+, typer
+, typing-extensions
+, wasabi
+}:
+
+buildPythonPackage rec {
+  pname = "spacy";
+  version = "3.4.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-PM0an1Z1nl8Pnv31cRmgZwKtWcBF3eCzgwtUclk+Ce8=";
+  };
+
+  propagatedBuildInputs = [
+    blis
+    catalogue
+    cymem
+    jinja2
+    jsonschema
+    langcodes
+    murmurhash
+    numpy
+    packaging
+    pathy
+    preshed
+    pydantic
+    requests
+    setuptools
+    spacy-legacy
+    spacy-loggers
+    srsly
+    thinc
+    tqdm
+    typer
+    wasabi
+  ] ++ lib.optional (pythonOlder "3.8") [
+    typing-extensions
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "pydantic>=1.7.4,!=1.8,!=1.8.1,<1.9.0" "pydantic~=1.2"
+  '';
+
+  checkInputs = [
+    pytest
+  ];
+
+  doCheck = false;
+  checkPhase = ''
+    ${python.interpreter} -m pytest spacy/tests --vectors --models --slow
+  '';
+
+  pythonImportsCheck = [
+    "spacy"
+  ];
+
+  passthru.tests.annotation = callPackage ./annotation-test { };
+
+  meta = with lib; {
+    description = "Industrial-strength Natural Language Processing (NLP)";
+    homepage = "https://github.com/explosion/spaCy";
+    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..3ee2feeaa96a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/spacy/legacy.nix
@@ -0,0 +1,25 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+}:
+
+buildPythonPackage rec {
+  pname = "spacy-legacy";
+  version = "3.0.9";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-T33LxObI6MtOrbsAn5wKGipnRC4AMsjWd2yUcMN1mQM=";
+  };
+
+  # checkInputs = [ pytestCheckHook spacy ];
+  doCheck = false;
+  pythonImportsCheck = [ "spacy_legacy" ];
+
+  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/spacy/models.json b/nixpkgs/pkgs/development/python-modules/spacy/models.json
new file mode 100644
index 000000000000..d29b7ac7fa87
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/spacy/models.json
@@ -0,0 +1,374 @@
+[
+  {
+    "pname": "ca_core_news_lg",
+    "version": "3.3.0",
+    "sha256": "06dyd5h3c1q7vndg8j0vja24y49lvdqkb6cy6i25ldz306b6aa0l",
+    "license": "gpl3"
+  },
+  {
+    "pname": "ca_core_news_md",
+    "version": "3.3.0",
+    "sha256": "0ac8n8lg4x5mknplsfbzhsl1qxhkbi5plx4xd252zmr0kilxkykn",
+    "license": "gpl3"
+  },
+  {
+    "pname": "ca_core_news_sm",
+    "version": "3.3.0",
+    "sha256": "1gj4ni9mwksrwqxjipvn13lhbfk7wqh8k7hh9gfpsm2saa951yf6",
+    "license": "gpl3"
+  },
+  {
+    "pname": "ca_core_news_trf",
+    "version": "3.3.0",
+    "sha256": "0fhf71rj568akcwxvzjr2j5x5f5qz7g7i49bz5m9lbqs01bj0rjw",
+    "license": "gpl3"
+  },
+  {
+    "pname": "da_core_news_lg",
+    "version": "3.3.0",
+    "sha256": "0wyw9lyxbs0jgy8qgxhpqpfhm8y4a9hanar0ggrvhsaxcfjs6qhr",
+    "license": "cc-by-sa-40"
+  },
+  {
+    "pname": "da_core_news_md",
+    "version": "3.3.0",
+    "sha256": "0rj8l0v6m1ia5r4j0180gl0kh2srfw90bkvq21wr1gq142536f2d",
+    "license": "cc-by-sa-40"
+  },
+  {
+    "pname": "da_core_news_sm",
+    "version": "3.3.0",
+    "sha256": "0a8786jqlpjrvg27h9nww0v4p3p9f0rr7kilbpmb7w9466hjbkjy",
+    "license": "cc-by-sa-40"
+  },
+  {
+    "pname": "de_core_news_lg",
+    "version": "3.3.0",
+    "sha256": "1k80mq5gfiw7m7z60by1qis2zhszwb9z9hg55r0qam71pnbsqb0f",
+    "license": "mit"
+  },
+  {
+    "pname": "de_core_news_md",
+    "version": "3.3.0",
+    "sha256": "0y13qwkfh7nzp2m8w3qna0qj3gaxrpsncmc1ramnn515565j62in",
+    "license": "mit"
+  },
+  {
+    "pname": "de_core_news_sm",
+    "version": "3.3.0",
+    "sha256": "0ln5p4dg5y4hzpx1738qlh6591j2ydrf8gyvhfvx5dr1pkwps83d",
+    "license": "mit"
+  },
+  {
+    "pname": "de_dep_news_trf",
+    "version": "3.3.0",
+    "sha256": "18clx5dck1wmk39miqlsqgwvzhhqd7xh8vmi6ilpjnwgx48yfjh7",
+    "license": "mit"
+  },
+  {
+    "pname": "el_core_news_lg",
+    "version": "3.3.0",
+    "sha256": "165vji0d4imylpgpywnmdjvylsi2l8kz8fpxbhwjdx5cv40ywcda",
+    "license": "cc-by-nc-sa-30"
+  },
+  {
+    "pname": "el_core_news_md",
+    "version": "3.3.0",
+    "sha256": "0jz32glmwj1a662ciz1ay6g2shil0ia8smmbj42ghnjl4dlf2n3b",
+    "license": "cc-by-nc-sa-30"
+  },
+  {
+    "pname": "el_core_news_sm",
+    "version": "3.3.0",
+    "sha256": "179fqj781wfrh9nkizv7s5ia8abb73sgnnl3yim35nbkpwnps47v",
+    "license": "cc-by-nc-sa-30"
+  },
+  {
+    "pname": "en_core_web_lg",
+    "version": "3.3.0",
+    "sha256": "0j1d9i2xqqbaiyzr1aghzm42nfjlxx3qv2mlfhav3yi69hmy8aj3",
+    "license": "mit"
+  },
+  {
+    "pname": "en_core_web_md",
+    "version": "3.3.0",
+    "sha256": "1anq8vlk3rwf7by1j7b9gvc5pjdvc9cz4mazqvrs4448xs3r0ndl",
+    "license": "mit"
+  },
+  {
+    "pname": "en_core_web_sm",
+    "version": "3.3.0",
+    "sha256": "1bknji6j21pm9y0v48zhc0r4di5wm4lxxab35wmzakn0myhag2il",
+    "license": "mit"
+  },
+  {
+    "pname": "en_core_web_trf",
+    "version": "3.3.0",
+    "sha256": "1qfkif2dzs9gvkydca2mq1w9xb818zmz14rwramxpvq17bfraqdw",
+    "license": "mit"
+  },
+  {
+    "pname": "es_core_news_lg",
+    "version": "3.3.0",
+    "sha256": "0jd9wq7nxw4iywr9v2m19kf84hhgnh1sy9j2zrz6w5vv16363cr9",
+    "license": "gpl3"
+  },
+  {
+    "pname": "es_core_news_md",
+    "version": "3.3.0",
+    "sha256": "0gk2rca1qmgy5bnv4r8h9kxpix19h3dgbgjwky60fagnbvch5pzc",
+    "license": "gpl3"
+  },
+  {
+    "pname": "es_core_news_sm",
+    "version": "3.3.0",
+    "sha256": "0r3hvx5za3iydqfqz65p586c8g86b7pw8mjnipj43y0qnz2d0x14",
+    "license": "gpl3"
+  },
+  {
+    "pname": "es_dep_news_trf",
+    "version": "3.3.0",
+    "sha256": "1rmccrgddgbfagj2vasfr6bqc5kpziy4gln5bcmnxwhh6mh66rwd",
+    "license": "gpl3"
+  },
+  {
+    "pname": "fr_core_news_lg",
+    "version": "3.3.0",
+    "sha256": "15vxksw3g7g721cwrp9436w5wx43gicq6i2v6v1h63qifxjhkp3j",
+    "license": "lgpllr"
+  },
+  {
+    "pname": "fr_core_news_md",
+    "version": "3.3.0",
+    "sha256": "1x3d6nlfmclq961b292aqvgz8ldijpsi330vja75ncrbyz9wygav",
+    "license": "lgpllr"
+  },
+  {
+    "pname": "fr_core_news_sm",
+    "version": "3.3.0",
+    "sha256": "1gqzspi8y8b54ja7ikhlr5ip137kgv7x4flavgj456sdhfzkaqkz",
+    "license": "lgpllr"
+  },
+  {
+    "pname": "fr_dep_news_trf",
+    "version": "3.3.0",
+    "sha256": "09n067v07233gr8sw6yma1s2bi2m6wf8ripn74npjjs28akmr5p3",
+    "license": "lgpllr"
+  },
+  {
+    "pname": "it_core_news_lg",
+    "version": "3.3.0",
+    "sha256": "1c5zqfpkmjwr21nmcnky6sgf7fr4lpiaai9hz2z14yrnnvby80y1",
+    "license": "cc-by-nc-sa-30"
+  },
+  {
+    "pname": "it_core_news_md",
+    "version": "3.3.0",
+    "sha256": "1jpcivp0djfm975czn41k23y7ly6b54myrlj5fyjql1scwf0xzh1",
+    "license": "cc-by-nc-sa-30"
+  },
+  {
+    "pname": "it_core_news_sm",
+    "version": "3.3.0",
+    "sha256": "0lkgs8sw02p7l5mrbrwkaiqs524hd9bkhfiiz7wzcc0p0zn4hn8h",
+    "license": "cc-by-nc-sa-30"
+  },
+  {
+    "pname": "lt_core_news_lg",
+    "version": "3.3.0",
+    "sha256": "08azxjqpsa66b5vm7gwllbjli36wv1n11m07andlkg3p2nmn6m85",
+    "license": "cc-by-sa-40"
+  },
+  {
+    "pname": "lt_core_news_md",
+    "version": "3.3.0",
+    "sha256": "05qj4bhjq4v31r05rza7kc52kmp954f4h4zs344pdddzdzzc8h4q",
+    "license": "cc-by-sa-40"
+  },
+  {
+    "pname": "lt_core_news_sm",
+    "version": "3.3.0",
+    "sha256": "0wmaxixrm08ikicgnbz5zw3iimmm9dl7j7yy78bqixzym0iv2hxy",
+    "license": "cc-by-sa-40"
+  },
+  {
+    "pname": "mk_core_news_lg",
+    "version": "3.3.0",
+    "sha256": "17q62v8nvyz73d5jsbd5nw1mzxkj1cn7g6f0cl0lrl6pqn2b2rgl",
+    "license": "cc-by-sa-40"
+  },
+  {
+    "pname": "mk_core_news_md",
+    "version": "3.3.0",
+    "sha256": "103z7hkr5jbk6zmqihzsm9jlmr4mg32r6ph90j6xx71jdmnjz4ky",
+    "license": "cc-by-sa-40"
+  },
+  {
+    "pname": "mk_core_news_sm",
+    "version": "3.3.0",
+    "sha256": "09k56dds3mjc2qxa6mbcha1i2h4hqjvbavkhnijmdfhsk6azk3v5",
+    "license": "cc-by-sa-40"
+  },
+  {
+    "pname": "nb_core_news_lg",
+    "version": "3.3.0",
+    "sha256": "11iq62w96zc5z51i9kkxp5bqbfmhzm3jpivrs8arw9fs7xrscjn0",
+    "license": "mit"
+  },
+  {
+    "pname": "nb_core_news_md",
+    "version": "3.3.0",
+    "sha256": "0891z1c867jyhg9jr0ais2vv6h3v5b98sc7c8hxy4apf7nwnkjss",
+    "license": "mit"
+  },
+  {
+    "pname": "nb_core_news_sm",
+    "version": "3.3.0",
+    "sha256": "1v19jvzvhix6rfac4szggdcqi3qkljwqmrynl75qz28piff0sln5",
+    "license": "mit"
+  },
+  {
+    "pname": "nl_core_news_lg",
+    "version": "3.3.0",
+    "sha256": "0ai6pydmd2rabpl8fy98ild7n2wwk2z11qha20x4gn33d8k60ih0",
+    "license": "cc-by-sa-40"
+  },
+  {
+    "pname": "nl_core_news_md",
+    "version": "3.3.0",
+    "sha256": "1c95xcivn09dmfgrq21hh9i82v6wbnk0cwglcdgnx9kfidzgpgjc",
+    "license": "cc-by-sa-40"
+  },
+  {
+    "pname": "nl_core_news_sm",
+    "version": "3.3.0",
+    "sha256": "1jp978ish3hvn48i1dard82czzx3vvh4lnlhhb50j0kk4b7xv5z1",
+    "license": "cc-by-sa-40"
+  },
+  {
+    "pname": "pl_core_news_lg",
+    "version": "3.3.0",
+    "sha256": "0w5rpz43ix16sq8h6h5g3h1a64ww8r5z4fydz2vr7bphajkwrhlq",
+    "license": "gpl3"
+  },
+  {
+    "pname": "pl_core_news_md",
+    "version": "3.3.0",
+    "sha256": "1sllknhw689nbf9rmnc5604r0vig1yzkpg3s6yvgjyli7m04k6d1",
+    "license": "gpl3"
+  },
+  {
+    "pname": "pl_core_news_sm",
+    "version": "3.3.0",
+    "sha256": "0gpa140y04kazr8imifgdjsdzj7m10s15vy8q0vbi8chc8m14i1s",
+    "license": "gpl3"
+  },
+  {
+    "pname": "pt_core_news_lg",
+    "version": "3.3.0",
+    "sha256": "1pk0m03hyck3g6riq1x5n5k0jp70z2fqaw6pl7zrm0rcf2165rh0",
+    "license": "cc-by-sa-40"
+  },
+  {
+    "pname": "pt_core_news_md",
+    "version": "3.3.0",
+    "sha256": "190d74ihga38kp68r8xs9rxnavxdzw2j917f7b75wmr04brbf824",
+    "license": "cc-by-sa-40"
+  },
+  {
+    "pname": "pt_core_news_sm",
+    "version": "3.3.0",
+    "sha256": "1477yddal5cjn7a6adw1bvmal4pc4p8bcc4x7q016a22fgk9lcpl",
+    "license": "cc-by-sa-40"
+  },
+  {
+    "pname": "ro_core_news_lg",
+    "version": "3.3.0",
+    "sha256": "1w8cwll2dp9a1k40b5njbypdrxwf7vacf9sdwc18kkiadkrihy4g",
+    "license": "cc-by-sa-40"
+  },
+  {
+    "pname": "ro_core_news_md",
+    "version": "3.3.0",
+    "sha256": "1mr3s0fm571idbgi0g3qg4x7hyy1kw9br98vn8g21f8h05qmlc72",
+    "license": "cc-by-sa-40"
+  },
+  {
+    "pname": "ro_core_news_sm",
+    "version": "3.3.0",
+    "sha256": "1n6dwfx2l0wzb02r14z47r19v5dy7ld35s11w1kq40k5bbkbakhm",
+    "license": "cc-by-sa-40"
+  },
+  {
+    "pname": "ru_core_news_lg",
+    "version": "3.3.0",
+    "sha256": "1yv2r6b6n9ccvizi23q2xdrzbws1asa5mbiw4771irrmqzan9wiq",
+    "license": "mit"
+  },
+  {
+    "pname": "ru_core_news_md",
+    "version": "3.3.0",
+    "sha256": "0s2yjlibg2r2pdf8cfn36nx6rp9ppk8jjjph91az0sp5lj0c38pp",
+    "license": "mit"
+  },
+  {
+    "pname": "ru_core_news_sm",
+    "version": "3.3.0",
+    "sha256": "0cnn8daf90hnl5mmgk3y6fc0f6x62j7rm9gkq16zbb0qmayb7ri0",
+    "license": "mit"
+  },
+  {
+    "pname": "sv_core_news_lg",
+    "version": "3.3.0",
+    "sha256": "0503xnr8cdzb2ckj12b51hkayv2gzf2c2rv746w4y50pjk4cmfsx",
+    "license": "cc-by-sa-40"
+  },
+  {
+    "pname": "sv_core_news_md",
+    "version": "3.3.0",
+    "sha256": "1hzfl92j13hxf8im4b4mjbgxawp8xqpi3ych6bi2x5pr7qjx6gab",
+    "license": "cc-by-sa-40"
+  },
+  {
+    "pname": "sv_core_news_sm",
+    "version": "3.3.0",
+    "sha256": "0sjg1ab8r7m1g735amgakslchn1jba0ygyri59h6qsp8cmhvajw7",
+    "license": "cc-by-sa-40"
+  },
+  {
+    "pname": "xx_ent_wiki_sm",
+    "version": "3.3.0",
+    "sha256": "1925y6n90qwy703v410si8sq7vzvlwi6zaj9n19ggysr78kyrsqz",
+    "license": "mit"
+  },
+  {
+    "pname": "xx_sent_ud_sm",
+    "version": "3.3.0",
+    "sha256": "0dgd2lwh269f8m7qsv8x3743b3mc5r2lw6kcvdh1cs8qk8hxlfnx",
+    "license": "cc-by-sa-30"
+  },
+  {
+    "pname": "zh_core_web_lg",
+    "version": "3.3.0",
+    "sha256": "15yps28i86shnf313xbsmv1sgnr71aymxnx5s155hbn2fk8pdzwc",
+    "license": "mit"
+  },
+  {
+    "pname": "zh_core_web_md",
+    "version": "3.3.0",
+    "sha256": "0mvqgmm4y1ng6asxb2ic215ikk8lx0dm7c5cfwhx02vamllxv20q",
+    "license": "mit"
+  },
+  {
+    "pname": "zh_core_web_sm",
+    "version": "3.3.0",
+    "sha256": "05qc50wxddfacf6x7i8q0r9dnrr6gsfnaldzmavry96nfngmqp6v",
+    "license": "mit"
+  },
+  {
+    "pname": "zh_core_web_trf",
+    "version": "3.3.0",
+    "sha256": "0pmb456q8b02qw5zmw735w9yv3clfaqcqm91ng8lphxbcxqkp9jc",
+    "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..0e0f1f19640f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/spacy/models.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchurl
+, jieba
+, pymorphy2
+, sentencepiece
+, spacy
+, spacy-pkuseg
+, spacy-transformers }:
+let
+  buildModelPackage = { pname, version, sha256, license }:
+  let
+    lang = builtins.substring 0 2 pname;
+  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 (lang == "zh") [ jieba spacy-pkuseg ]
+      ++ lib.optionals (lib.hasSuffix "_trf" pname) [ spacy-transformers ]
+      ++ lib.optionals (lang == "ru") [ pymorphy2 ]
+      ++ lib.optionals (pname == "fr_dep_news_trf") [ sentencepiece ];
+
+    postPatch = lib.optionalString (pname == "fr_dep_news_trf") ''
+      substituteInPlace meta.json \
+        --replace "sentencepiece==0.1.91" "sentencepiece>=0.1.91"
+    '';
+
+    pythonImportsCheck = [ pname ];
+
+    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)
+
+# cat models.json | jq -r '.[] | @uri "https://github.com/explosion/spacy-models/releases/download/\(.pname)-\(.version)/\(.pname)-\(.version).tar.gz"' | xargs -n1 nix-prefetch-url
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..4038e2255afa
--- /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";
+  };
+
+  checkInputs = [ 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..9913cafdbc18
--- /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 ];
+
+  checkInputs = [ 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..0660b8a403ce
--- /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;
+    sha256 = "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..2a11e1f14587
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sparse/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, dask
+, fetchPypi
+, numba
+, numpy
+, pytestCheckHook
+, pythonOlder
+, scipy
+}:
+
+buildPythonPackage rec {
+  pname = "sparse";
+  version = "0.13.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-aF3JlKp3DuGyPy1TkoGchCnyeVh3H43OssT7gCENWRU=";
+  };
+
+  propagatedBuildInputs = [
+    numba
+    numpy
+    scipy
+  ];
+
+  checkInputs = [
+    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; [ costrouc ];
+  };
+}
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..d35846a11017
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/spdx-tools/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, click
+, fetchPypi
+, pyyaml
+, rdflib
+, ply
+, xmltodict
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "spdx-tools";
+  version = "0.7.0a3";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-afV1W1n5ubHhqfLFpPO5fxaIy5TaZdw9eDy3JYOJ1oE=";
+  };
+
+  propagatedBuildInputs = [
+    click
+    ply
+    pyyaml
+    rdflib
+    xmltodict
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "spdx"
+  ];
+
+  meta = with lib; {
+    description = "SPDX parser and tools";
+    homepage = "https://github.com/spdx/tools-python";
+    license = licenses.asl20;
+    maintainers = teams.determinatesystems.members;
+  };
+}
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..fae812319ec8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/spectral-cube/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, stdenv
+, fetchPypi
+, buildPythonPackage
+, aplpy
+, joblib
+, astropy
+, casa-formats-io
+, radio_beam
+, six
+, dask
+, pytestCheckHook
+, pytest-astropy
+, astropy-helpers
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "spectral-cube";
+  version = "0.6.0";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1c0pp82wgl680w2vcwlrrz46sy83z1qs74w5bd691wg0512hv2jx";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [ astropy casa-formats-io radio_beam joblib six dask ];
+  checkInputs = [ pytestCheckHook aplpy pytest-astropy ];
+
+  # 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"
+  ];
+
+  meta = {
+    description = "Library for reading and analyzing astrophysical spectral data cubes";
+    homepage = "http://radio-astro-tools.github.io";
+    license = lib.licenses.bsd3;
+    platforms = lib.platforms.all;
+    maintainers = with lib.maintainers; [ smaret ];
+  };
+}
+
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/spglib/default.nix b/nixpkgs/pkgs/development/python-modules/spglib/default.nix
new file mode 100644
index 000000000000..d317f11dea42
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/spglib/default.nix
@@ -0,0 +1,31 @@
+{ lib, buildPythonPackage, fetchPypi, numpy, pytest, pyyaml }:
+
+buildPythonPackage rec {
+  pname = "spglib";
+  version = "1.16.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-Lqzv1TzGRLqakMRoH9bJNLa92BjBE9fzGZBOB41dq5M=";
+  };
+
+  propagatedBuildInputs = [ numpy ];
+
+  checkInputs = [ pytest pyyaml ];
+
+  # pytestCheckHook doesn't work
+  # ImportError: cannot import name '_spglib' from partially initialized module 'spglib'
+  checkPhase = ''
+    pytest
+  '';
+
+  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..bd7197b2bf2b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinx-argparse/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+, sphinx
+}:
+
+buildPythonPackage rec {
+  pname = "sphinx-argparse";
+  version = "0.3.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "82151cbd43ccec94a1530155f4ad34f251aaca6a0ffd5516d7fadf952d32dc1e";
+  };
+
+  checkInputs = [
+    pytest
+  ];
+
+  checkPhase = "py.test";
+
+  propagatedBuildInputs = [
+    sphinx
+  ];
+
+  meta = {
+    description = "A sphinx extension that automatically documents argparse commands and options";
+    homepage = "https://github.com/ribozz/sphinx-argparse";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ clacke ];
+  };
+}
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..199788976ef7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinx-autodoc-typehints/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, sphinx
+, pytestCheckHook
+}:
+
+let
+  pname = "sphinx-autodoc-typehints";
+  version = "1.19.1";
+in
+
+buildPythonPackage {
+  inherit pname version;
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "sphinx_autodoc_typehints";
+    inherit version;
+    hash = "sha256-bIQdtV4Om+BIP/OWKiFStg55MG9CiNjE5+hqyESGpeo=";
+  };
+
+  propagatedBuildInputs = [
+    sphinx
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  # requires spobjinv, nbtyping
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "sphinx_autodoc_typehints"
+  ];
+
+  meta = with lib; {
+    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-basic-ng/default.nix b/nixpkgs/pkgs/development/python-modules/sphinx-basic-ng/default.nix
new file mode 100644
index 000000000000..e6da481b9671
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinx-basic-ng/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, fetchpatch
+, sphinx
+}:
+
+buildPythonPackage rec {
+  pname = "sphinx-basic-ng";
+  version = "0.0.1.a12";
+  disable = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "pradyunsg";
+    repo = "sphinx-basic-ng";
+    rev = version;
+    sha256 = "sha256-3/a/xHPNO96GEMLgWGTLdFoojVsjNyxYgY1gAZr75S0=";
+  };
+
+  patches = [
+    (fetchpatch {
+      name = "fix-import-error.patch";
+      url = "https://github.com/pradyunsg/sphinx-basic-ng/pull/32/commits/323a0085721b908aa11bc3c36c51e16f517ee023.patch";
+      sha256 = "sha256-/G1wLG/08u2s3YENSKSYekLrV1fUkxDAlxc3crTQNHk=";
+    })
+  ];
+
+  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..3fd28acef9cb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinx-book-theme/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, sphinx
+, pydata-sphinx-theme
+, pyyaml
+}:
+
+buildPythonPackage rec {
+  pname = "sphinx-book-theme";
+  version = "0.3.3";
+
+  format = "wheel";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit version format;
+    dist = "py3";
+    python = "py3";
+    pname = "sphinx_book_theme";
+    sha256 = "9685959dbbb492af005165ef1b9229fdd5d5431580ac181578beae3b4d012d91";
+  };
+
+  propagatedBuildInputs = [
+    sphinx
+    pydata-sphinx-theme
+    pyyaml
+  ];
+
+  pythonImportsCheck = [ "sphinx_book_theme" ];
+
+  meta = with lib; {
+    description = "A clean book theme for scientific explanations and documentation with Sphinx";
+    homepage = "https://github.com/executablebooks/sphinx-book-theme";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ marsam ];
+  };
+}
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..fc2e9517ce23
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinx-comments/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, sphinx
+}:
+
+buildPythonPackage rec {
+  pname = "sphinx-comments";
+  version = "0.0.3";
+
+  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..259a7dde28b3
--- /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.0";
+
+  src = fetchFromGitHub {
+    owner = "executablebooks";
+    repo = "sphinx-copybutton";
+    rev = "v${version}";
+    sha256 = "sha256-W27kCU/8NHoBtiAyA+CgNa00j6ck3CAaq1hLLGo60Ro=";
+    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..8b4c91061fd8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinx-design/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, flit-core
+, sphinx
+}:
+
+buildPythonPackage rec {
+  pname = "sphinx-design";
+  version = "0.2.0";
+
+  format = "flit";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "sphinx_design";
+    sha256 = "b148a5258061a46ee826d57ea0729260f29b4e9131d2a681545e0d4f3c0f19ee";
+  };
+
+  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";
+    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..009e4ef9c841
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinx-external-toc/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, flit-core
+, click
+, pyyaml
+, sphinx
+}:
+
+buildPythonPackage rec {
+  pname = "sphinx-external-toc";
+  version = "0.3.0";
+
+  format = "flit";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "sphinx_external_toc";
+    sha256 = "73198636ada4b4f72f69c7bab09f0e4ce84978056dc5afa9ee51d287bec0a8ef";
+  };
+
+  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";
+    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..748e4c6948bc
--- /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";
+    sha256 = "sha256-IVKu5u9gqs7/9EZrf4ZYd12K6J31u+/B8kk4+8yfohM=";
+  };
+
+  propagatedBuildInputs = [
+    future
+    numpy
+    sphinx
+    six
+  ];
+
+  pythonImportsCheck = [ "sphinxfortran" ];
+
+  # Tests are failing because reference files are not updated
+  doCheck = false;
+
+  checkInputs = [
+    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-inline-tabs/default.nix b/nixpkgs/pkgs/development/python-modules/sphinx-inline-tabs/default.nix
new file mode 100644
index 000000000000..0dd855fee2ae
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinx-inline-tabs/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, sphinx
+}:
+
+buildPythonPackage rec {
+  pname = "sphinx-inline-tabs";
+  version = "2022.01.02.beta11";
+  format = "flit";
+
+  src = fetchFromGitHub {
+    owner = "pradyunsg";
+    repo = "sphinx-inline-tabs";
+    rev = version;
+    sha256 = "sha256-k2nOidUk87EZbFsqQ7zr/4eHk+T7wUOYimjbllfneUM=";
+  };
+
+  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-jinja/default.nix b/nixpkgs/pkgs/development/python-modules/sphinx-jinja/default.nix
new file mode 100644
index 000000000000..76823af5424f
--- /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;
+    sha256 = "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..b087ed2bd39e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinx-jupyterbook-latex/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, sphinx
+, importlib-resources
+}:
+
+buildPythonPackage rec {
+  pname = "sphinx-jupyterbook-latex";
+  version = "0.4.6";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "sphinx_jupyterbook_latex";
+    sha256 = "8ff3775b11ab4798e6e8ec983601d7aea4c3b8e8b5d28ca758578ede3a791334";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "sphinx>=3,<5" "sphinx>=3"
+  '';
+
+  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";
+    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..cd5b1927d102
--- /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-material/default.nix b/nixpkgs/pkgs/development/python-modules/sphinx-material/default.nix
new file mode 100644
index 000000000000..f36db1ae87bd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinx-material/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, sphinx
+, beautifulsoup4
+, python-slugify
+, unidecode
+, css-html-js-minify
+, lxml
+}:
+
+buildPythonPackage rec {
+  pname = "sphinx-material";
+  version = "0.0.35";
+
+  src = fetchPypi {
+    pname = "sphinx_material";
+    inherit version;
+    sha256 = "27f0f1084aa0201b43879aef24a0521b78dc8df4942b003a4e7d79ab11515852";
+  };
+
+  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-multitoc-numbering/default.nix b/nixpkgs/pkgs/development/python-modules/sphinx-multitoc-numbering/default.nix
new file mode 100644
index 000000000000..612717120f83
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinx-multitoc-numbering/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, sphinx
+}:
+
+buildPythonPackage rec {
+  pname = "sphinx-multitoc-numbering";
+  version = "0.1.3";
+
+  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-navtree/default.nix b/nixpkgs/pkgs/development/python-modules/sphinx-navtree/default.nix
new file mode 100644
index 000000000000..ae56a9fdce11
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinx-navtree/default.nix
@@ -0,0 +1,20 @@
+{ lib, fetchPypi, buildPythonPackage, sphinx }:
+
+buildPythonPackage rec {
+  version = "0.3.0";
+  pname = "sphinx-navtree";
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1nqcsbqwr8ihk1fv534i0naag1qw04f7ibcgl2j8csvkh8q90b4p";
+  };
+
+  propagatedBuildInputs = [ sphinx ];
+
+  meta = {
+    description = "Navigation tree customization for Sphinx";
+    homepage = "https://github.com/bintoro/sphinx-navtree";
+    license = lib.licenses.mit;
+    # not compatible with sphinx 3.3, not updated since 2016
+    broken = true;
+  };
+}
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..c1ecb232c8b5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinx-pytest/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, flit-core
+, pytest
+, sphinx
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "sphinx-pytest";
+  version = "0.0.3";
+
+  src = fetchFromGitHub {
+    owner = "chrisjsewell";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-vRHPq6BAuhn5QvHG2BGen9v6ezA3RgFVtustsNxU+n8=";
+  };
+
+  format = "flit";
+
+  nativeBuildInputs = [ flit-core ];
+
+  propagatedBuildInputs = [
+    sphinx
+  ];
+
+  buildInputs = [
+    pytest
+  ];
+
+  pythonImportsCheck = [ "sphinx_pytest" ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    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..514ce279fe79
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinx-rtd-theme/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, docutils
+, sphinx
+, readthedocs-sphinx-ext
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "sphinx-rtd-theme";
+  version = "1.0.0";
+
+  src = fetchPypi {
+    pname = "sphinx_rtd_theme";
+    inherit version;
+    sha256 = "0p3abj91c3l72ajj5jwblscsdf1jflrnn0djx2h5y6f2wjbx9ipf";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "docutils<0.18" "docutils"
+  '';
+
+  preBuild = ''
+    # Don't use NPM to fetch assets. Assets are included in sdist.
+    export CI=1
+  '';
+
+  propagatedBuildInputs = [
+    docutils
+    sphinx
+  ];
+
+  checkInputs = [
+    readthedocs-sphinx-ext
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "ReadTheDocs.org theme for Sphinx";
+    homepage = "https://github.com/readthedocs/sphinx_rtd_theme";
+    license = licenses.mit;
+    platforms = platforms.unix;
+  };
+
+}
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-testing/default.nix b/nixpkgs/pkgs/development/python-modules/sphinx-testing/default.nix
new file mode 100644
index 000000000000..1a8521bf4382
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinx-testing/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, mock
+, sphinx
+, six
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "sphinx-testing";
+  version = "1.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ef661775b5722d7b00f67fc229104317d35637a4fb4434bf2c005afdf1da4d09";
+  };
+
+  checkInputs = [ mock ];
+  propagatedBuildInputs = [ sphinx six ];
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest discover -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..c98e2fea6883
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinx-thebe/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, sphinx
+}:
+
+buildPythonPackage rec {
+  pname = "sphinx-thebe";
+  version = "0.1.2";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "756f1dd6643f5abb491f8a27b22825b04f47e05c5d214bbb2e6b5d42b621b85e";
+  };
+
+  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";
+    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..f1056261fba1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinx-togglebutton/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, wheel
+, sphinx
+, docutils
+}:
+
+buildPythonPackage rec {
+  pname = "sphinx-togglebutton";
+  version = "0.3.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-qwyLNmQnsB5MiYAtXQeEcsQn+m6dEtUhw0+gRCVZ3Ho=";
+  };
+
+  propagatedBuildInputs = [ wheel sphinx docutils ];
+
+  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/0001-test-images-Use-normalization-equivalent-character.patch b/nixpkgs/pkgs/development/python-modules/sphinx/0001-test-images-Use-normalization-equivalent-character.patch
new file mode 100644
index 000000000000..805e724d0c8c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinx/0001-test-images-Use-normalization-equivalent-character.patch
@@ -0,0 +1,35 @@
+From 181617387841b695ee77b162babf9fb177002fcb Mon Sep 17 00:00:00 2001
+From: toonn <toonn@toonn.io>
+Date: Mon, 20 Sep 2021 11:39:46 +0200
+Subject: [PATCH] test-images: Use normalization equivalent character
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+One of the test images used a combining character `ä` that can be
+encoded multiple ways. This means the file's name can end up encoded
+differently depending on whether/which normal form the filesystem uses.
+
+For Nix this causes a different hash for a FOD depending on the
+filesystem where it is evaluated. This is problematic because hashes
+fail to match up when evaluating the FOD across multiple platforms.
+---
+ tests/roots/test-images/index.rst | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/tests/roots/test-images/index.rst b/tests/roots/test-images/index.rst
+index 14a2987..219842e 100644
+--- a/tests/roots/test-images/index.rst
++++ b/tests/roots/test-images/index.rst
+@@ -13,7 +13,7 @@ test-image
+ 
+    The caption of img
+ 
+-.. image:: testimäge.png
++.. image:: testimæge.png
+ 
+ .. image:: rimg.png
+    :target: https://www.sphinx-doc.org/
+-- 
+2.17.2 (Apple Git-113)
+
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..166f9347d719
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinx/default.nix
@@ -0,0 +1,149 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, fetchpatch
+# 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
+, html5lib
+, pytestCheckHook
+, typed-ast
+}:
+
+buildPythonPackage rec {
+  pname = "sphinx";
+  version = "5.0.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "sphinx-doc";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-kdwznYvs4szhC+qoL2Zsib9cU69fag1KhCXl8qIGkZU=";
+    postFetch = ''
+      cd $out
+      mv tests/roots/test-images/testimäge.png \
+        tests/roots/test-images/testimæge.png
+      patch -p1 < ${./0001-test-images-Use-normalization-equivalent-character.patch}
+    '';
+  };
+
+  patches = [
+    # https://github.com/sphinx-doc/sphinx/pull/10624
+    (fetchpatch {
+      name = "avoid-deprecated-docutils-0.19-api.patch";
+      sha256 = "sha256-QIrLkxnexNcfuI00UOeCpAamMLqqt4wxoVY1VA72jIw=";
+      url = "https://github.com/sphinx-doc/sphinx/commit/8d99168794ab8be0de1e6281d1b76af8177acd3d.patch";
+    })
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "docutils>=0.14,<0.19" "docutils>=0.14"
+
+    # remove impurity caused by date inclusion
+    # https://github.com/sphinx-doc/sphinx/blob/master/setup.cfg#L4-L6
+    substituteInPlace setup.cfg \
+      --replace "tag_build = .dev" "" \
+      --replace "tag_date = true" ""
+  '';
+
+  propagatedBuildInputs = [
+    babel
+    alabaster
+    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
+  ];
+
+  checkInputs = [
+    html5lib
+    pytestCheckHook
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    typed-ast
+  ];
+
+  disabledTests = [
+    # requires network access
+    "test_anchors_ignored"
+    "test_defaults"
+    "test_defaults_json"
+    "test_latex_images"
+
+    # requires imagemagick (increases build closure size), doesn't
+    # test anything substantial
+    "test_ext_imgconverter"
+  ] ++ lib.optional stdenv.isDarwin [
+    # Due to lack of network sandboxing can't guarantee port 7777 isn't bound
+    "test_inspect_main_url"
+    "test_auth_header_uses_first_match"
+    "test_linkcheck_allowed_redirects"
+    "test_linkcheck_request_headers"
+    "test_linkcheck_request_headers_no_slash"
+    "test_follows_redirects_on_HEAD"
+    "test_get_after_head_raises_connection_error"
+    "test_invalid_ssl"
+    "test_connect_to_selfsigned_with_tls_verify_false"
+    "test_connect_to_selfsigned_with_tls_cacerts"
+    "test_connect_to_selfsigned_with_requests_env_var"
+    "test_connect_to_selfsigned_nonexistent_cert_file"
+    "test_TooManyRedirects_on_HEAD"
+    "test_too_many_requests_retry_after_int_del"
+    "test_too_many_requests_retry_after_HTTP_date"
+    "test_too_many_requests_retry_after_without_header"
+    "test_too_many_requests_user_timeout"
+    "test_raises_for_invalid_status"
+    "test_auth_header_no_match"
+    "test_follows_redirects_on_GET"
+    "test_connect_to_selfsigned_fails"
+  ];
+
+  meta = with lib; {
+    description = "Python documentation generator";
+    longDescription = ''
+      A tool that makes it easy to create intelligent and beautiful
+      documentation for Python projects
+    '';
+    homepage = "https://www.sphinx-doc.org";
+    license = licenses.bsd3;
+    maintainers = teams.sphinx.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinx_pypi_upload/default.nix b/nixpkgs/pkgs/development/python-modules/sphinx_pypi_upload/default.nix
new file mode 100644
index 000000000000..d2c20e980e7a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinx_pypi_upload/default.nix
@@ -0,0 +1,21 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "Sphinx-PyPI-upload";
+  version = "0.2.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5f919a47ce7a7e6028dba809de81ae1297ac192347cf6fc54efca919d4865159";
+  };
+
+  meta = with lib; {
+    description = "Setuptools command for uploading Sphinx documentation to PyPI";
+    homepage = "https://bitbucket.org/jezdez/sphinx-pypi-upload/";
+    license = licenses.bsd0;
+  };
+
+}
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..32470e98b4e0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-actdiag/default.nix
@@ -0,0 +1,38 @@
+{ 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"
+  ];
+
+  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..c7bdb26b0008
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-apidoc/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pbr
+}:
+
+buildPythonPackage rec {
+  pname = "sphinxcontrib-apidoc";
+  version = "0.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-cpv1ks97fdV8TAV5T3MtwCYScnXXhcKlSUUh/d53P7k=";
+  };
+
+  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;
+
+  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..ef7a50382c6e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-applehelp/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+}:
+
+buildPythonPackage rec {
+  pname = "sphinxcontrib-applehelp";
+  version = "1.0.2";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58";
+  };
+
+  # Check is disabled due to circular dependency of sphinx
+  doCheck = false;
+
+  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.bsd0;
+    maintainers = teams.sphinx.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinxcontrib-autoapi/default.nix b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-autoapi/default.nix
new file mode 100644
index 000000000000..55feba377d5e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-autoapi/default.nix
@@ -0,0 +1,45 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, astroid
+, jinja2
+, sphinx
+, pyyaml
+, unidecode
+, mock
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "sphinx-autoapi";
+  version = "1.9.0";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-yJfqM33xatDN4wfL3+K+ziB3iN3hWH+k/IuFfR/F3Lo=";
+  };
+
+  propagatedBuildInputs = [ astroid jinja2 pyyaml sphinx unidecode ];
+
+  checkInputs = [
+    mock
+    pytest
+  ];
+
+  checkPhase = ''
+    pytest
+  '';
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    homepage = "https://github.com/readthedocs/sphinx-autoapi";
+    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/sphinxcontrib-bayesnet/default.nix b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-bayesnet/default.nix
new file mode 100644
index 000000000000..6f53dd79d364
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-bayesnet/default.nix
@@ -0,0 +1,25 @@
+{ stdenv, lib, buildPythonPackage, fetchPypi, sphinx, sphinxcontrib-tikz }:
+
+buildPythonPackage rec {
+  pname = "sphinxcontrib-bayesnet";
+  version = "0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0x1kisvj7221cxfzmwplx3xlwbavl636fpncnjh7gghp1af71clw";
+  };
+
+  propagatedBuildInputs = [ sphinx sphinxcontrib-tikz ];
+
+  # No tests
+  doCheck = false;
+  pythonImportsCheck = [ "sphinxcontrib.bayesnet" ];
+
+  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 ];
+    broken = true; # relies on 2to3 conversion, which was removed from setuptools>=58.0
+  };
+}
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..94c545a694ef
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-bibtex/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, oset
+, pybtex
+, pybtex-docutils
+, sphinx
+}:
+
+buildPythonPackage rec {
+  pname = "sphinxcontrib-bibtex";
+  version = "2.4.2";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-ZbAj7kfzXx8DrE1xyCTmfGJMfsrBuyboNiMnGgH52oY=";
+  };
+
+  propagatedBuildInputs = [
+    oset
+    pybtex
+    pybtex-docutils
+    sphinx
+  ];
+
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "sphinxcontrib.bibtex"
+  ];
+
+  meta = with lib; {
+    description = "A Sphinx extension for BibTeX style citations";
+    homepage = "https://github.com/mcmtroffaes/sphinxcontrib-bibtex";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..0b26c24319fa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-blockdiag/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+, 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;
+  checkPhase = ''
+    ${python.interpreter} -m unittest discover -s tests
+  '';
+
+  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..9a8c65377b3d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-confluencebuilder/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, docutils
+, sphinx
+, requests
+, jinja2
+}:
+
+buildPythonPackage rec {
+  pname = "sphinxcontrib-confluencebuilder";
+  version = "1.8.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-u+sjhj/2fu8fLGRb2zgnNI+y7wIIUYTMJhRekrdtMeU=";
+  };
+
+  propagatedBuildInputs = [
+    docutils
+    sphinx
+    requests
+    jinja2
+  ];
+
+  # Tests are disabled due to a circular dependency on Sphinx
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "sphinxcontrib.confluencebuilder"
+  ];
+
+  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..293f4c856ef5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-devhelp/default.nix
@@ -0,0 +1,24 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "sphinxcontrib-devhelp";
+  version = "1.0.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4";
+  };
+
+  # Check is disabled due to circular dependency of sphinx
+  doCheck = false;
+
+  meta = with lib; {
+    description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document.";
+    homepage = "https://github.com/sphinx-doc/sphinxcontrib-devhelp";
+    license = licenses.bsd0;
+    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..e48b24c3644f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-excel-table/default.nix
@@ -0,0 +1,30 @@
+{ 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;
+
+  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..57535c6f137c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-fulltoc/default.nix
@@ -0,0 +1,30 @@
+{ 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" ];
+
+  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..901132176ed9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-htmlhelp/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+}:
+
+buildPythonPackage rec {
+  pname = "sphinxcontrib-htmlhelp";
+  version = "2.0.0";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f5f8bb2d0d629f398bf47d0d69c07bc13b65f75a81ad9e2f71a63d4b7a2f6db2";
+  };
+
+  # Check is disabled due to circular dependency of sphinx
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Sphinx extension which renders HTML help files";
+    homepage = "https://github.com/sphinx-doc/sphinxcontrib-htmlhelp";
+    license = licenses.bsd0;
+    maintainers = teams.sphinx.members;
+  };
+}
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..da630c6ee96d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-jsmath/default.nix
@@ -0,0 +1,26 @@
+{ 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;
+
+  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..dd38d8110f36
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-katex/default.nix
@@ -0,0 +1,28 @@
+{ lib, buildPythonPackage, fetchPypi, pythonOlder, sphinx }:
+
+buildPythonPackage rec {
+  pname = "sphinxcontrib-katex";
+  version = "0.8.6";
+
+  # 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 = "c3dcdb2984626a0e6c1b11bc2580c7bbc6ab3711879b23bbf26c028a0f4fd4f2";
+  };
+
+  propagatedBuildInputs = [ sphinx ];
+
+  # There are no unit tests
+  doCheck = false;
+  pythonImportsCheck = [ "sphinxcontrib.katex" ];
+
+  meta = with lib; {
+    description = "Sphinx extension using KaTeX to render math in HTML";
+    homepage = "https://github.com/hagenw/sphinxcontrib-katex";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jluttine ];
+  };
+}
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..47573ad609a8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-nwdiag/default.nix
@@ -0,0 +1,38 @@
+{ 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"
+  ];
+
+  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..c85d967222e3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-openapi/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, setuptools-scm
+, m2r
+, pyyaml
+, jsonschema
+, sphinxcontrib_httpdomain
+}:
+
+buildPythonPackage rec {
+  pname = "sphinxcontrib-openapi";
+  version = "0.7.0";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1c1bd10d7653912c59a42f727c62cbb7b75f7905ddd9ccc477ebfd1bc69f0cf3";
+  };
+
+  nativeBuildInputs = [ setuptools-scm ];
+  propagatedBuildInputs = [ pyyaml jsonschema m2r sphinxcontrib_httpdomain ];
+
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/ikalnytskyi/sphinxcontrib-openapi";
+    description = "OpenAPI (fka Swagger) spec renderer for Sphinx";
+    license = licenses.bsd0;
+  };
+
+}
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..20f182b55baf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-plantuml/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, sphinx
+, plantuml
+}:
+
+buildPythonPackage rec {
+  pname = "sphinxcontrib-plantuml";
+  version = "0.24";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-z2Xbc1j3haZJjuA+cZi2aAxiXSjlWzNHX8P2yUNRRR0=";
+  };
+
+  # No tests included.
+  doCheck = false;
+
+  propagatedBuildInputs = [ sphinx plantuml ];
+
+  meta = with lib; {
+    description = "Provides a Sphinx domain for embedding UML diagram with PlantUML";
+    homepage = "https://github.com/sphinx-contrib/plantuml/";
+    maintainers = with maintainers; [ ];
+    license = with licenses; [ bsd2 ];
+  };
+}
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..676f72c3f14b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-programoutput/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, sphinx
+, sphinxcontrib-serializinghtml
+}:
+
+buildPythonPackage rec {
+  pname = "sphinxcontrib-programoutput";
+  version = "0.17";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-MA7puMrug1XSXMdLTRx+/RLmCNKtFl4xQdMeb7wVK38=";
+  };
+
+  buildInputs = [
+    sphinx
+  ];
+
+  # fails to import sphinxcontrib.serializinghtml
+  doCheck = false;
+
+  pythonImportsCheck = [ "sphinxcontrib.programoutput" ];
+
+  meta = with lib; {
+    description = "Sphinx extension to include program output";
+    homepage = "https://github.com/NextThought/sphinxcontrib-programoutput";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..4364fcb99dc6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-qthelp/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+}:
+
+buildPythonPackage rec {
+  pname = "sphinxcontrib-qthelp";
+  version = "1.0.3";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72";
+  };
+
+  # Check is disabled due to circular dependency of sphinx
+  doCheck = false;
+
+  meta = with lib; {
+    description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document.";
+    homepage = "https://github.com/sphinx-doc/sphinxcontrib-qthelp";
+    license = licenses.bsd0;
+    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..cc3a96086e4e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-seqdiag/default.nix
@@ -0,0 +1,38 @@
+{ 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"
+  ];
+
+  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..85ed3cdc596d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-serializinghtml/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+}:
+
+buildPythonPackage rec {
+  pname = "sphinxcontrib-serializinghtml";
+  version = "1.1.5";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952";
+  };
+
+  # Check is disabled due to circular dependency of sphinx
+  doCheck = false;
+
+  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.bsd0;
+    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..a8a55ff8780b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-spelling/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, importlib-metadata
+, sphinx
+, pyenchant
+, pbr
+}:
+
+buildPythonPackage rec {
+  pname = "sphinxcontrib-spelling";
+  version = "7.6.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-KSzX4fc6djRRaTtNSMm97RUQhPapHlM3cz6fqHFdIOw=";
+  };
+
+  nativeBuildInputs = [
+    pbr
+  ];
+
+  propagatedBuildInputs = [
+    sphinx
+    pyenchant
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  # No tests included
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "sphinxcontrib.spelling"
+  ];
+
+  meta = with lib; {
+    description = "Sphinx spelling extension";
+    homepage = "https://github.com/sphinx-contrib/spelling";
+    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..95926b569a0a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-tikz/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, sphinx
+, pdf2svg
+, texLive
+}:
+
+buildPythonPackage rec {
+  pname = "sphinxcontrib-tikz";
+  version = "0.4.16";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-8f9FNx6WMopcqihUzNlQoPBGYoW2YkFi6W1iaFLD4qU=";
+  };
+
+  postPatch = ''
+    substituteInPlace sphinxcontrib/tikz.py \
+      --replace "config.latex_engine" "'${texLive}/bin/pdflatex'" \
+      --replace "system(['pdf2svg'" "system(['${pdf2svg}/bin/pdf2svg'"
+  '';
+
+  propagatedBuildInputs = [ sphinx ];
+
+  # no tests in package
+  doCheck = false;
+
+  pythonImportsCheck = [ "sphinxcontrib.tikz" ];
+
+  meta = with lib; {
+    description = "TikZ extension for Sphinx";
+    homepage = "https://bitbucket.org/philexander/tikz";
+    maintainers = with maintainers; [ costrouc ];
+    license = licenses.bsd3;
+  };
+
+}
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..45027ba15c43
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-websupport/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, sphinxcontrib-serializinghtml
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "sphinxcontrib-websupport";
+  version = "1.2.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "4edf0223a0685a7c485ae5a156b6f529ba1ee481a1417817935b20bde1956232";
+  };
+
+  propagatedBuildInputs = [ six sphinxcontrib-serializinghtml ];
+
+  doCheck = false;
+
+  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_httpdomain/default.nix b/nixpkgs/pkgs/development/python-modules/sphinxcontrib_httpdomain/default.nix
new file mode 100644
index 000000000000..75e6dc8a61b2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib_httpdomain/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, sphinx
+}:
+
+buildPythonPackage rec {
+  pname = "sphinxcontrib-httpdomain";
+  version = "1.8.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "2059cfabd0cca8fcc3455cc8ffad92f0915a7d3bb03bfddba078a6a0f35beec5";
+  };
+
+  propagatedBuildInputs = [ sphinx ];
+
+  # Check is disabled due to this issue:
+  # https://bitbucket.org/pypa/setuptools/issue/137/typeerror-unorderable-types-str-nonetype
+  doCheck = false;
+
+  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_newsfeed/default.nix b/nixpkgs/pkgs/development/python-modules/sphinxcontrib_newsfeed/default.nix
new file mode 100644
index 000000000000..a298025f8ba3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib_newsfeed/default.nix
@@ -0,0 +1,24 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, sphinx
+}:
+
+buildPythonPackage rec {
+  pname = "sphinxcontrib-newsfeed";
+  version = "0.1.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1d7gam3mn8v4in4p16yn3v10vps7nnaz6ilw99j4klij39dqd37p";
+  };
+
+  propagatedBuildInputs = [ sphinx ];
+
+  meta = with lib; {
+    description = "Extension for adding a simple Blog, News or Announcements section to a Sphinx website";
+    homepage = "https://bitbucket.org/prometheus/sphinxcontrib-newsfeed";
+    license = licenses.bsd2;
+  };
+
+}
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..76e5079e9163
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxext-opengraph/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, sphinx
+, pytestCheckHook
+, beautifulsoup4
+}:
+
+buildPythonPackage rec {
+  pname = "sphinxext-opengraph";
+  version = "0.6.3";
+
+  src = fetchFromGitHub {
+    owner = "wpilibsuite";
+    repo = "sphinxext-opengraph";
+    rev = "v${version}";
+    sha256 = "sha256-YR6TlsmND5IhLdbPbmtVhRN2vSZfx70g2a6Yn6y6L/M=";
+  };
+
+  propagatedBuildInputs = [
+    sphinx
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    beautifulsoup4
+  ];
+
+  pythonImportsCheck = [ "sphinxext.opengraph" ];
+
+  meta = with lib; {
+    description = "Sphinx extension to generate unique OpenGraph metadata";
+    homepage = "https://github.com/wpilibsuite/sphinxext-opengraph";
+    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..82007997ccb8
--- /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;
+    sha256 = "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..90ca839bc1e0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/spidev/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "spidev";
+  version = "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "03cicc9kpi5khhq0bl4dcy8cjcl2j488mylp8sna47hnkwl5qzwa";
+  };
+
+  # 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..d4fef974fc01
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/splinter/default.nix
@@ -0,0 +1,73 @@
+{ lib
+, buildPythonPackage
+, isPy27
+, fetchFromGitHub
+, selenium
+, cssselect
+, django
+, flask
+, lxml
+, pytestCheckHook
+, zope-testbrowser
+}:
+
+buildPythonPackage rec {
+  pname = "splinter";
+  version = "0.18.1";
+
+  disabled = isPy27;
+
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "cobrateam";
+    repo = "splinter";
+    rev = "refs/tags/${version}";
+    hash = "sha256-5d39e9omc223ugBfVMIsMZh8+NPVxc6q7p2gwZ0fF0o=";
+  };
+
+  propagatedBuildInputs = [
+    selenium
+  ];
+
+  checkInputs = [
+    cssselect
+    django
+    flask
+    lxml
+    pytestCheckHook
+    zope-testbrowser
+  ];
+
+  disabledTests = [
+    # driver is present and fails with a different error during loading
+    "test_browser_local_driver_not_present"
+    "test_local_driver_not_present"
+  ];
+
+  disabledTestPaths = [
+    "samples"
+    # We run neither Chromium nor Firefox nor ...
+    "tests/test_async_finder.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..8f0b0c13ba8f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/spotipy/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, redis
+, requests
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "spotipy";
+  version = "2.20.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-4mqZt1vi/EI3WytLNV3ET6Hlnvx3OvoXt4ThpMCoGMk=";
+  };
+
+  propagatedBuildInputs = [
+    redis
+    requests
+    six
+  ];
+
+  # tests want to access the spotify API
+  doCheck = false;
+  pythonImportsCheck = [
+    "spotipy"
+    "spotipy.oauth2"
+  ];
+
+  meta = with lib; {
+    homepage = "https://spotipy.readthedocs.org/";
+    changelog = "https://github.com/plamere/spotipy/blob/${version}/CHANGELOG.md";
+    description = "A light weight Python library for the Spotify Web API";
+    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..ce566fb94a89
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/spsdk/default.nix
@@ -0,0 +1,116 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, dos2unix
+, pythonRelaxDepsHook
+, asn1crypto
+, astunparse
+, bincopy
+, bitstring
+, click
+, click-option-group
+, cmsis-pack-manager
+, commentjson
+, crcmod
+, cryptography
+, deepmerge
+, fastjsonschema
+, hexdump
+, jinja2
+, libusbsio
+, oscrypto
+, pycryptodome
+, pylink-square
+, pyocd
+, pypemicro
+, pyserial
+, ruamel-yaml
+, sly
+, pytestCheckHook
+, voluptuous
+}:
+
+buildPythonPackage rec {
+  pname = "spsdk";
+  version = "1.6.3";
+
+  src = fetchFromGitHub {
+    owner = "NXPmicro";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-JMhd2XdbjEN6SUzFgcBHd/dStiuYeXXis6pfijSfUso=";
+  };
+
+  patches = [
+    # https://github.com/NXPmicro/spsdk/pull/43
+    (fetchpatch {
+      name = "cryptography-37-compat.patch";
+      url = "https://github.com/NXPmicro/spsdk/commit/a85b854de1093de593d27fa64de442224ab2e0fd.patch";
+      sha256 = "sha256-4pXV/8RaNuGl7KNdoGD/8YnPQ2ZmUQOjXWA/Yy0Kxu8=";
+    })
+    # https://github.com/NXPmicro/spsdk/pull/41
+    (fetchpatch {
+      name = "blhost-click-8-1-compat.patch";
+      url = "https://github.com/NXPmicro/spsdk/commit/5112b1b69aa681d265035475e73d28ea0c8cb6ab.patch";
+      sha256 = "sha256-Okz6Er6OVuAA5IlB5IabSa/gUSLa+E2Ltd+J3uoIg6o=";
+    })
+  ];
+
+  nativeBuildInputs = [ pythonRelaxDepsHook ];
+  pythonRelaxDeps = [
+    "cmsis-pack-manager"
+    "cryptography"
+    "deepmerge"
+    "jinja2"
+    "pylink-square"
+    "pyocd"
+  ];
+  pythonRemoveDeps = [ "pyocd-pemicro" ];
+
+  propagatedBuildInputs = [
+    asn1crypto
+    astunparse
+    bincopy
+    bitstring
+    click
+    click-option-group
+    cmsis-pack-manager
+    commentjson
+    crcmod
+    cryptography
+    deepmerge
+    fastjsonschema
+    hexdump
+    jinja2
+    libusbsio
+    oscrypto
+    pycryptodome
+    pylink-square
+    pyocd
+    pypemicro
+    pyserial
+    ruamel-yaml
+    sly
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    voluptuous
+  ];
+
+  disabledTests = [
+    # tests also fail on debian, so presumable they are broken
+    "test_elftosb_mbi_signed"
+    "test_elftosb_sb31"
+  ];
+
+  pythonImportsCheck = [ "spsdk" ];
+
+  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/spur/default.nix b/nixpkgs/pkgs/development/python-modules/spur/default.nix
new file mode 100644
index 000000000000..24bdc5839a47
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/spur/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, paramiko
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "spur";
+  version = "0.3.22";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.4";
+
+  src = fetchFromGitHub {
+    owner = "mwilliamson";
+    repo = "spur.py";
+    rev = version;
+    sha256 = "sha256-YlwezAE7V4ykFsp+bJ2nYRp6HG4I9Bk7Lhq6f1Inn0s=";
+  };
+
+  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";
+    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..3742d15b356a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/spyder-kernels/default.nix
@@ -0,0 +1,36 @@
+{ lib, buildPythonPackage, fetchPypi, cloudpickle, ipykernel, wurlitzer,
+  jupyter-client, pyzmq }:
+
+buildPythonPackage rec {
+  pname = "spyder-kernels";
+  version = "2.3.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-urI7Ak25NZzsUYLiR+cIdfcd3ECoJx/RNT3gj0QPJtw=";
+  };
+
+  propagatedBuildInputs = [
+    cloudpickle
+    ipykernel
+    wurlitzer
+    jupyter-client
+    pyzmq
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py --replace "ipython>=7.31.1,<8" "ipython"
+  '';
+
+  # No tests
+  doCheck = false;
+
+  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/master/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..edcee3fe9323
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/spyder/default.nix
@@ -0,0 +1,153 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, makeDesktopItem
+, atomicwrites
+, chardet
+, cloudpickle
+, cookiecutter
+, diff-match-patch
+, flake8
+, intervaltree
+, jedi
+, jellyfish
+, keyring
+, matplotlib
+, mccabe
+, nbconvert
+, numpy
+, numpydoc
+, psutil
+, pygments
+, pylint
+, pyls-spyder
+, pyopengl
+, pyqtwebengine
+, python-lsp-black
+, python-lsp-server
+, pyxdg
+, pyzmq
+, pycodestyle
+, qdarkstyle
+, qstylizer
+, qtawesome
+, qtconsole
+, qtpy
+, rope
+, Rtree
+, scipy
+, spyder-kernels
+, textdistance
+, three-merge
+, watchdog
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "spyder";
+  version = "5.3.2";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-KJkamNMXr4Mi9Y6B7aKExoiqWKoExCFlELChCrQL6mQ=";
+  };
+
+  nativeBuildInputs = [ pyqtwebengine.wrapQtAppsHook ];
+
+  propagatedBuildInputs = [
+    atomicwrites
+    chardet
+    cloudpickle
+    cookiecutter
+    diff-match-patch
+    flake8
+    intervaltree
+    jedi
+    jellyfish
+    keyring
+    matplotlib
+    mccabe
+    nbconvert
+    numpy
+    numpydoc
+    psutil
+    pygments
+    pylint
+    pyls-spyder
+    pyopengl
+    pyqtwebengine
+    python-lsp-black
+    python-lsp-server
+    pyxdg
+    pyzmq
+    pycodestyle
+    qdarkstyle
+    qstylizer
+    qtawesome
+    qtconsole
+    qtpy
+    rope
+    Rtree
+    scipy
+    spyder-kernels
+    textdistance
+    three-merge
+    watchdog
+  ];
+
+  # There is no test for spyder
+  doCheck = false;
+
+  desktopItem = makeDesktopItem {
+    name = "Spyder";
+    exec = "spyder";
+    icon = "spyder";
+    comment = "Scientific Python Development Environment";
+    desktopName = "Spyder";
+    genericName = "Python IDE";
+    categories = [ "Development" "IDE" ];
+  };
+
+  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 "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"
+
+    # Create desktop item
+    mkdir -p $out/share/icons
+    cp spyder/images/spyder.svg $out/share/icons
+    cp -r $desktopItem/share/applications/ $out/share
+  '';
+
+  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;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ gebner ];
+  };
+}
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..bd73edc61e70
--- /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";
+      sha256 = "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/sqlalchemy-citext/default.nix b/nixpkgs/pkgs/development/python-modules/sqlalchemy-citext/default.nix
new file mode 100644
index 000000000000..9ec70d67f864
--- /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 = [ maintainers.costrouc ];
+  };
+}
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..d0970d4277d8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sqlalchemy-continuum/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, flask
+, flask_login
+, flask-sqlalchemy
+, flexmock
+, pytestCheckHook
+, sqlalchemy
+, sqlalchemy-utils
+, sqlalchemy-i18n
+}:
+
+buildPythonPackage rec {
+  pname = "SQLAlchemy-Continuum";
+  version = "1.3.12";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "rlHl59MAQhsicMtZQT9rv1iQrDyVYJlawtyhvFaAM7o=";
+  };
+
+  propagatedBuildInputs = [
+    sqlalchemy
+    sqlalchemy-utils
+  ];
+
+  # indicate tests that we don't have a database server at hand
+  DB = "sqlite";
+
+  checkInputs = [
+    pytestCheckHook
+    sqlalchemy-i18n
+    flask
+    flask_login
+    flask-sqlalchemy
+    flexmock
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/kvesteri/sqlalchemy-continuum/";
+    description = "Versioning and auditing extension for SQLAlchemy";
+    license = licenses.bsd3;
+  };
+}
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..83d813b3dbd9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sqlalchemy-i18n/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, sqlalchemy
+, sqlalchemy-utils
+}:
+
+buildPythonPackage rec {
+  pname = "SQLAlchemy-i18n";
+  version = "1.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "de33376483a581ca14218d8f57a114466c5f72b674a95839b6c4564a6e67796f";
+  };
+
+  propagatedBuildInputs = [
+    sqlalchemy
+    sqlalchemy-utils
+  ];
+
+  # 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..54962387967d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sqlalchemy-jsonfield/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, sqlalchemy
+, setuptools-scm
+, setuptools
+, tox
+, sphinx
+, pytest
+, pytest-cov
+, pytest-html
+, pytest-sugar
+, coverage
+, pymysql
+, psycopg2 }:
+
+buildPythonPackage rec {
+  pname = "sqlalchemy-jsonfield";
+  version = "1.0.0";
+
+  src = fetchFromGitHub {
+    owner = "penguinolog";
+    repo = "sqlalchemy_jsonfield";
+    rev = version;
+    sha256 = "015pl4z84spfw8389hk1szlm37jgw2basvbmzmkacdqi0685zx24";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = "v${version}";
+
+  nativeBuildInputs = [ setuptools-scm ];
+  propagatedBuildInputs = [ sqlalchemy setuptools ];
+  checkInputs = [ tox sphinx pytest pytest-cov pytest-html pytest-sugar coverage pymysql psycopg2 ];
+
+  checkPhase = ''
+    TOX_TESTENV_PASSENV="PYTHONPATH SETUPTOOLS_SCM_PRETEND_VERSION" tox -e functional
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/penguinolog/sqlalchemy_jsonfield";
+    description = "SQLALchemy JSONField implementation for storing dicts at SQL independently from JSON type support";
+    license = licenses.asl20;
+    maintainers = [ 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..bfae1d7b3b9d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sqlalchemy-migrate/default.nix
@@ -0,0 +1,55 @@
+{ 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";
+  };
+
+  # See: https://review.openstack.org/#/c/608382/
+  patches = [
+    (fetchpatch {
+      url = "https://github.com/openstack/sqlalchemy-migrate/pull/18.patch";
+      sha256 = "1qyfq2m7w7xqf0r9bc2x42qcra4r9k9l9g1jy5j0fvlb6bvvjj07";
+    })
+  ];
+
+  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" ""
+  '';
+
+  checkInputs = [ 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 ]);
+  };
+}
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..c979fc58b196
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sqlalchemy-mixins/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, nose
+, pytestCheckHook
+, pythonOlder
+, six
+, sqlalchemy
+}:
+
+buildPythonPackage rec {
+  pname = "sqlalchemy-mixins";
+  version = "1.5.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "absent1706";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-GmMxya6aJ7MMqQ3KSqO3f/cbwgWvQYhEVXtGi6fhP1M=";
+  };
+
+  propagatedBuildInputs = [
+    six
+    sqlalchemy
+  ];
+
+  checkInputs = [
+    nose
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "sqlalchemy_mixins"
+  ];
+
+  meta = with lib; {
+    description = "Python mixins for SQLAlchemy ORM";
+    homepage = "https://github.com/absent1706/sqlalchemy-mixins";
+    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..49bba2811312
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sqlalchemy-utils/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, six
+, sqlalchemy
+, colour
+, flexmock
+, jinja2
+, mock
+, pg8000
+, phonenumbers
+, pygments
+, pymysql
+, pytestCheckHook
+, python-dateutil
+}:
+
+buildPythonPackage rec {
+  pname = "sqlalchemy-utils";
+  version = "0.38.3";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "SQLAlchemy-Utils";
+    sha256 = "sha256-n5r7pgekBFXPcDrfqYRlhL8mFooMWmCnAGO3DWUFH00=";
+  };
+
+  patches = [
+    # We don't run MySQL, MSSQL, or PostgreSQL
+    ./skip-database-tests.patch
+  ];
+
+  propagatedBuildInputs = [
+    six
+    sqlalchemy
+  ];
+
+  checkInputs = [
+    colour
+    flexmock
+    jinja2
+    mock
+    pg8000
+    phonenumbers
+    pygments
+    pymysql
+    pytestCheckHook
+    python-dateutil
+  ];
+
+  disabledTests = [
+    "test_literal_bind"
+  ];
+
+  meta = with lib; {
+    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..79aa12f03d99
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sqlalchemy-utils/skip-database-tests.patch
@@ -0,0 +1,100 @@
+diff --git a/conftest.py b/conftest.py
+index 9e146cd..8dbc9a5 100644
+--- a/conftest.py
++++ b/conftest.py
+@@ -61,17 +61,12 @@ def mysql_db_user():
+ 
+ @pytest.fixture
+ def postgresql_dsn(postgresql_db_user, postgresql_db_password, postgresql_db_host,
+                    db_name):
+-    return 'postgresql://{0}:{1}@{2}/{3}'.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 'mysql+pymysql://{0}@localhost/{1}'.format(mysql_db_user, db_name)
++    pytest.skip()
+ 
+ 
+ @pytest.fixture
+@@ -108,8 +104,7 @@ def mssql_db_driver():
+ 
+ @pytest.fixture
+ def mssql_dsn(mssql_db_user, mssql_db_password, mssql_db_driver, db_name):
+-    return 'mssql+pyodbc://{0}:{1}@localhost/{2}?driver={3}'\
+-        .format(mssql_db_user, mssql_db_password, db_name, mssql_db_driver)
++    pytest.skip()
+ 
+ 
+ @pytest.fixture
+diff --git a/tests/functions/test_database.py b/tests/functions/test_database.py
+index 0ad6721..83f208d 100644
+--- a/tests/functions/test_database.py
++++ b/tests/functions/test_database.py
+@@ -76,28 +76,6 @@ class TestDatabasePostgres(DatabaseTest):
+                 "TEMPLATE my_template") in str(excinfo.value)
+ 
+ 
+-class TestDatabasePostgresPg8000(DatabaseTest):
+-
+-    @pytest.fixture
+-    def dsn(self, postgresql_db_user, postgresql_db_password):
+-        return 'postgresql+pg8000://{0}:{1}@localhost/{2}'.format(
+-            postgresql_db_user,
+-            postgresql_db_password,
+-            'db_to_test_create_and_drop_via_pg8000_driver'
+-        )
+-
+-
+-class TestDatabasePostgresPsycoPG2CFFI(DatabaseTest):
+-
+-    @pytest.fixture
+-    def dsn(self, postgresql_db_user, postgresql_db_password):
+-        return 'postgresql+psycopg2cffi://{0}:{1}@localhost/{2}'.format(
+-            postgresql_db_user,
+-            postgresql_db_password,
+-            'db_to_test_create_and_drop_via_psycopg2cffi_driver'
+-        )
+-
+-
+ @pytest.mark.usefixtures('postgresql_dsn')
+ class TestDatabasePostgresWithQuotedName(DatabaseTest):
+ 
+@@ -116,31 +94,6 @@ class TestDatabasePostgresWithQuotedName(DatabaseTest):
+                 'TEMPLATE "my-template"') in str(excinfo.value)
+ 
+ 
+-class TestDatabasePostgresCreateDatabaseCloseConnection:
+-    def test_create_database_twice(
+-        self,
+-        postgresql_db_user,
+-        postgresql_db_password
+-    ):
+-        dsn_list = [
+-            'postgresql://{0}:{1}@localhost/db_test_sqlalchemy-util-a'.format(
+-                postgresql_db_user,
+-                postgresql_db_password
+-            ),
+-            'postgresql://{0}:{1}@localhost/db_test_sqlalchemy-util-b'.format(
+-                postgresql_db_user,
+-                postgresql_db_password
+-            ),
+-        ]
+-        for dsn_item in dsn_list:
+-            assert not database_exists(dsn_item)
+-            create_database(dsn_item, template="template1")
+-            assert database_exists(dsn_item)
+-        for dsn_item in dsn_list:
+-            drop_database(dsn_item)
+-            assert not database_exists(dsn_item)
+-
+-
+ @pytest.mark.usefixtures('mssql_dsn')
+ class TestDatabaseMssql(DatabaseTest):
+ 
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..5c467e2f905b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sqlalchemy/default.nix
@@ -0,0 +1,49 @@
+{ stdenv
+, lib
+, fetchPypi
+, buildPythonPackage
+, isPy3k
+, pythonOlder
+, greenlet
+, importlib-metadata
+, mock
+, pysqlite ? null
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "SQLAlchemy";
+  version = "1.4.39";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-gZSJYDh1O0awigsK6JpdgMiX+2Ad1R4kPtVyDx8VXSc=";
+  };
+
+  propagatedBuildInputs = [
+    greenlet
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    mock
+  ] ++ lib.optional (!isPy3k) pysqlite;
+
+  postInstall = ''
+    sed -e 's:--max-worker-restart=5::g' -i setup.cfg
+  '';
+
+  # disable mem-usage tests on mac, has trouble serializing pickle files
+  disabledTests = lib.optionals stdenv.isDarwin [
+    "MemUsageWBackendTest"
+    "MemUsageTest"
+  ];
+
+  meta = with lib; {
+    homepage = "http://www.sqlalchemy.org/";
+    description = "A Python SQL toolkit and Object Relational Mapper";
+    license = licenses.mit;
+  };
+}
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..4342eb6e206a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sqlite-fts4/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, isPy3k
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "sqlite-fts4";
+  version = "1.0.1";
+  disabled = !isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "simonw";
+    repo = pname;
+    rev = version;
+    sha256 = "15r1mijk306fpm61viry5wjhqyxlbqqdk4nfcd901qarx7vqypgy";
+  };
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  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-utils/default.nix b/nixpkgs/pkgs/development/python-modules/sqlite-utils/default.nix
new file mode 100644
index 000000000000..fccbc4affab6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sqlite-utils/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, pythonOlder
+, click
+, click-default-group
+, python-dateutil
+, sqlite-fts4
+, tabulate
+, pytestCheckHook
+, hypothesis
+}:
+
+buildPythonPackage rec {
+  pname = "sqlite-utils";
+  version = "3.28";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-eQsB9L4WwydWubXq4HtrfJBbZhPKU41kaHfFCwWwpTo=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "click-default-group-wheel" "click-default-group"
+  '';
+
+  propagatedBuildInputs = [
+    click
+    click-default-group
+    python-dateutil
+    sqlite-fts4
+    tabulate
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    hypothesis
+  ];
+
+  pythonImportsCheck = [
+    "sqlite_utils"
+  ];
+
+  meta = with lib; {
+    description = "Python CLI utility and library for manipulating SQLite databases";
+    homepage = "https://github.com/simonw/sqlite-utils";
+    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..5634eb41601a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sqlitedict/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "sqlitedict";
+  version = "2.0.0";
+
+  src = fetchFromGitHub {
+    owner = "RaRe-Technologies";
+    repo = "sqlitedict";
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-8dmGn5h3NigCdDtnDYjpjntRpyjk7ivRp1B8x8nUgpE=";
+  };
+
+  preCheck = ''
+    mkdir tests/db
+  '';
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  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..d3a8e39d48ea
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sqlmap/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, file
+, stdenv
+}:
+
+buildPythonPackage rec {
+  pname = "sqlmap";
+  version = "1.6.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-OWIuYAms4SXQXVr0Wx8y7pne13IBclfq0P3VTy91Kz8=";
+  };
+
+  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/sqlobject/default.nix b/nixpkgs/pkgs/development/python-modules/sqlobject/default.nix
new file mode 100644
index 000000000000..817ba2dfc706
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sqlobject/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, FormEncode
+, pastedeploy
+, paste
+, pydispatcher
+}:
+
+buildPythonPackage rec {
+  pname = "sqlobject";
+  version = "3.9.1";
+  format = "setuptools";
+
+  src = fetchPypi {
+    pname = "SQLObject";
+    inherit version;
+    sha256 = "45064184decf7f42d386704e5f47a70dee517d3e449b610506e174025f84d921";
+  };
+
+  propagatedBuildInputs = [
+    FormEncode
+    paste
+    pastedeploy
+    pydispatcher
+  ];
+
+  checkInputs = [
+    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 = "http://www.sqlobject.org/";
+    license = licenses.lgpl21;
+    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..29e92cdecb93
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sqlparse/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, installShellFiles
+, pytestCheckHook
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "sqlparse";
+  version = "0.4.2";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0c00730c74263a94e5a9919ade150dfc3b19c574389985446148402998287dae";
+  };
+
+  nativeBuildInputs = [ installShellFiles ];
+
+  checkInputs = [ pytestCheckHook ];
+
+  postInstall = ''
+    installManPage docs/sqlformat.1
+  '';
+
+  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..df1f988a03eb
--- /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 ];
+  checkInputs = [ 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 = [ maintainers.globin ];
+    broken = true; # incompatible with sqlalchemy>=1.4 and unmaintained since 2016
+  };
+}
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..13820a236346
--- /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.19";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-SOZT6MP1kJCbpAcwbrLoRgosfR+GxWvOWc9Cr1T/XSo=";
+  };
+
+  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..d0ac3602445d
--- /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
+  ];
+
+  checkInputs = [
+    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..a4022574f11e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/srptools/default.nix
@@ -0,0 +1,22 @@
+{ lib, buildPythonPackage, fetchPypi, six, pytest, pytest-runner }:
+
+buildPythonPackage rec {
+  pname = "srptools";
+  version = "1.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "7fa4337256a1542e8f5bb4bed19e1d9aea98fe5ff9baf76693342a1dd6ac7c96";
+  };
+
+  propagatedBuildInputs = [ six ];
+
+  checkInputs = [ pytest pytest-runner ];
+
+  meta = with lib; {
+    description = "Python-Tools to implement Secure Remote Password (SRP) authentication";
+    homepage = "https://github.com/idlesign/srptools";
+    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..5108f9ea5eaa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/srsly/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, cython
+, catalogue
+, mock
+, numpy
+, pytest
+, ruamel-yaml
+}:
+
+buildPythonPackage rec {
+  pname = "srsly";
+  version = "2.4.4";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-6KBlgWJ7ZxLxnGAkG3wUwrspzobvBPeRN5p58bJJoSg=";
+  };
+
+  nativeBuildInputs = [ cython ];
+
+  propagatedBuildInputs = [ catalogue ];
+
+  checkInputs = [
+    mock
+    numpy
+    pytest
+    ruamel-yaml
+  ];
+
+  pythonImportsCheck = [ "srsly" ];
+
+  meta = with lib; {
+    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..b6a5f4df097d
--- /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.2";
+
+  disabled = pythonOlder "2.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "7aa4ad5ce4126d3f53b3e7bc4edaa86653d0378bf1c0b1ab8c59f5ab41384450";
+  };
+
+  checkInputs = [
+    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..11f31c06550f
--- /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}";
+    sha256 = "sha256-iXbi25HsoNX0hnhwZoFik5ddlJ7i+xml3HGaezj3jgY=";
+  };
+
+  propagatedBuildInputs = [
+    dnspython
+  ];
+
+  checkInputs = [
+    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..6ad339a083f5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ssdeep/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, cffi
+, fetchFromGitHub
+, pytestCheckHook
+, six
+, ssdeep
+}:
+
+buildPythonPackage rec {
+  pname = "ssdeep";
+  version = "3.4";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "DinoTools";
+    repo = "python-ssdeep";
+    rev = version;
+    hash = "sha256-eAB4/HmPGj/ngHrqkOlY/kTdY5iUEBHxrsRYjR/RNyw=";
+  };
+
+  buildInputs = [
+    ssdeep
+  ];
+
+  propagatedBuildInputs = [
+    cffi
+    six
+  ];
+
+
+  checkInputs = [
+    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";
+    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..bd73a6abaead
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ssdp/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pbr
+, pytestCheckHook
+, pythonOlder
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "ssdp";
+  version = "1.1.0";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "codingjoe";
+    repo = pname;
+    rev = version;
+    sha256 = "19d2b5frpq2qkfkpz173wpjk5jwhkjpk75p8q92nm8iv41nrzljy";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  buildInputs = [
+    pbr
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "pytest-runner" "" \
+      --replace "--cov=ssdp" ""
+  '';
+
+  pythonImportsCheck = [ "ssdp" ];
+
+  meta = with lib; {
+    description = "Python asyncio library for Simple Service Discovery Protocol (SSDP)";
+    homepage = "https://github.com/codingjoe/ssdp";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..54dfdd9d9498
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sseclient-py/default.nix
@@ -0,0 +1,25 @@
+{ buildPythonPackage, fetchFromGitHub, lib, python }:
+
+buildPythonPackage rec {
+  pname = "sseclient-py";
+  version = "1.7.2";
+
+  src = fetchFromGitHub {
+    owner = "mpetazzoni";
+    repo = "sseclient";
+    rev = "sseclient-py-${version}";
+    sha256 = "096spyv50jir81xiwkg9l88ycp1897d3443r6gi1by8nkp4chvix";
+  };
+
+  # based on tox.ini
+  checkPhase = ''
+    ${python.interpreter} tests/unittests.py
+  '';
+
+  meta = with lib; {
+    description = "Pure-Python Server Side Events (SSE) client";
+    homepage = "https://github.com/mpetazzoni/sseclient";
+    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..a9fdfe2050e2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sseclient/default.nix
@@ -0,0 +1,29 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27
+, requests, six
+, backports_unittest-mock, pytestCheckHook, pytest-runner }:
+
+buildPythonPackage rec {
+  pname = "sseclient";
+  version = "0.0.27";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b2fe534dcb33b1d3faad13d60c5a7c718e28f85987f2a034ecf5ec279918c11c";
+  };
+
+  propagatedBuildInputs = [ requests six ];
+
+  # some tests use python3 strings
+  doCheck = !isPy27;
+  checkInputs = [ backports_unittest-mock pytestCheckHook pytest-runner ];
+
+  # tries to open connection to wikipedia
+  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/ssh-mitm/default.nix b/nixpkgs/pkgs/development/python-modules/ssh-mitm/default.nix
new file mode 100644
index 000000000000..ea2aa9531c59
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ssh-mitm/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, colored
+, enhancements
+, packaging
+, paramiko
+, pytz
+, pyyaml
+, requests
+, rich
+, sshpubkeys
+, typeguard
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "ssh-mitm";
+  version = "2.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-DMXzDgSt1p3ZNGrXnSr79KH33SJNN8U4/94Hoz7Rs+I=";
+  };
+
+  propagatedBuildInputs = [
+    colored
+    enhancements
+    packaging
+    paramiko
+    pytz
+    pyyaml
+    requests
+    rich
+    sshpubkeys
+    typeguard
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "sshmitm"
+  ];
+
+  meta = with lib; {
+    description = "Tool for SSH security audits";
+    homepage = "https://github.com/ssh-mitm/ssh-mitm";
+    license = licenses.lgpl3Only;
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..3c53864ec332
--- /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;
+    sha256 = "sha256-58sOp3Tbgb+RhE2yLecqQKro97D5u5ug9mbUdO9r+fw=";
+  };
+
+  propagatedBuildInputs = [ paramiko ];
+
+  checkInputs = [ 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..7f319333cac8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/stack-data/default.nix
@@ -0,0 +1,66 @@
+{ 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}";
+    sha256 = "sha256-brXFrk1UU5hxCVeRvGK7wzRA0Hoj9fgqoxTIwInPrEc=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    git
+    setuptools-scm
+    toml
+  ];
+
+  propagatedBuildInputs = [
+    asttokens
+    executing
+    pure-eval
+  ];
+
+  checkInputs = [
+    cython
+    littleutils
+    pygments
+    pytestCheckHook
+    typeguard
+  ];
+
+  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/stanza/default.nix b/nixpkgs/pkgs/development/python-modules/stanza/default.nix
new file mode 100644
index 000000000000..808f90f22450
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/stanza/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, emoji
+, numpy
+, protobuf
+, requests
+, six
+, pytorch
+, tqdm
+}:
+
+buildPythonPackage rec {
+  pname = "stanza";
+  version = "1.4.0";
+
+  src = fetchFromGitHub {
+    owner = "stanfordnlp";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-EAES3UpJqE7wmvCPycFhwI1lMrReN+L6W8CEDwdHTlA=";
+  };
+
+  disabled = pythonOlder "3.6";
+
+  propagatedBuildInputs = [
+    emoji
+    numpy
+    protobuf
+    requests
+    six
+    pytorch
+    tqdm
+  ];
+
+  # disabled, because the tests try to connect to the internet which
+  # is forbidden in the sandbox
+  doCheck = false;
+
+  pythonImportsCheck = [ "stanza" ];
+
+  meta = with lib; {
+    description = "Official Stanford NLP Python Library for Many Human Languages";
+    homepage = "https://github.com/stanfordnlp/stanza/";
+    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..25b7d0aa3c74
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/starkbank-ecdsa/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "starkbank-ecdsa";
+  version = "2.0.3";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "starkbank";
+    repo = "ecdsa-python";
+    rev = "v${version}";
+    sha256 = "sha256-UA+UuSxKZZN7Zb23HWsCD6UZK6lROpy3OfLN7MAlMM0=";
+  };
+
+  checkInputs = [
+    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..d1e8f789fc38
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/starlette/default.nix
@@ -0,0 +1,81 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, aiofiles
+, anyio
+, contextlib2
+, itsdangerous
+, jinja2
+, python-multipart
+, pyyaml
+, requests
+, aiosqlite
+, databases
+, pytestCheckHook
+, pythonOlder
+, trio
+, typing-extensions
+, ApplicationServices
+}:
+
+buildPythonPackage rec {
+  pname = "starlette";
+  version = "0.20.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "encode";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-vP2TJPn9lRGnLGkO8lUmnsoT6rSnhuWDD3WqNk76SM0=";
+  };
+
+  postPatch = ''
+    # remove coverage arguments to pytest
+    sed -i '/--cov/d' setup.cfg
+  '';
+
+  propagatedBuildInputs = [
+    aiofiles
+    anyio
+    itsdangerous
+    jinja2
+    python-multipart
+    pyyaml
+    requests
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    typing-extensions
+  ] ++ lib.optionals (pythonOlder "3.7") [
+    contextlib2
+  ] ++ lib.optional stdenv.isDarwin [
+    ApplicationServices
+  ];
+
+  checkInputs = [
+    aiosqlite
+    databases
+    pytestCheckHook
+    trio
+    typing-extensions
+  ];
+
+  disabledTests = [
+    # asserts fail due to inclusion of br in Accept-Encoding
+    "test_websocket_headers"
+    "test_request_headers"
+  ];
+
+  pythonImportsCheck = [
+    "starlette"
+  ];
+
+  meta = with lib; {
+    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/staticjinja/default.nix b/nixpkgs/pkgs/development/python-modules/staticjinja/default.nix
new file mode 100644
index 000000000000..e8621d8e954d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/staticjinja/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, poetry-core
+, docopt-ng
+, easywatch
+, jinja2
+, pytestCheckHook
+, pytest-check
+, pythonOlder
+, markdown
+, testers
+, tomlkit
+, staticjinja
+, callPackage
+}:
+
+buildPythonPackage rec {
+  pname = "staticjinja";
+  version = "4.1.3";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  # No tests in pypi
+  src = fetchFromGitHub {
+    owner = "staticjinja";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-w6ge5MQXNRHCM43jKnagTlbquJJys7mprgBOS2uuwHQ=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    jinja2
+    docopt-ng
+    easywatch
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    pytest-check
+    markdown
+    tomlkit
+  ];
+
+  # 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/statistics/default.nix b/nixpkgs/pkgs/development/python-modules/statistics/default.nix
new file mode 100644
index 000000000000..283954c838ba
--- /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; [ costrouc ];
+  };
+}
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..50e93eeac9b6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/statmake/default.nix
@@ -0,0 +1,71 @@
+{ lib
+, attrs
+, buildPythonPackage
+, cattrs
+, exceptiongroup
+, fetchFromGitHub
+, fonttools
+, fs
+, importlib-metadata
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+, ufo2ft
+, ufoLib2
+}:
+
+buildPythonPackage rec {
+  pname = "statmake";
+  version = "0.5.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "daltonmaag";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-BpxjAr65ZQEJ0PSUIPtS78UvJbMG91qkV8py2K/+W2E=";
+  };
+
+  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
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    ufo2ft
+    ufoLib2
+  ];
+
+  postPatch = ''
+    # https://github.com/daltonmaag/statmake/pull/41
+    substituteInPlace pyproject.toml \
+      --replace 'requires = ["poetry>=1.0.0"]' 'requires = ["poetry-core"]' \
+      --replace 'build-backend = "poetry.masonry.api"' 'build-backend = "poetry.core.masonry.api"' \
+      --replace 'cattrs = "^1.1"' 'cattrs = ">= 1.1"'
+  '';
+
+  pythonImportsCheck = [
+    "statmake"
+  ];
+
+  meta = with lib; {
+    description = "Applies STAT information from a Stylespace to a variable font";
+    homepage = "https://github.com/daltonmaag/statmake";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jtojnar ];
+  };
+}
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..da455c02d670
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/statsd/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nose
+, mock
+}:
+
+buildPythonPackage rec {
+  pname = "statsd";
+  version = "3.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "07yxnlalvcglgwa9pjs1clwrmwx7a4575jai7q05jz3g4i6dprp3";
+  };
+
+  checkInputs = [ 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..0f01870c41b4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/statsmodels/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, nose
+, numpy
+, scipy
+, pandas
+, patsy
+, cython
+, matplotlib
+}:
+
+buildPythonPackage rec {
+  pname = "statsmodels";
+  version = "0.13.2";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-d9wpLJk5wDakdvF3D50Il2sFQ32qIpko2nMjEUfN59Q=";
+  };
+
+  nativeBuildInputs = [ cython ];
+  checkInputs = [ nose ];
+  propagatedBuildInputs = [ numpy scipy pandas patsy matplotlib ];
+
+  # Huge test suites with several test failures
+  doCheck = false;
+  pythonImportsCheck = [ "statsmodels" ];
+
+  meta = {
+    description = "Statistical computations and models for use with SciPy";
+    homepage = "https://www.github.com/statsmodels/statsmodels";
+    license = lib.licenses.bsd3;
+    maintainers = with lib.maintainers; [ fridh ];
+  };
+}
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..fb46ee24cd50
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/stdlib-list/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, isPy27
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "stdlib-list";
+  version = "0.8.0";
+  format = "setuptools";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "17vdn4q0sdlndc2fr9svapxx6366hnrhkn0fswp1xmr0jxqh7rd1";
+  };
+
+  pythonImportsCheck = [
+    "stdlib_list"
+  ];
+
+  # tests see mismatches to our standard library
+  doCheck = false;
+
+  meta = with lib; {
+    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/steamodd/default.nix b/nixpkgs/pkgs/development/python-modules/steamodd/default.nix
new file mode 100644
index 000000000000..7db250e5ac33
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/steamodd/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "steamodd";
+  version = "4.23";
+
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b95b288a8249937b9183539eef76563a6b1df286a1db04f25141e46d8814eae9";
+  };
+
+  # 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/stem/default.nix b/nixpkgs/pkgs/development/python-modules/stem/default.nix
new file mode 100644
index 000000000000..9ad5e2285ffb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/stem/default.nix
@@ -0,0 +1,32 @@
+{ lib, buildPythonPackage, fetchPypi, python, mock }:
+
+buildPythonPackage rec {
+  pname = "stem";
+  version = "1.8.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1hk8alc0r4m669ggngdfvryndd0fbx0w62sclcmg55af4ak8xd50";
+  };
+
+  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
+  '';
+
+  checkInputs = [ 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://stem.torproject.org/";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ ];
+  };
+}
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..2071d20a75f8
--- /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 = "3.2.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-wj7nq0QSKNiDZZBKIk+4RC2gwCifkBz0qUIukpt76c0=";
+  };
+
+  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..35fd1ce71a20
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/stestr/tests.nix
@@ -0,0 +1,28 @@
+{  buildPythonPackage
+, stestr
+}:
+
+buildPythonPackage rec {
+  pname = "stestr-tests";
+  inherit (stestr) version;
+
+  src = stestr.src;
+
+  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;
+
+  checkInputs = [
+    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..e7611fc2329e
--- /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 = "4.0.0";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-+CzJmh/1UjENGcN5gnwsZN2fhaOLzVVZ2yRwFhhnt4Y=";
+  };
+
+  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..71d64e1e7bd8
--- /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;
+    sha256 = "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..d17f3f6e34b0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/stim/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, pkgs
+, buildPythonPackage
+, pythonOlder
+, pytestCheckHook
+, pytest-xdist
+, fetchFromGitHub
+, numpy
+, pybind11
+, cirq-core
+, matplotlib
+, networkx
+, scipy
+, 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}";
+    sha256 = "sha256-zXWdJjFkf74FCWxyVMF8dx0P8GmUkuHFxUo5wYNU2o0=";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    pybind11
+  ];
+
+  checkInputs = [
+    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/stm32loader/default.nix b/nixpkgs/pkgs/development/python-modules/stm32loader/default.nix
new file mode 100644
index 000000000000..3e09506ac66b
--- /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 ];
+
+  checkInputs = [ 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..55f74b58fb52
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/stone/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, mock
+, ply
+, pytestCheckHook
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "stone";
+  version = "3.3.1";
+
+  # pypi sdist misses requirements.txt
+  src = fetchFromGitHub {
+    owner = "dropbox";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-0FWdYbv+paVU3Wj6g9OrSNUB0pH8fLwTkhVIBPeFB/U=";
+  };
+
+  postPatch = ''
+    sed -i '/pytest-runner/d' setup.py
+  '';
+
+  propagatedBuildInputs = [ ply six ];
+
+  checkInputs = [ pytestCheckHook mock ];
+
+  # try to import from `test` directory, which is exported by the python interpreter
+  # and cannot be overriden without removing some py3 to py2 support
+  disabledTestPaths = [
+    "test/test_tsd_types.py"
+    "test/test_js_client.py"
+  ];
+  disabledTests = [
+    "test_type_name_with_module"
+  ];
+
+  pythonImportsCheck = [ "stone" ];
+
+  meta = with lib; {
+    description = "Official Api Spec Language for Dropbox";
+    homepage = "https://github.com/dropbox/stone";
+    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..4d504da674c5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/stopit/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+}:
+
+buildPythonPackage rec {
+  pname = "stopit";
+  version = "1.1.2";
+
+  # tests are missing from the PyPi tarball
+  src = fetchFromGitHub {
+    owner = "glenfant";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-uXJUA70JOGWT2NmS6S7fPrTWAJZ0mZ/hICahIUzjfbw=";
+  };
+
+  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/strategies/default.nix b/nixpkgs/pkgs/development/python-modules/strategies/default.nix
new file mode 100644
index 000000000000..2b03ddcf9c94
--- /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 ];
+  checkInputs = [ 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..a06a375be0e5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/stravalib/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nose
+, arrow
+, requests
+, units
+, pytz
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "stravalib";
+  version = "0.10.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "451817c68a11e0c77db9cb628e3c4df0f4806c5a481536598ab3baa1d1c21215";
+  };
+
+  checkInputs = [
+    nose
+  ];
+
+  propagatedBuildInputs = [
+    arrow
+    requests
+    units
+    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/hozn/stravalib";
+    license = licenses.asl20;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..3c84d30ab371
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/strawberry-graphql/default.nix
@@ -0,0 +1,39 @@
+{ lib, buildPythonPackage, fetchFromGitHub, poetry, pythonOlder
+, click, backports-cached-property, graphql-core, pygments, python-dateutil, python-multipart, typing-extensions
+, aiohttp, asgiref, chalice, django, fastapi, flask, pydantic, sanic, starlette, uvicorn
+}:
+
+buildPythonPackage rec {
+  pname = "strawberry-graphql";
+  version = "0.125.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "strawberry-graphql";
+    repo = "strawberry";
+    rev = version;
+    sha256 = "sha256-8ERmG10qNiYg9Zr8oUZk/Uz68sCE+oWrqmJ5kUMqbRo=";
+  };
+
+  nativeBuildInputs = [
+    poetry
+  ];
+
+  propagatedBuildInputs = [
+    click backports-cached-property graphql-core pygments python-dateutil python-multipart typing-extensions
+    aiohttp asgiref chalice django fastapi flask pydantic sanic starlette uvicorn
+  ];
+
+  pythonImportsCheck = [
+    "strawberry"
+  ];
+
+  meta = with lib; {
+    description = "A GraphQL library for Python that leverages type annotations";
+    homepage = "https://strawberry.rocks";
+    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..7d7f00710377
--- /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.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0116a376afc18f3abbf79cc1a4409f81472e19197d5641b9e97e697d105cbdc0";
+  };
+
+  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..acef15b54052
--- /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"],

+-                "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..2f52d4aeb308
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/streaming-form-data/default.nix
@@ -0,0 +1,34 @@
+{ lib, fetchFromGitHub, buildPythonPackage, pythonOlder,
+cython, numpy, pytest, requests-toolbelt }:
+
+buildPythonPackage rec {
+  pname = "streaming-form-data";
+  version = "1.8.1";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "siddhantgoel";
+    repo = "streaming-form-data";
+    rev = "v${version}";
+    sha256 = "1wnak8gwkc42ihgf0g9r7r858hxbqav2xdgqa8azid8v2ff6iq4d";
+  };
+
+  nativeBuildInputs = [ cython ];
+
+  propagatedBuildInputs = [ requests-toolbelt ];
+
+  checkInputs = [ numpy pytest ];
+
+  checkPhase = ''
+    make test
+  '';
+
+  pythonImportsCheck = [ "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..0e864960caba
--- /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;
+    sha256 = "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/streamz/default.nix b/nixpkgs/pkgs/development/python-modules/streamz/default.nix
new file mode 100644
index 000000000000..a4fe702c8c5d
--- /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
+  ];
+
+  checkInputs = [
+    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; [ costrouc ];
+  };
+}
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..d73b60906cc5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/strenum/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "strenum";
+  version = "0.4.8";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "irgeek";
+    repo = "StrEnum";
+    rev = "v${version}";
+    hash = "sha256-S64YfF+cbefXRWoeJK99ZPTiO9DUcDaT77hVQd7pKDk=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace '"pytest-runner"' ""
+    substituteInPlace pytest.ini \
+      --replace " --cov=strenum --cov-report term-missing --black --pylint" ""
+  '';
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "strenum"
+  ];
+
+  meta = with lib; {
+    description = "MOdule for enum that inherits from str";
+    homepage = "https://github.com/irgeek/StrEnum";
+    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..66ed134772d7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/strictyaml/default.nix
@@ -0,0 +1,37 @@
+{ buildPythonPackage
+, lib
+, fetchPypi
+, isPy27
+, ruamel-yaml
+, python-dateutil
+}:
+
+buildPythonPackage rec {
+  version = "1.6.1";
+  pname = "strictyaml";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "688be16ee5d1a2f94aa4abdc6d881e8e254d173d724ac88725955fe66bdb63d4";
+  };
+
+  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/";
+    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/stripe/default.nix b/nixpkgs/pkgs/development/python-modules/stripe/default.nix
new file mode 100644
index 000000000000..494338cdde10
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/stripe/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, requests
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "stripe";
+  version = "4.0.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-0IWz6UUKVVCRL0dsbbsrr6Ep5IXiTW9AR8UJT/CNXeI=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  # 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";
+    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..040985107003
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/striprtf/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "striprtf";
+  version = "0.0.21";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-/wqYbdJ+OI/RTODnKB34e7zADHzCPEX0LkTausqFNtY=";
+  };
+
+  pythonImportsCheck = [
+    "striprtf"
+  ];
+
+  meta = with lib; {
+    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..68d91685c9c2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/structlog/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+, pytest-asyncio
+, pretend
+, freezegun
+, simplejson
+, typing-extensions
+, pythonAtLeast
+}:
+
+buildPythonPackage rec {
+  pname = "structlog";
+  version = "22.1.0";
+  format = "flit";
+
+  src = fetchFromGitHub {
+    owner = "hynek";
+    repo = "structlog";
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-2sdH6iP+l+6pBNC+sjpAX8bCdCANqqkaqZRmR68uwxY=";
+  };
+
+  propagatedBuildInputs = lib.optionals (pythonOlder "3.8") [
+    typing-extensions
+  ];
+
+  pythonImportsCheck = [
+    "structlog"
+  ];
+
+  checkInputs = [
+    freezegun
+    pretend
+    pytest-asyncio
+    pytestCheckHook
+    simplejson
+  ];
+
+  pytestFlagsArray = [
+    "--asyncio-mode=legacy"
+  ];
+
+  meta = with lib; {
+    description = "Painless structural logging";
+    homepage = "https://github.com/hynek/structlog";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
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..190ee6ccfa8a
--- /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.11.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "TDAmeritrade";
+    repo = "stumpy";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-ARpXqZpWkbvIEDVkxA1SwlWoxq+3WO6tvv/e7WZ/25c=";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    scipy
+    numba
+  ];
+
+  checkInputs = [
+    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; [ costrouc ];
+  };
+}
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..97a7d6ebbdda
--- /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";
+
+  checkInputs = [
+    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..8628c83334ba
--- /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
+  ";
+
+  checkInputs = [
+    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..3df2a3e2895b
--- /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
+  '';
+
+  checkInputs = [
+    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..62dec6f348e8
--- /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
+  ];
+
+  checkInputs = [
+    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..e7f6c2805de5
--- /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
+  ";
+
+  checkInputs = [
+    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/default.nix b/nixpkgs/pkgs/development/python-modules/stytra/default.nix
new file mode 100644
index 000000000000..fba544789a81
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/stytra/default.nix
@@ -0,0 +1,83 @@
+{ lib, buildPythonPackage, fetchPypi, isPy3k
+, opencv3
+, pyqt5
+, pyqtgraph
+, numpy
+, scipy
+, numba
+, pandas
+, tables
+, git
+, scikitimage
+, matplotlib
+, qdarkstyle
+, GitPython
+, anytree
+, pims
+, imageio
+, imageio-ffmpeg
+, av
+, nose
+, pytestCheckHook
+, pyserial
+, arrayqueues
+, colorspacious
+, qimage2ndarray
+, flammkuchen
+, lightparam
+}:
+
+buildPythonPackage rec {
+  pname = "stytra";
+  version = "0.8.34";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "aab9d07575ef599a9c0ae505656e3c03ec753462df3c15742f1f768f2b578f0a";
+  };
+
+  # crashes python
+  preCheck = ''
+    rm stytra/tests/test_z_experiments.py
+  '';
+
+  checkInputs = [
+    nose
+    pytestCheckHook
+    pyserial
+  ];
+
+  propagatedBuildInputs = [
+    opencv3
+    pyqt5
+    pyqtgraph
+    numpy
+    scipy
+    numba
+    pandas
+    tables
+    git
+    scikitimage
+    matplotlib
+    qdarkstyle
+    GitPython
+    anytree
+    qimage2ndarray
+    flammkuchen
+    pims
+    colorspacious
+    lightparam
+    imageio
+    imageio-ffmpeg
+    arrayqueues
+    av
+  ];
+
+  meta = {
+    homepage = "https://github.com/portugueslab/stytra";
+    description = "A modular package to control stimulation and track behaviour";
+    license = lib.licenses.gpl3Plus;
+    maintainers = with lib.maintainers; [ tbenst ];
+  };
+}
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..f25322531789
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/subarulink/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, aiohttp
+, asynctest
+, buildPythonPackage
+, cryptography
+, fetchFromGitHub
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, stdiomask
+}:
+
+buildPythonPackage rec {
+  pname = "subarulink";
+  version = "0.5.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "G-Two";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-q+a+OFFMAGl8KQi+KZ8h21+Pj0XEqP9ZIJii2PCgD6E=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    stdiomask
+  ];
+
+  checkInputs = [
+    asynctest
+    cryptography
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "--asyncio-mode=legacy"
+  ];
+
+  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";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/subdownloader/default.nix b/nixpkgs/pkgs/development/python-modules/subdownloader/default.nix
new file mode 100644
index 000000000000..2b536fa0e628
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/subdownloader/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, buildPythonPackage
+, fetchurl
+, mmpython
+, pyqt4
+}:
+
+buildPythonPackage rec {
+  version = "2.0.18";
+  pname = "subdownloader";
+
+  src = fetchurl {
+    url = "https://launchpad.net/subdownloader/trunk/2.0.18/+download/subdownloader_2.0.18.orig.tar.gz";
+    sha256 = "0manlfdpb585niw23ibb8n21mindd1bazp0pnxvmdjrp2mnw97ig";
+  };
+
+  propagatedBuildInputs = [ mmpython pyqt4 ];
+
+  setup = ''
+    import os
+    import sys
+
+    try:
+        if os.environ.get("NO_SETUPTOOLS"):
+            raise ImportError()
+        from setuptools import setup, Extension
+        SETUPTOOLS = True
+    except ImportError:
+        SETUPTOOLS = False
+        # Use distutils.core as a fallback.
+        # We won t be able to build the Wheel file on Windows.
+        from distutils.core import setup, Extension
+
+    with open("README") as fp:
+        long_description = fp.read()
+
+    requirements = [ ]
+
+    install_options = {
+        "name": "subdownloader",
+        "version": "2.0.18",
+        "description": "Tool for automatic download/upload subtitles for videofiles using fast hashing",
+        "long_description": long_description,
+        "url": "http://www.subdownloader.net",
+
+        "scripts": ["run.py"],
+        "packages": ["cli", "FileManagement", "gui", "languages", "modules"],
+
+    }
+    if SETUPTOOLS:
+        install_options["install_requires"] = requirements
+
+    setup(**install_options)
+  '';
+
+  postUnpack = ''
+    echo '${setup}' > $sourceRoot/setup.py
+  '';
+
+  meta = with lib; {
+    description = "Tool for automatic download/upload subtitles for videofiles using fast hashing";
+    homepage = "https://www.subdownloader.net";
+    license = licenses.gpl3;
+  };
+
+}
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..9188ad223eaa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/subliminal/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, guessit
+, babelfish
+, enzyme
+, beautifulsoup4
+, requests
+, click
+, dogpile-cache
+, stevedore
+, chardet
+, pysrt
+, six
+, appdirs
+, rarfile
+, pytz
+, sympy
+, vcrpy
+, pytest
+, pytest-flakes
+, pytest-cov
+, pytest-runner
+}:
+
+buildPythonPackage rec {
+  pname = "subliminal";
+  version = "2.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "12v2clnbic8320fjsvkg3xfxfa7x8inhjk61z00pzwx46g3rqhy6";
+  };
+
+  propagatedBuildInputs = [
+    guessit babelfish enzyme beautifulsoup4 requests
+    click dogpile-cache stevedore chardet pysrt six
+    appdirs rarfile pytz
+  ];
+
+  checkInputs = [
+    sympy vcrpy pytest pytest-flakes
+    pytest-cov pytest-runner
+  ];
+
+  # https://github.com/Diaoul/subliminal/pull/963
+  doCheck = false;
+  pythonImportsCheck = [ "subliminal" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/Diaoul/subliminal";
+    description = "Python library to search and download subtitles";
+    license = licenses.mit;
+  };
+}
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..adc4cae187bc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/subprocess-tee/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools-scm
+, pytestCheckHook
+, enrich
+}:
+
+buildPythonPackage rec {
+  pname = "subprocess-tee";
+  version = "0.3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ff5cced589a4b8ac973276ca1ba21bb6e3de600cde11a69947ff51f696efd577";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  checkInputs = [
+    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..704a4cb924ac
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/subunit/default.nix
@@ -0,0 +1,38 @@
+{ buildPythonPackage
+# pkgs dependencies
+, check
+, cppunit
+, pkg-config
+, subunit
+, pythonOlder
+
+# python dependencies
+, fixtures
+, hypothesis
+, pytest
+, testscenarios
+, testtools
+, unittest2
+}:
+
+buildPythonPackage {
+  inherit (subunit) name src meta;
+
+  nativeBuildInputs = [ pkg-config ];
+  buildInputs = [ check cppunit ];
+  propagatedBuildInputs = [ testtools ];
+
+  checkInputs = [ testscenarios hypothesis fixtures pytest unittest2 ];
+
+  # requires unittest2, which no longer supported in 3.10
+  doCheck = pythonOlder "3.10";
+  # ignore tests which call shell code, or call methods which haven't been implemented
+  checkPhase = ''
+    pytest python/subunit \
+      --ignore=python/subunit/tests/test_{output_filter,test_protocol{,2}}.py
+  '';
+
+  postPatch = ''
+    sed -i 's/version=VERSION/version="${subunit.version}"/' setup.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..78035910397d
--- /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;
+    sha256 = "sha256-c+Dg6moKiv30M0mmwGQSOEbc94gfH//ZnF7lnBgv8EU=";
+  };
+
+  propagatedBuildInputs = [
+    oslo-db
+    pbr
+    python-dateutil
+  ];
+
+  checkInputs = [
+    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..e4f3e531b0cb
--- /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;
+    sha256 = "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/suds-jurko/default.nix b/nixpkgs/pkgs/development/python-modules/suds-jurko/default.nix
new file mode 100644
index 000000000000..f2776265b067
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/suds-jurko/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPyPy
+}:
+
+buildPythonPackage rec {
+  pname = "suds-jurko";
+  version = "0.6";
+  disabled = isPyPy;  # lots of failures
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "1s4radwf38kdh3jrn5acbidqlr66sx786fkwi0rgq61hn4n2bdqw";
+  };
+
+  doCheck = false;
+
+  postPatch = ''
+    # fails
+    substituteInPlace tests/test_transport_http.py \
+      --replace "test_sending_unicode_data" "noop"
+  '';
+
+  meta = with lib; {
+    description = "Lightweight SOAP client (Jurko's fork)";
+    homepage = "https://bitbucket.org/jurko/suds";
+    license = licenses.lgpl3;
+    broken = true; # Uses use2to3, which has been removed in setuptools>=58
+  };
+
+}
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..430f20c5bfa7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sumo/default.nix
@@ -0,0 +1,72 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, cython
+, h5py
+, matplotlib
+, numpy
+, phonopy
+, pymatgen
+, scipy
+, seekpath
+, spglib
+, castepxbin
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "sumo";
+  version = "2.3.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "SMTG-UCL";
+    repo = "sumo";
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-hY1rQG4s5j/lVvu5e+5e+GamKrYpviqxaWmq1qB6ejU=";
+  };
+
+  nativeBuildInputs = [
+    cython
+  ];
+
+  propagatedBuildInputs = [
+    spglib
+    numpy
+    scipy
+    h5py
+    pymatgen
+    phonopy
+    matplotlib
+    seekpath
+    castepxbin
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # slight disagreement between caastepxbin versions
+    "test_castep_phonon_read_bands"
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "castepxbin==0.1.0" "castepxbin>=0.1.0"
+  '';
+
+  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";
+    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..c99fa0595645
--- /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;
+    sha256 = "sha256-qwQyFKVnGEqHUqFmUSnHVvedsp2peM6rJZcS90paLOo=";
+  };
+
+  propagatedBuildInputs = [
+    attrs
+  ];
+
+  checkInputs = [
+    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..aad3afda8adf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sunpy/default.nix
@@ -0,0 +1,163 @@
+{ 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
+, scikitimage
+, scipy
+, setuptools-scm
+, sqlalchemy
+, tqdm
+, zeep
+}:
+
+buildPythonPackage rec {
+  pname = "sunpy";
+  version = "4.0.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-O4VjxcuJVgUjjz3VWyczCjJxvJvAL94MBnGsRn54Ld4=";
+  };
+
+  nativeBuildInputs = [
+    astropy-extension-helpers
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    astropy
+    astropy-helpers
+    numpy
+    parfive
+  ];
+
+  passthru.optional-dependencies = {
+    asdf = [
+      asdf
+      # asdf-astropy
+    ];
+    database = [
+      sqlalchemy
+    ];
+    image = [
+      scikitimage
+      scipy
+    ];
+    net = [
+      beautifulsoup4
+      drms
+      python-dateutil
+      tqdm
+      zeep
+    ];
+    jpeg2000 = [
+      glymur
+      lxml
+    ];
+    timeseries = [
+      # cdflib
+      h5netcdf
+      # h5py
+      matplotlib
+      pandas
+    ];
+  };
+
+  checkInputs = [
+    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; [ costrouc ];
+  };
+}
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/superqt/default.nix b/nixpkgs/pkgs/development/python-modules/superqt/default.nix
new file mode 100644
index 000000000000..4b5995104884
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/superqt/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools-scm
+, pyqt5
+, qtpy
+, typing-extensions
+, pytest
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "superqt";
+  version = "0.3.3";
+
+  src = fetchFromGitHub {
+    owner = "napari";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-Ns3AFUL0BReIwTHfrlfXr/2GLtLvT7hfSjjh+r7btcY=";
+  };
+  format = "pyproject";
+  nativeBuildInputs = [ setuptools-scm ];
+  propagatedBuildInputs = [ pyqt5 qtpy typing-extensions ];
+  checkInputs = [ pytestCheckHook pytest ];
+  doCheck = false; # Segfaults...
+  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..6b10e838e5fb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/supervise_api/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, substituteAll
+, supervise
+, isPy3k
+, whichcraft
+, util-linux
+}:
+
+buildPythonPackage rec {
+  pname = "supervise_api";
+  version = "0.6.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1230f42294910e83421b7d3b08a968d27d510a4a709e966507ed70db5da1b9de";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./supervise-path.patch;
+      inherit supervise;
+    })
+  ];
+
+  # In the git repo, supervise_api lives inside a python subdir
+  patchFlags = [ "-p2" ];
+
+  propagatedBuildInputs = lib.optional (!isPy3k) whichcraft;
+
+  checkInputs = [ util-linux ];
+
+  meta = {
+    description = "An API for running processes safely and securely";
+    homepage = "https://github.com/catern/supervise";
+    license = lib.licenses.lgpl3;
+    maintainers = with lib.maintainers; [ catern ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/supervise_api/supervise-path.patch b/nixpkgs/pkgs/development/python-modules/supervise_api/supervise-path.patch
new file mode 100644
index 000000000000..c5538ddc26e2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/supervise_api/supervise-path.patch
@@ -0,0 +1,15 @@
+diff --git a/python/supervise_api/supervise.py b/python/supervise_api/supervise.py
+index 497d3ea..be57e35 100644
+--- a/python/supervise_api/supervise.py
++++ b/python/supervise_api/supervise.py
+@@ -41,9 +41,7 @@ try:
+ except:
+     from whichcraft import which
+ 
+-supervise_utility_location = which("supervise")
+-if not supervise_utility_location:
+-    raise FileNotFoundError(errno.ENOENT, "Executable not found in PATH", "supervise")
++supervise_utility_location = '@supervise@/bin/supervise'
+ 
+ 
+ def ignore_sigchld():
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..9af3db2de490
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/supervisor/default.nix
@@ -0,0 +1,32 @@
+{ stdenv, lib, buildPythonPackage, fetchPypi
+, mock
+, pytest
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "supervisor";
+  version = "4.2.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "40dc582ce1eec631c3df79420b187a6da276bbd68a4ec0a8f1f123ea616b97a2";
+  };
+
+  # wants to write to /tmp/foo which is likely already owned by another
+  # nixbld user on hydra
+  doCheck = !stdenv.isDarwin;
+  checkInputs = [ mock pytest ];
+  checkPhase = ''
+    pytest
+  '';
+
+  propagatedBuildInputs = [ setuptools ];
+
+  meta = with lib; {
+    description = "A system for controlling process state under UNIX";
+    homepage = "http://supervisord.org/";
+    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..84cc78e8a4a8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sure/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, rednose
+, six
+, mock
+, isPyPy
+, fetchpatch
+}:
+
+buildPythonPackage rec {
+  pname = "sure";
+  version = "2.0.0";
+  disabled = isPyPy;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "34ae88c846046742ef074036bf311dc90ab152b7bc09c342b281cebf676727a2";
+  };
+
+  patches = [
+    # https://github.com/gabrielfalcao/sure/issues/169
+    (fetchpatch {
+      url = "https://raw.githubusercontent.com/archlinux/svntogit-community/055baa81cd987e566de62a5657513937521a90d4/trunk/python310.diff";
+      sha256 = "sha256-BKylV8xpTOuO/X4hzZKpoIcAQcdAK0kXYENRad7AGPc=";
+    })
+  ];
+
+  buildInputs = [ rednose ];
+  propagatedBuildInputs = [ six mock ];
+
+  meta = with lib; {
+    description = "Utility belt for automated testing";
+    homepage = "https://sure.readthedocs.io/en/latest/";
+    license = licenses.gpl3Plus;
+  };
+
+}
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..13c8107c9aef
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/surepy/default.nix
@@ -0,0 +1,71 @@
+{ lib
+, aiodns
+, aiohttp
+, async-timeout
+, attrs
+, brotlipy
+, buildPythonPackage
+, cchardet
+, click
+, colorama
+, fetchFromGitHub
+, halo
+, poetry-core
+, pythonOlder
+, requests
+, rich
+}:
+
+buildPythonPackage rec {
+  pname = "surepy";
+  version = "0.7.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "benleb";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-yc+jXA4ndFhRZmFPz11HbVs9qaPFNa6WdwXj6hRyjw4=";
+  };
+
+  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
+    cchardet
+    click
+    colorama
+    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..21024c0ed02c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/surt/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, six
+, tldextract
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "surt";
+  version = "0.3.1";
+
+  src = fetchFromGitHub {
+    owner = "internetarchive";
+    repo = "surt";
+    rev = "6934c321b3e2f66af9c001d882475949f00570c5"; # Has no git tag
+    sha256 = "sha256-pSMNpFfq2V0ANWNFPcb1DwPHccbfddo9P4xZ+ghwbz4=";
+  };
+
+  propagatedBuildInputs = [
+    six
+    tldextract
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "surt" ];
+
+  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..34b1eed17279
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/survey/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, wrapio
+}:
+
+buildPythonPackage rec {
+  pname = "survey";
+  version = "3.4.3";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-TK89quY3bpNIEz1n3Ecew4FnTH6QgeSLdDNV86gq7+I=";
+  };
+
+  propagatedBuildInputs = [
+    wrapio
+  ];
+
+  doCheck = false;
+  pythonImportsCheck = [ "survey" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/Exahilosys/survey";
+    description = "A simple library for creating beautiful interactive prompts";
+    license = licenses.mit;
+    maintainers = with maintainers; [ sfrijters ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/suseapi/default.nix b/nixpkgs/pkgs/development/python-modules/suseapi/default.nix
new file mode 100644
index 000000000000..bcf35d1f5f70
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/suseapi/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, django
+, suds-jurko
+, ldap
+, mechanize
+, beautifulsoup4
+, pyxdg
+, python-dateutil
+, requests
+, httpretty
+}:
+
+buildPythonPackage rec {
+  pname = "suseapi";
+  version = "0.24-31-g0fcbe96";
+
+  src = fetchFromGitHub {
+    owner = "openSUSE";
+    repo = "python-${pname}";
+    rev = version;
+    sha256 = "0hyzq0h1w8gp0zfvhqh7qsgcg1wp05a14371m6bn5a7gss93rbv4";
+  };
+
+  propagatedBuildInputs = [
+    django suds-jurko ldap mechanize beautifulsoup4 pyxdg python-dateutil requests
+  ];
+
+  buildInputs = [ httpretty ];
+
+  doCheck = false;
+
+  meta = {
+    homepage = "https://github.com/openSUSE/python-suseapi/";
+    description = "Python module to work with various SUSE services";
+    license = lib.licenses.gpl3Plus;
+  };
+}
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..8c565b3d41c8
--- /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=";
+  };
+
+  checkInputs = [
+    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..c15e88ebeb24
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/svg2tikz/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, lxml
+, isPy27
+}:
+
+buildPythonPackage {
+  pname = "svg2tikz";
+  version = "1.0.0";
+  disabled = ! isPy27;
+
+  propagatedBuildInputs = [ lxml ];
+
+  src = fetchFromGitHub {
+    owner = "kjellmf";
+    repo = "svg2tikz";
+    rev = "ad36f2c3818da13c4136d70a0fd8153acf8daef4";
+    sha256 = "sha256-QpQo7ENeU2crhc37uJu4rw/5+COPXQWXBynlF30lLV8=";
+    fetchSubmodules = true;
+  };
+
+  meta = with lib; {
+    homepage = "https://github.com/kjellmf/svg2tikz";
+    description = "An SVG to TikZ converter";
+    license = licenses.gpl2Plus;
+    maintainers =  with maintainers; [ gal_bolle ];
+  };
+
+}
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..97e03ad4b036
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/svglib/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, cssselect2
+, lxml
+, pillow
+, pytestCheckHook
+, reportlab
+, tinycss2
+}:
+
+buildPythonPackage rec {
+  pname = "svglib";
+  version = "1.4.1";
+
+  disabled = pythonOlder "3.7";
+
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-SMJHBsI7tCYhc7b6Seq7EK+hW4QS8UKDEgVJUXzPoxQ=";
+  };
+
+  propagatedBuildInputs = [
+    cssselect2
+    lxml
+    pillow
+    reportlab
+    tinycss2
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  # Ignore tests that require network access (TestWikipediaFlags and TestW3CSVG), and tests that
+  # require files missing in the 1.0.0 PyPI release (TestOtherFiles).
+  pytestFlagsArray = [
+    "-k 'not TestWikipediaFlags and not TestW3CSVG and not TestOtherFiles'"
+  ];
+
+  pythonImportsCheck = [ "svglib.svglib" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/deeplook/svglib";
+    description = "A pure-Python library for reading and converting SVG";
+    license = licenses.lgpl3;
+    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..5b1e863c7785
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/svgwrite/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "svgwrite";
+  version = "1.4.1";
+
+  src = fetchFromGitHub {
+    owner = "mozman";
+    repo = "svgwrite";
+    rev = "v${version}";
+    sha256 = "sha256-d//ZUFb5yj51uD1fb6yJJROaQ2MLyfA3Pa84TblqLNk=";
+  };
+
+  # svgwrite requires Python 3.6 or newer
+  disabled = pythonOlder "3.6";
+
+  checkInputs = [
+    pytest
+  ];
+
+  # embed_google_web_font test tried to pull font from internet
+  checkPhase = ''
+    pytest -k "not 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..ec15516b16b6
--- /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}";
+    sha256 = "sha256-7+kFmtzeze0QlGf6z/M4J4F7z771a5NWewB1S3+bxn4=";
+  };
+
+  propagatedBuildInputs = [
+    pyyaml
+    jsonschema
+    six
+  ];
+
+  checkInputs = [
+    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..6457a4521a40
--- /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.29.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-PoTob/Qz/XxEv/A271RQWT11rIIJBejVGjpAT14iKUg=";
+  };
+
+  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/*
+  '';
+
+  checkInputs = [
+    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..f9464382c4c0
--- /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
+  ];
+
+  checkInputs = [
+    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..41baf697fff3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sybil/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonApplication
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonApplication rec {
+  pname = "sybil";
+  version = "3.0.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-bwLcIgSvflohIDeSTZdPcngfbcGP08RMx85GOhIPUw0=";
+  };
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Sensitive to output of other commands
+    "test_namespace"
+    "test_unittest"
+  ];
+
+  pythonImportsCheck = [
+    "sybil"
+  ];
+
+  meta = with lib; {
+    description = "Automated testing for the examples in your documentation";
+    homepage = "https://github.com/cjw296/sybil";
+    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..ee2a08738456
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/symengine/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, buildPythonPackage
+, fetchpatch
+, fetchFromGitHub
+, cython
+, cmake
+, symengine
+, pytest
+, sympy
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "symengine";
+  version = "0.9.2";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "symengine";
+    repo = "symengine.py";
+    rev = "v${version}";
+    sha256 = "sha256-ZHplYEG97foy/unOdSokFFkDl4LK5TI4kypHSLpcCM4=";
+  };
+
+  patches = [
+    (fetchpatch {
+      # setuptools 61 compat
+      url = "https://github.com/symengine/symengine.py/commit/987e665e71cf92d1b021d7d573a1b9733408eecf.patch";
+      hash = "sha256-2QbNdw/lKYRIRpOU5BiwF2kK+5Lh2j/Q82MKUIvl0+c=";
+    })
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "\"cmake\"" "\"${cmake}/bin/cmake\"" \
+      --replace "'cython>=0.29.24'" "'cython'"
+  '';
+
+  nativeBuildUnputs = [ cmake ];
+
+  buildInputs = [ cython ];
+
+  checkInputs = [ 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 = [ maintainers.costrouc ];
+  };
+}
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..17765a375298
--- /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.10.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-WTnu/9+eFSFyYBRjYmwCKiwn51z2J43o1AHVDJ1YeHs=";
+  };
+
+  checkInputs = [ 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/syncer/default.nix b/nixpkgs/pkgs/development/python-modules/syncer/default.nix
new file mode 100644
index 000000000000..cd3bbf699de2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/syncer/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "syncer";
+  version = "1.3.0";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "miyakogi";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "13y8jllix1ipkcg9lxa4nxk8kj24vivxfizf4d02cdrha9dw500v";
+  };
+
+  # 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..53af1552ac30
--- /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
+  ];
+
+  checkInputs = [ 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..71bd11144294
--- /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
+  ];
+
+  checkInputs = [
+    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/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..beca0ef8147a
--- /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}";
+    sha256 = "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..b27af96edbd7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/systemd/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchpatch
+, fetchFromGitHub
+, systemd
+, pkg-config
+}:
+
+buildPythonPackage rec {
+  pname = "systemd";
+  version = "234";
+
+  src = fetchFromGitHub {
+    owner = "systemd";
+    repo = "python-systemd";
+    rev = "v${version}";
+    sha256 = "1fakw7qln44mfd6pj4kqsgyrhkc6cyr653id34kv0rdnb1bvysrz";
+  };
+
+  patches = [
+    # Fix runtime issues on Python 3.10
+    # https://github.com/systemd/python-systemd/issues/107
+    (fetchpatch {
+      url = "https://github.com/systemd/python-systemd/commit/c71bbac357f0ac722e1bcb2edfa925b68cca23c9.patch";
+      sha256 = "22s72Wa/BCwNNvwbxEUh58jhHlbA00SNwNVchVDovcc=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    pkg-config
+  ];
+
+  buildInputs = [
+    systemd
+  ];
+
+  # No module named 'systemd._journal
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "systemd.journal"
+    "systemd.id128"
+    "systemd.daemon"
+    "systemd.login"
+  ];
+
+  meta = with lib; {
+    description = "Python module for native access to the systemd facilities";
+    homepage = "http://www.freedesktop.org/software/systemd/python-systemd/";
+    license = licenses.lgpl21Plus;
+  };
+}
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/tableaudocumentapi/default.nix b/nixpkgs/pkgs/development/python-modules/tableaudocumentapi/default.nix
new file mode 100644
index 000000000000..cf9a55d7391c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tableaudocumentapi/default.nix
@@ -0,0 +1,24 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "tableaudocumentapi";
+  version = "0.10";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-ahR+o4UgFLm/9aFsEqmlwXkcgTjqI0wU2Tl9EjVjLZs=";
+  };
+
+  # tests not inclued with release
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A Python module for working with Tableau files";
+    homepage = "https://github.com/tableau/document-api-python";
+    license = licenses.mit;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..fbe99c6fa931
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tables/default.nix
@@ -0,0 +1,81 @@
+{ lib
+, fetchPypi
+, fetchpatch
+, buildPythonPackage
+, pythonOlder
+, bzip2
+, c-blosc
+, cython
+, hdf5
+, lzo
+, numpy
+, numexpr
+, packaging
+  # Test inputs
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "tables";
+  version = "3.7.0";
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-6SqIetbyqYPlZKaZAt5KdkXDAGn8AavTU+xdolXF4f4=";
+  };
+
+  nativeBuildInputs = [ cython ];
+
+  buildInputs = [
+    bzip2
+    c-blosc
+    hdf5
+    lzo
+  ];
+  propagatedBuildInputs = [
+    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"
+  '';
+
+  # 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}"
+  ];
+
+  checkInputs = [ pytestCheckHook ];
+  preCheck = ''
+    cd ..
+  '';
+  # Runs the test suite as one single test via unittest. The whole "heavy" test suite supposedly takes ~5 hours to run.
+  pytestFlagsArray = [
+    "--pyargs"
+    "tables.tests.test_suite"
+  ];
+
+  pythonImportsCheck = [ "tables" ];
+
+  meta = with lib; {
+    description = "Hierarchical datasets for Python";
+    homepage = "https://www.pytables.org/";
+    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..ae0217b0ebdc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tablib/default.nix
@@ -0,0 +1,42 @@
+{ buildPythonPackage
+, lib
+, fetchPypi
+, isPy27
+, odfpy
+, openpyxl
+, pandas
+, setuptools-scm
+, pytestCheckHook
+, pytest-cov
+, pyyaml
+, unicodecsv
+, xlrd
+, xlwt
+}:
+
+buildPythonPackage rec {
+  pname = "tablib";
+  version = "3.2.1";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-pX8ncLjCJf6+wcseZQEqac8w3Si+gQ4P+Y0CR2jH0PE=";
+  };
+
+  nativeBuildInputs = [ setuptools-scm ];
+  propagatedBuildInputs = [ xlwt openpyxl pyyaml xlrd odfpy ];
+  checkInputs = [ pytestCheckHook pytest-cov unicodecsv pandas ];
+
+  # test_tablib needs MarkupPy, which isn't packaged yet
+  pytestFlagsArray = [ "--ignore=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;
+  };
+}
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..6e9a32550312
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tabula-py/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, buildPythonPackage
+, distro
+, fetchFromGitHub
+, jdk
+, numpy
+, pandas
+, pytestCheckHook
+, pythonOlder
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "tabula-py";
+  version = "2.5.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "chezou";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-SYDwMVJMBRAtjkHMZQct17RueMbRZ5aDENDGkkrahrY=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    distro
+    numpy
+    pandas
+  ];
+
+  checkInputs = [
+    jdk
+    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"
+  ];
+
+  meta = with lib; {
+    description = "Module to extract table from PDF into pandas DataFrame";
+    homepage = "https://github.com/chezou/tabula-py";
+    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..34e668339878
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tabulate/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nose
+}:
+
+buildPythonPackage rec {
+  version = "0.8.10";
+  pname = "tabulate";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-bFfz8916wngncBVfOtstsLGiaWN+QvJ1mZJeZLEU9Rk=";
+  };
+
+  checkInputs = [ nose ];
+
+  # Tests: cannot import common (relative import).
+  doCheck = false;
+
+  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..35a7f7d8a7dc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tabview/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, python
+}:
+
+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";
+  };
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest discover
+  '';
+
+  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..d1de836a5b8c
--- /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
+  ];
+
+  checkInputs = [
+    pytest
+    scipy
+  ];
+
+  meta = with lib; {
+    description = "Great data sets for Topological Data Analysis";
+    homepage = "https://tadasets.scikit-tda.org";
+    license = licenses.mit;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..137759f5a54b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tag-expressions/default.nix
@@ -0,0 +1,24 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "tag-expressions";
+  version = "1.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1c0a49c3c0357976822b03c43db8d4a1c5548e16fb07ac939c10bbd5183f529d";
+  };
+
+  checkInputs = [ pytestCheckHook ];
+
+  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..220c8f2b0bb7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tago/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, promise
+, python-socketio
+, pythonOlder
+, requests
+, websockets
+}:
+
+buildPythonPackage rec {
+  pname = "tago";
+  version = "3.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "tago-io";
+    repo = "tago-sdk-python";
+    rev = version;
+    sha256 = "sha256-eu6n83qmo1PQKnR/ellto04xi/3egl+LSKMOG277X1k=";
+  };
+
+  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";
+    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..440218223117
--- /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}";
+    sha256 = "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..67a384f4b22b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tailscale/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, aiohttp
+, aresponses
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pydantic
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, yarl
+}:
+
+buildPythonPackage rec {
+  pname = "tailscale";
+  version = "0.2.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "frenck";
+    repo = "python-tailscale";
+    rev = "v${version}";
+    sha256 = "sha256-/tS9ZMUWsj42n3MYPZJYJELzX3h02AIHeRZmD2SuwWE=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    pydantic
+    yarl
+  ];
+
+  checkInputs = [
+    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 = [
+    "tailscale"
+  ];
+
+  meta = with lib; {
+    description = "Python client for the Tailscale API";
+    homepage = "https://github.com/frenck/python-tailscale";
+    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..4652ea99f6d8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tappy/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "tap.py";
+  version = "3.1";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3c0cd45212ad5a25b35445964e2517efa000a118a1bfc3437dae828892eaf1e1";
+  };
+
+  checkInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "tap" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/python-tap/tappy";
+    description = "A set of tools for working with the Test Anything Protocol (TAP) in Python";
+    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..ebc2d46fd989
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tasklib/default.nix
@@ -0,0 +1,36 @@
+{ lib, pythonPackages, taskwarrior, writeShellScriptBin }:
+
+with pythonPackages;
+
+let
+
+wsl_stub = writeShellScriptBin "wsl" "true";
+
+in buildPythonPackage rec {
+  pname = "tasklib";
+  version = "2.4.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b523bc12893d26c8173a6b8d84b16259c9a9c5acaaf8932bc018117f907b3bc5";
+  };
+
+  propagatedBuildInputs = [
+    six
+    pytz
+    tzlocal
+  ];
+
+  checkInputs = [
+    taskwarrior
+    wsl_stub
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/robgolding/tasklib";
+    description = "A library for interacting with taskwarrior databases";
+    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..0d4cd9c09e94
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/taskw/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nose
+, tox
+, six
+, python-dateutil
+, kitchen
+, pytz
+, pkgs
+}:
+
+buildPythonPackage rec {
+  version = "2.0.0";
+  pname = "taskw";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-EQm9+b3nqbMqUAejAsh4MD/2UYi2QiWsdKMomkxUi90=";
+  };
+
+  patches = [ ./use-template-for-taskwarrior-install-path.patch ];
+  postPatch = ''
+    substituteInPlace taskw/warrior.py \
+      --replace '@@taskwarrior@@' '${pkgs.taskwarrior}'
+  '';
+
+  # https://github.com/ralphbean/taskw/issues/98
+  doCheck = false;
+
+  buildInputs = [ nose pkgs.taskwarrior tox ];
+  propagatedBuildInputs = [ six python-dateutil kitchen pytz ];
+
+  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/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..fae42ac5914e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tatsu/default.nix
@@ -0,0 +1,37 @@
+{ lib, buildPythonPackage, fetchFromGitHub, pythonOlder
+, colorama, regex
+, pytest-runner, pytestCheckHook, pytest-mypy
+}:
+
+buildPythonPackage rec {
+  pname = "tatsu";
+  version = "5.8.2";
+  # upstream only supports 3.10+
+  disabled = pythonOlder "3.10";
+
+  src = fetchFromGitHub {
+    owner = "neogeny";
+    repo = "TatSu";
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-eJJ438zjXRZ7dk36RPkFvhcIA5RYo5MsjptZIpjCrVI=";
+  };
+
+  nativeBuildInputs = [ pytest-runner ];
+  propagatedBuildInputs = [ colorama regex ];
+  checkInputs = [ pytestCheckHook pytest-mypy ];
+
+  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/";
+    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..a0ccf0167cf8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/taxi/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, appdirs
+, requests
+, click
+, setuptools
+, backends ? [ ]
+}:
+
+buildPythonPackage rec {
+  pname = "taxi";
+  version = "6.1.1";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "taxi";
+    sha256 = "b2562ed58bd6eae7896f4f8e48dbee9845cd2d452b26dd15c26f839b4864cb02";
+  };
+
+  # No tests in pypy package
+  doCheck = false;
+
+  propagatedBuildInputs = [
+    appdirs
+    requests
+    click
+    setuptools
+  ] ++ backends;
+
+  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/tblib/default.nix b/nixpkgs/pkgs/development/python-modules/tblib/default.nix
new file mode 100644
index 000000000000..2f06b665d33f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tblib/default.nix
@@ -0,0 +1,18 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "tblib";
+  version = "1.7.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "059bd77306ea7b419d4f76016aef6d7027cc8a0785579b5aad198803435f882c";
+  };
+
+  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..bcc5cbbef946
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tbm-utils/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, attrs
+, pendulum
+, pprintpp
+, wrapt
+}:
+
+buildPythonPackage rec {
+  pname = "tbm-utils";
+  version = "2.6.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1v7pb3yirkhzbv1z5i1qp74vl880f56zvzfj68p08b5jxv64hmr3";
+  };
+
+  propagatedBuildInputs = [ attrs pendulum pprintpp wrapt ];
+
+  # this versioning was done to prevent normal pip users from encountering
+  # issues with package failing to build from source, but nixpkgs is better
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "'attrs>=18.2,<19.4'" "'attrs'"
+  '';
+
+  # No tests in archive.
+  doCheck = false;
+
+  meta = {
+    description = "A commonly-used set of utilities";
+    homepage = "https://github.com/thebigmunch/tbm-utils";
+    license = with lib.licenses; [ mit ];
+  };
+
+}
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..4f2b7f76de89
--- /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.31";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "JetBrains";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-oYXP9HWdgmEq48rYyuX6zHf+cp835C0BtHUAME+5S+k=";
+  };
+
+  checkInputs = [
+    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/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/telethon-session-sqlalchemy/default.nix b/nixpkgs/pkgs/development/python-modules/telethon-session-sqlalchemy/default.nix
new file mode 100644
index 000000000000..20fa793a8a63
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/telethon-session-sqlalchemy/default.nix
@@ -0,0 +1,27 @@
+{ 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 ];
+  };
+}
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..137f6b136a78
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/telethon/default.nix
@@ -0,0 +1,34 @@
+{ lib, buildPythonPackage, fetchPypi, openssl, rsa, pyaes, pythonOlder }:
+
+buildPythonPackage rec {
+  pname = "telethon";
+  version = "1.24.0";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "Telethon";
+    sha256 = "818cb61281ed3f75ba4da9b68cb69486bed9474d2db4e0aa16e482053117452c";
+  };
+
+  patchPhase = ''
+    substituteInPlace telethon/crypto/libssl.py --replace \
+      "ctypes.util.find_library('ssl')" "'${lib.getLib openssl}/lib/libssl.so'"
+  '';
+
+  propagatedBuildInputs = [
+    rsa
+    pyaes
+  ];
+
+  # No tests available
+  doCheck = false;
+
+  disabled = pythonOlder "3.5";
+
+  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..999454edf83f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/teletype/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "teletype";
+  version = "1.3.4";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-uBppM4w9GlMgYqKFGw1Rcjvq+mnU04K3E74jCgK9YYo=";
+  };
+
+  # 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..86386ad48a90
--- /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
+  ];
+
+  checkInputs = [
+    nose
+  ];
+
+  checkPhase = ''
+    nosetests
+  '';
+
+  pythonImportsCheck = [
+    "telfhash"
+  ];
+
+  meta = with lib; {
+    description = "Symbol hash for ELF files";
+    homepage = "https://github.com/trendmicro/telfhash";
+    license = licenses.asl20;
+    maintainers = teams.determinatesystems.members;
+  };
+}
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/tempest/default.nix b/nixpkgs/pkgs/development/python-modules/tempest/default.nix
new file mode 100644
index 000000000000..9eae17b3e178
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tempest/default.nix
@@ -0,0 +1,87 @@
+{ lib
+, buildPythonApplication
+, fetchPypi
+, pbr
+, cliff
+, jsonschema
+, testtools
+, paramiko
+, netaddr
+, oslo-concurrency
+, oslo-config
+, oslo-log
+, stestr
+, oslo-serialization
+, oslo-utils
+, fixtures
+, pyyaml
+, subunit
+, stevedore
+, prettytable
+, urllib3
+, debtcollector
+, hacking
+, oslotest
+, bash
+, python
+}:
+
+buildPythonApplication rec {
+  pname = "tempest";
+  version = "31.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-EaDFnIxaAGBDViAVzMjZev3jXmb3NIlMlcg4BiwoAq4=";
+  };
+
+  propagatedBuildInputs = [
+    pbr
+    cliff
+    jsonschema
+    testtools
+    paramiko
+    netaddr
+    oslo-concurrency
+    oslo-config
+    oslo-log
+    stestr
+    oslo-serialization
+    oslo-utils
+    fixtures
+    pyyaml
+    subunit
+    stevedore
+    prettytable
+    urllib3
+    debtcollector
+  ];
+
+  checkInputs = [
+    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..a45edb8d2673
--- /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 = "gjhiggins";
+    repo = "tempita";
+    rev = "47414a7c6e46a9a9afe78f0bce2ea299fa84d10";
+    sha256 = "0f33jjjs5rvp7ar2j6ggyfykcrsrn04jaqcq71qfvycf6b7nw3rn";
+  };
+
+  buildInputs = [ nose ];
+
+  meta = {
+    homepage = "https://github.com/gjhiggins/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..8b50406c7eac
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tempora/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+
+# build time
+, setuptools-scm
+
+# runtime
+, pytz
+, jaraco_functools
+
+# tests
+, freezegun
+, pytest-freezegun
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "tempora";
+  version = "5.0.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-MfpbszsmQQJiEfI+gI64vTUZAZiLFn1F8yPI9FDs8hE=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    jaraco_functools
+    pytz
+  ];
+
+  checkInputs = [
+    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";
+    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..8de4c87b6fdc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tenacity/default.nix
@@ -0,0 +1,33 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27, isPy3k
+, pbr, six, futures ? null, monotonic ? null, typing ? null, setuptools-scm
+, pytest, sphinx, tornado, typeguard
+}:
+
+buildPythonPackage rec {
+  pname = "tenacity";
+  version = "8.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "43242a20e3e73291a28bcbcacfd6e000b02d3857a9a9fff56b297a27afdc932f";
+  };
+
+  nativeBuildInputs = [ pbr setuptools-scm ];
+  propagatedBuildInputs = [ six ]
+    ++ lib.optionals isPy27 [ futures monotonic typing ];
+
+  checkInputs = [ pytest sphinx tornado ]
+    ++ lib.optionals isPy3k [ typeguard ];
+  checkPhase = if isPy27 then ''
+    pytest --ignore='tenacity/tests/test_asyncio.py'
+  '' else ''
+    pytest
+  '';
+
+  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..74f53d7c6763
--- /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.6.1";
+  format = "wheel";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    pname = "tensorboard_data_server";
+    inherit version format;
+    dist = "py3";
+    python = "py3";
+    sha256 = "sha256-gJ/piHaC01wffR9U8PQPmLsfdxsUJltFPKBR4s5Y/Kc=";
+  };
+
+  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..a32be33a37a8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tensorboard-plugin-profile/default.nix
@@ -0,0 +1,32 @@
+{ lib, fetchPypi, buildPythonPackage
+, gviz-api
+, protobuf
+, werkzeug
+}:
+
+buildPythonPackage rec {
+  pname = "tensorboard_plugin_profile";
+  version = "2.8.0";
+  format = "wheel";
+
+  src = fetchPypi {
+    inherit pname version;
+    format = "wheel";
+    dist = "py3";
+    python = "py3";
+    hash = "sha256-2LzXSdPrzS5G63ONvchdEL4aJD75eU9dF1pMqLcfbto=";
+  };
+
+  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..4e7087deb326
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tensorboard/default.nix
@@ -0,0 +1,90 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, pythonOlder
+, pythonAtLeast
+, 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.9.1";
+  format = "wheel";
+  disabled = pythonOlder "3.6" || pythonAtLeast "3.11";
+
+  src = fetchPypi {
+    inherit pname version format;
+    dist = "py3";
+    python = "py3";
+    hash = "sha256-uqcn95F3b55YQdNHEncgzu1LvVnDa0BgS5X7KuYCknY=";
+  };
+
+  postPatch = ''
+    chmod u+rwx -R ./dist
+    pushd dist
+    wheel unpack --dest unpacked ./*.whl
+    pushd unpacked/tensorboard-${version}
+
+    substituteInPlace tensorboard-${version}.dist-info/METADATA \
+      --replace "google-auth (<2,>=1.6.3)" "google-auth (<3,>=1.6.3)" \
+      --replace "google-auth-oauthlib (<0.5,>=0.4.1)" "google-auth-oauthlib (<0.6,>=0.4.1)"
+
+    popd
+    wheel pack ./unpacked/tensorboard-${version}
+    popd
+  '';
+
+  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..93d94d0c3826
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tensorboardx/default.nix
@@ -0,0 +1,82 @@
+{ boto3
+, buildPythonPackage
+, crc32c
+, which
+, fetchFromGitHub
+, lib
+, matplotlib
+, moto
+, numpy
+, pillow
+, protobuf3_8
+, pytestCheckHook
+, pytorch
+, six
+, soundfile
+, tensorboard
+, torchvision
+}:
+
+buildPythonPackage rec {
+  pname = "tensorboardx";
+  version = "2.5";
+
+  src = fetchFromGitHub {
+    owner = "lanpa";
+    repo = "tensorboardX";
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-g6x0yUpofeSNA4rKPidqOKC7/TrOICstcc98VnQcfDY=";
+  };
+
+  # apparently torch API changed a bit at 1.6
+  postPatch = ''
+    substituteInPlace tensorboardX/pytorch_graph.py --replace \
+      "torch.onnx.set_training(model, False)" \
+      "torch.onnx.select_model_mode_for_export(model, torch.onnx.TrainingMode.EVAL)"
+  '';
+
+  # Wanted protobuf version is mentioned here:
+  # https://github.com/lanpa/tensorboardX/blob/0d08112618a2bbda4c028a15a137fed3afe77401/compile.sh#L6
+  nativeBuildInputs = [ which protobuf3_8 ];
+
+  # required to make tests deterministic
+  PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION = "python";
+
+  propagatedBuildInputs = [
+    crc32c
+    numpy
+    six
+    soundfile
+  ];
+
+  checkInputs = [
+    boto3
+    matplotlib
+    moto
+    pillow
+    pytestCheckHook
+    pytorch
+    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"
+  ];
+
+  disabledTestPaths = [
+    # we are not interested in linting errors
+    "tests/test_lint.py"
+  ];
+
+  meta = with lib; {
+    description = "Library for writing tensorboard-compatible logs";
+    homepage = "https://github.com/lanpa/tensorboardX";
+    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..772e6da92edd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tensorflow-datasets/default.nix
@@ -0,0 +1,150 @@
+{ apache-beam
+, attrs
+, beautifulsoup4
+, buildPythonPackage
+, dill
+, dm-tree
+, fetchFromGitHub
+, ffmpeg
+, future
+, imagemagick
+, importlib-resources
+, jax
+, jaxlib
+, jinja2
+, langdetect
+, lib
+, matplotlib
+, mwparserfromhell
+, networkx
+, nltk
+, numpy
+, opencv4
+, pandas
+, pillow
+, promise
+, protobuf
+, pycocotools
+, pydub
+, pytest-xdist
+, pytestCheckHook
+, requests
+, scikitimage
+, scipy
+, six
+, tensorflow
+, tensorflow-metadata
+, termcolor
+, tifffile
+, tqdm
+}:
+
+buildPythonPackage rec {
+  pname = "tensorflow-datasets";
+  version = "4.6.0";
+
+  src = fetchFromGitHub {
+    owner = "tensorflow";
+    repo = "datasets";
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-z52UZz9d1AaZklLOPbWuzByEl1hJ6ra4Hoz6eNGD+hg=";
+  };
+
+  patches = [
+    # addresses https://github.com/tensorflow/datasets/issues/3673
+    ./corruptions.patch
+  ];
+
+  propagatedBuildInputs = [
+    attrs
+    dill
+    dm-tree
+    future
+    importlib-resources
+    numpy
+    promise
+    protobuf
+    requests
+    six
+    tensorflow-metadata
+    termcolor
+    tqdm
+  ];
+
+  pythonImportsCheck = [
+    "tensorflow_datasets"
+  ];
+
+  checkInputs = [
+    apache-beam
+    beautifulsoup4
+    ffmpeg
+    imagemagick
+    jax
+    jaxlib
+    jinja2
+    langdetect
+    matplotlib
+    mwparserfromhell
+    networkx
+    nltk
+    opencv4
+    pandas
+    pillow
+    pycocotools
+    pydub
+    pytest-xdist
+    pytestCheckHook
+    scikitimage
+    scipy
+    tensorflow
+    tifffile
+  ];
+
+  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/utils/gcs_utils_test.py"
+    "tensorflow_datasets/scripts/cli/build_test.py"
+
+    # Requires `pretty_midi` which is not packaged in `nixpkgs`.
+    "tensorflow_datasets/audio/groove_test.py"
+
+    # Requires `crepe` which is not packaged in `nixpkgs`.
+    "tensorflow_datasets/audio/nsynth_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/image/lsun_test.py"
+
+    # Requires `envlogger` which is not packaged in `nixpkgs`.
+    "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"
+
+    # 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/default.nix b/nixpkgs/pkgs/development/python-modules/tensorflow-estimator/default.nix
new file mode 100644
index 000000000000..b52a96a3ea5b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tensorflow-estimator/default.nix
@@ -0,0 +1,27 @@
+{ lib, fetchPypi, buildPythonPackage
+, numpy
+, absl-py
+, mock
+}:
+
+buildPythonPackage rec {
+  pname = "tensorflow-estimator";
+  version = "2.9.0";
+  format = "wheel";
+
+  src = fetchPypi {
+    pname = "tensorflow_estimator";
+    inherit version format;
+    hash = "sha256-6XYrswL1G8HrLzXRnwGQpqLYCddU1d73iMQyj+N0Z0Q=";
+  };
+
+  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..5204e2158dc7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tensorflow-metadata/default.nix
@@ -0,0 +1,51 @@
+{ absl-py
+, buildPythonPackage
+, fetchFromGitHub
+, googleapis-common-protos
+, protobuf
+, lib
+}:
+
+buildPythonPackage rec {
+  pname = "tensorflow-metadata";
+  version = "1.9.0";
+
+  src = fetchFromGitHub {
+    owner = "tensorflow";
+    repo = "metadata";
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-6BtKHyVrprtEb2Bi7g2YuctUykWSRXmKwADfHzGkYjc=";
+  };
+
+  patches = [
+    ./build.patch
+  ];
+
+  # 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..760e9a0e9d1c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tensorflow-probability/default.nix
@@ -0,0 +1,115 @@
+{ lib
+, fetchFromGitHub
+, buildBazelPackage
+, buildPythonPackage
+, python
+, setuptools
+, wheel
+, absl-py
+, tensorflow
+, six
+, numpy
+, dm-tree
+, keras
+, decorator
+, cloudpickle
+, gast
+, hypothesis
+, scipy
+, pandas
+, mpmath
+, matplotlib
+, mock
+, pytest
+}:
+
+let
+  version = "0.15.0";
+  pname = "tensorflow_probability";
+
+  # first build all binaries and generate setup.py using bazel
+  bazel-wheel = buildBazelPackage {
+    name = "${pname}-${version}-py2.py3-none-any.whl";
+    src = fetchFromGitHub {
+      owner = "tensorflow";
+      repo = "probability";
+      rev = "v" + version;
+      sha256 = "155fgmra90s08vjnp61qxdrpzq74xa3kdzhgdkavwgc25pvxn3mi";
+    };
+    nativeBuildInputs = [
+      # needed to create the output wheel in installPhase
+      python
+      setuptools
+      wheel
+      absl-py
+      tensorflow
+    ];
+
+    bazelTarget = ":pip_pkg";
+
+    fetchAttrs = {
+      sha256 = "0sgxdlw5x3dydy53l10vbrj8smh78b7r1wff8jxcgp4w69mk8zfm";
+    };
+
+    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
+  checkInputs = [
+    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; [];  # This package is maintainerless.
+  };
+}
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..b266f837f849
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tensorflow/bin.nix
@@ -0,0 +1,200 @@
+{ stdenv
+, lib
+, fetchurl
+, buildPythonPackage
+, isPy3k, pythonOlder, pythonAtLeast, astor
+, gast
+, google-pasta
+, wrapt
+, numpy
+, six
+, termcolor
+, packaging
+, protobuf
+, absl-py
+, grpcio
+, mock
+, scipy
+, wheel
+, opt-einsum
+, backports_weakref
+, tensorflow-estimator
+, tensorboard
+, cudaSupport ? false
+, cudaPackages ? {}
+, patchelfUnstable
+, 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: if x == "." then "" else 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};
+
+  propagatedBuildInputs = [
+    astunparse
+    flatbuffers
+    typing-extensions
+    packaging
+    protobuf
+    numpy
+    scipy
+    termcolor
+    grpcio
+    six
+    astor
+    absl-py
+    gast
+    opt-einsum
+    google-pasta
+    wrapt
+    tensorflow-estimator
+    tensorboard
+    keras-applications
+    keras-preprocessing
+    h5py
+  ] ++ lib.optional (!isPy3k) mock
+    ++ lib.optionals (pythonOlder "3.4") [ backports_weakref ];
+
+  # remove patchelfUnstable once patchelf 0.14 with https://github.com/NixOS/patchelf/pull/256 becomes the default
+  nativeBuildInputs = [ wheel ] ++ lib.optional cudaSupport [ addOpenGLRunpath patchelfUnstable ];
+
+  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 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.
+      sed -i *.dist-info/METADATA \
+        -e "/Requires-Dist: flatbuffers/d" \
+        -e "/Requires-Dist: gast/d" \
+        -e "/Requires-Dist: libclang/d" \
+        -e "/Requires-Dist: keras/d" \
+        -e "/Requires-Dist: tensorflow-estimator/d" \
+        -e "/Requires-Dist: tensorflow-io-gcs-filesystem/d"
+    )
+    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/tf2tensorrt/"
+        "$out/${python.sitePackages}/tensorflow/compiler/tf2xla/ops/"
+        "$out/${python.sitePackages}/tensorflow/lite/experimental/microfrontend/python/ops/"
+        "$out/${python.sitePackages}/tensorflow/lite/python/interpreter_wrapper/"
+        "$out/${python.sitePackages}/tensorflow/lite/python/optimize/"
+        "$out/${python.sitePackages}/tensorflow/python/"
+        "$out/${python.sitePackages}/tensorflow/python/framework/"
+        "$out/${python.sitePackages}/tensorflow/python/autograph/impl/testing"
+        "$out/${python.sitePackages}/tensorflow/python/data/experimental/service"
+        "$out/${python.sitePackages}/tensorflow/python/framework"
+        "$out/${python.sitePackages}/tensorflow/python/profiler/internal"
+        "${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 cdepillabout ];
+    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..b2ce20d93486
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tensorflow/binary-hashes.nix
@@ -0,0 +1,51 @@
+{
+version = "2.9.1";
+linux_py_37_cpu = {
+  url = "https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow_cpu-2.9.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl";
+  sha256 = "1wpqjqx3zfyrclhs6kkqhq76kmb45h2jv2jdi89jrk8pfk3mcf2k";
+};
+linux_py_38_cpu = {
+  url = "https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow_cpu-2.9.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl";
+  sha256 = "1np06xy18z8k29q8vg5a8kmvxpbcz0grjjww3hcpb4kvy9rx01sw";
+};
+linux_py_39_cpu = {
+  url = "https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow_cpu-2.9.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl";
+  sha256 = "1gy258wfgjf2f1lcpayvgx5cnncnqjcp2mj70mz50bm9mhmzl4kd";
+};
+linux_py_310_cpu = {
+  url = "https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow_cpu-2.9.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl";
+  sha256 = "0bh5xg4wfc86q1x7ph8bvdpa3arm6kmbvd4cg3d427sywkmdsrk6";
+};
+linux_py_37_gpu = {
+  url = "https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-2.9.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl";
+  sha256 = "1qsq7la0fpmk2hych7sy9k8mza1q7w05c4nmgq92cxgkmpa7d17x";
+};
+linux_py_38_gpu = {
+  url = "https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-2.9.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl";
+  sha256 = "0913znz5mg6mkryi24xhz4s7rwhxbx172fsk26lxl6w6qx219pfd";
+};
+linux_py_39_gpu = {
+  url = "https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-2.9.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl";
+  sha256 = "01srcvpcwpgpvb9inlc2mwsmf5sj13rqb695rvm50ybkjrrac7l4";
+};
+linux_py_310_gpu = {
+  url = "https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-2.9.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl";
+  sha256 = "19g93jig1x389ybc25ifsh1grrsghn3w2xgk029289432bnlpzp4";
+};
+mac_py_37_cpu = {
+  url = "https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-2.9.1-cp37-cp37m-macosx_10_14_x86_64.whl";
+  sha256 = "0b2hirjhqw4jl75h0ik1a9hgbkkq0b3gj4wkkp9vb6mi4116gxxi";
+};
+mac_py_38_cpu = {
+  url = "https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-2.9.1-cp38-cp38-macosx_10_14_x86_64.whl";
+  sha256 = "0da6csvldvxg47r932wbx5z6w3hf1d107p9blayzrjchdwhqs16z";
+};
+mac_py_39_cpu = {
+  url = "https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-2.9.1-cp39-cp39-macosx_10_14_x86_64.whl";
+  sha256 = "1fa0nf4pj5sl5shifaahr8n30q86k6hdsg0qwvan0hyg75fh9bc1";
+};
+mac_py_310_cpu = {
+  url = "https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-2.9.1-cp310-cp310-macosx_10_14_x86_64.whl";
+  sha256 = "0baq0djx8vhn8d75wyf82m6iqgfxwcrgg4xcvlr20m4x9bmysxrc";
+};
+}
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..338affcbf156
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tensorflow/default.nix
@@ -0,0 +1,535 @@
+{ stdenv, bazel_5, buildBazelPackage, isPy3k, lib, fetchFromGitHub, symlinkJoin
+, addOpenGLRunpath, fetchpatch, patchelfUnstable
+# Python deps
+, buildPythonPackage, pythonOlder, python
+# Python libraries
+, numpy, tensorboard, absl-py
+, packaging, setuptools, wheel, keras, keras-preprocessing, google-pasta
+, opt-einsum, astunparse, h5py
+, termcolor, grpcio, six, wrapt, protobuf-python, tensorflow-estimator
+, 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, lmdb-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
+, cudaSupport ? false, cudaPackages ? {}
+, mklSupport ? false, mkl ? null
+, tensorboardSupport ? true
+# XLA without CUDA is broken
+, xlaSupport ? cudaSupport
+# Default from ./configure script
+, cudaCapabilities ? [ "sm_35" "sm_50" "sm_60" "sm_70" "sm_75" "compute_80" ]
+, sse42Support ? stdenv.hostPlatform.sse4_2Support
+, avx2Support  ? stdenv.hostPlatform.avx2Support
+, fmaSupport   ? stdenv.hostPlatform.fmaSupport
+# Darwin deps
+, Foundation, Security, cctools, llvmPackages_11
+}:
+
+let
+  inherit (cudaPackages) cudatoolkit cudnn nccl;
+in
+
+assert cudaSupport -> cudatoolkit != null
+                   && cudnn != null;
+
+# unsupported combination
+assert ! (stdenv.isDarwin && cudaSupport);
+
+assert mklSupport -> mkl != null;
+
+let
+  withTensorboard = (pythonOlder "3.6") || tensorboardSupport;
+
+  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 = [
+      cudatoolkit.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.10.0-rc0";
+  variant = if cudaSupport then "-gpu" else "";
+  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
+      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";
+        sha256 = "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";
+        sha256 = "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: {
+    bazelBuildFlags = prev.bazelBuildFlags ++ [
+      "--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 (lib.optionalAttrs stdenv.isDarwin {
+    # clang 7 fails to emit a symbol for
+    # __ZN4llvm11SmallPtrSetIPKNS_10AllocaInstELj8EED1Ev in any of the
+    # translation units, so the build fails at link time
+    stdenv = llvmPackages_11.stdenv;
+  })) {
+    name = "${pname}-${version}";
+    bazel = bazel_5;
+
+    src = fetchFromGitHub {
+      owner = "tensorflow";
+      repo = "tensorflow";
+      rev = "v${version}";
+      hash = "sha256-zN8I0wxKrxWcI0RuOqDz6srdW0Q+kgaZhJdXM46N1e8=";
+    };
+
+    # 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
+    ] ++ lib.optional cudaSupport addOpenGLRunpath;
+
+    buildInputs = [
+      jemalloc
+      mpi
+      glibcLocales
+      git
+
+      # libs taken from system through the TF_SYS_LIBS mechanism
+      boringssl
+      curl
+      double-conversion
+      flatbuffers-core
+      giflib
+      grpc
+      icu
+      jsoncpp
+      libjpeg_turbo
+      libpng
+      lmdb-core
+      pybind11
+      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;
+
+    # 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"
+      # 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"
+      "lmdb"
+      "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}";
+    GCC_HOST_COMPILER_PREFIX = lib.optionalString cudaSupport "${cudatoolkit_cc_joined}/bin";
+    GCC_HOST_COMPILER_PATH = lib.optionalString cudaSupport "${cudatoolkit_cc_joined}/bin/gcc";
+    TF_CUDA_COMPUTE_CAPABILITIES = lib.concatStringsSep "," cudaCapabilities;
+
+    postPatch = ''
+      # bazel 3.3 should work just as well as bazel 3.1
+      rm -f .bazelversion
+    '' + 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
+    NIX_CFLAGS_COMPILE = [ "-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" ];
+
+    bazelTarget = "//tensorflow/tools/pip_package:build_pip_package //tensorflow/tools/lib_package:libtensorflow";
+
+    removeRulesCC = false;
+    # Without this Bazel complaints about sandbox violations.
+    dontAddBazelOpts = true;
+
+    fetchAttrs = {
+      # cudaSupport causes fetch of ncclArchive, resulting in different hashes
+      sha256 = if cudaSupport then
+        "sha256-KtVReqHL3zxE8TPrqIerSOt59Mgke/ftoFZKMzgX/u8="
+      else
+        if stdenv.isDarwin then
+          # FIXME: this checksum is currently wrong, since the tensorflow dependency fetch is broken on darwin
+          "sha256-j2k9Q+k41nq5nP1VjjkkNjXRov1uAda4RCMDMAthjr0="
+        else
+          "sha256-zH3xNFEU2JR0Ww8bpD4mCiorGtao0WVPP4vklVMgS4A=";
+    };
+
+    buildAttrs = {
+      outputs = [ "out" "python" ];
+
+      preBuild = ''
+        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; {
+      description = "Computation using data flow graphs for scalable machine learning";
+      homepage = "http://tensorflow.org";
+      license = licenses.asl20;
+      maintainers = with maintainers; [ jyp abbradar ];
+      platforms = with platforms; linux ++ darwin;
+      broken = !(xlaSupport -> cudaSupport);
+    } // lib.optionalAttrs stdenv.isDarwin {
+      timeout = 86400; # 24 hours
+      maxSilent = 14400; # 4h, double the default of 7200s
+    };
+  };
+
+in buildPythonPackage {
+  inherit version pname;
+  disabled = !isPy3k;
+
+  src = bazel-build.python;
+
+  # Adjust dependency requirements:
+  # - 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 "s/'flatbuffers[^']*',/'flatbuffers',/" \
+      -e "s/'gast[^']*',/'gast',/" \
+      -e "/'libclang[^']*',/d" \
+      -e "/'keras[^']*')\?,/d" \
+      -e "/'tensorflow-io-gcs-filesystem[^']*',/d"
+  '';
+
+  # 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
+    astunparse
+    flatbuffers-python
+    gast
+    google-pasta
+    grpcio
+    h5py
+    keras-preprocessing
+    numpy
+    opt-einsum
+    packaging
+    protobuf-python
+    six
+    tensorflow-estimator
+    termcolor
+    typing-extensions
+    wrapt
+  ] ++ lib.optionals withTensorboard [
+    tensorboard
+  ];
+
+  # remove patchelfUnstable once patchelf 0.14 with https://github.com/NixOS/patchelf/pull/256 becomes the default
+  nativeBuildInputs = lib.optional cudaSupport [ addOpenGLRunpath patchelfUnstable ];
+
+  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
+  checkInputs = [
+    dill
+    keras
+    portpicker
+    tblib
+  ];
+  checkPhase = ''
+    ${python.interpreter} <<EOF
+    # A simple "Hello world"
+    import tensorflow as tf
+    hello = tf.constant("Hello, world!")
+    tf.print(hello)
+
+    # Fit a simple model to random data
+    import numpy as np
+    np.random.seed(0)
+    tf.random.set_seed(0)
+    model = tf.keras.models.Sequential([
+        tf.keras.layers.Dense(1, activation="linear")
+    ])
+    model.compile(optimizer="sgd", loss="mse")
+
+    x = np.random.uniform(size=(1,1))
+    y = np.random.uniform(size=(1,))
+    model.fit(x, y, epochs=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..2e24cde079da
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tensorflow/prefetcher.sh
@@ -0,0 +1,46 @@
+#!/usr/bin/env bash
+
+version="2.9.1"
+
+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_37_cpu $bucket/linux/cpu/tensorflow_cpu-${version}-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl"
+"linux_py_38_cpu $bucket/linux/cpu/tensorflow_cpu-${version}-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl"
+"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_37_gpu $bucket/linux/gpu/tensorflow_gpu-${version}-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl"
+"linux_py_38_gpu $bucket/linux/gpu/tensorflow_gpu-${version}-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl"
+"linux_py_39_gpu $bucket/linux/gpu/tensorflow_gpu-${version}-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl"
+"linux_py_310_gpu $bucket/linux/gpu/tensorflow_gpu-${version}-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl"
+"mac_py_37_cpu $bucket/mac/cpu/tensorflow-${version}-cp37-cp37m-macosx_10_14_x86_64.whl"
+"mac_py_38_cpu $bucket/mac/cpu/tensorflow-${version}-cp38-cp38-macosx_10_14_x86_64.whl"
+"mac_py_39_cpu $bucket/mac/cpu/tensorflow-${version}-cp39-cp39-macosx_10_14_x86_64.whl"
+"mac_py_310_cpu $bucket/mac/cpu/tensorflow-${version}-cp310-cp310-macosx_10_14_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/tensorly/default.nix b/nixpkgs/pkgs/development/python-modules/tensorly/default.nix
new file mode 100644
index 000000000000..58260b62d0b4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tensorly/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, numpy
+, pytestCheckHook
+, pythonOlder
+, scipy
+, sparse
+}:
+
+buildPythonPackage rec {
+  pname = "tensorly";
+  version = "0.7.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-VcX3pCczZQUYZaD7xrrkOcj0QPJt28cYTwpZm5D/X3c=";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    scipy
+    sparse
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    # nose is not actually required for anything
+    # (including testing with the minimal dependencies)
+    substituteInPlace setup.py \
+      --replace ", 'nose'" ""
+  '';
+
+  pythonImportsCheck = [
+    "tensorly"
+  ];
+
+  pytestFlagsArray = [
+    "tensorly"
+  ];
+
+  disabledTests = [
+    # 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..30da346c810e
--- /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
+  ];
+
+  pythonCheckImports = [
+    "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/termcolor/default.nix b/nixpkgs/pkgs/development/python-modules/termcolor/default.nix
new file mode 100644
index 000000000000..e440dab114fa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/termcolor/default.nix
@@ -0,0 +1,21 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "termcolor";
+  version = "1.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1d6d69ce66211143803fbc56652b41d73b4a400a2891d7bf7a1cdf4c02de613b";
+  };
+
+  meta = with lib; {
+    description = "Termcolor";
+    homepage = "https://pypi.python.org/pypi/termcolor";
+    license = licenses.mit;
+  };
+
+}
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..ac5481e13a8e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/terminado/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, hatchling
+, ptyprocess
+, tornado
+, pytest-timeout
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "terminado";
+  version = "0.15.0";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-q07u3M/MHmE0v+6GEGr5CFLGnWAohOo6Hoym1Ehum/4=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    ptyprocess
+    tornado
+  ];
+
+  pythonImportsCheck = [
+    "terminado"
+  ];
+
+  checkInputs = [
+    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..fde1080491e0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/termplotlib/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, substituteAll
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, exdown
+, numpy
+, gnuplot
+}:
+
+buildPythonPackage rec {
+  pname = "termplotlib";
+  version = "0.3.9";
+
+  src = fetchFromGitHub {
+    owner = "nschloe";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1qfrv2w7vb2bbjvd5lqfq57c23iqkry0pwmif1ha3asmz330rja1";
+  };
+
+  format = "pyproject";
+  checkInputs = [
+    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..635733149504
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tern/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pyyaml
+, docker
+, dockerfile-parse
+, requests
+, stevedore
+, pbr
+, debian-inspector
+, license-expression
+, regex
+, GitPython
+, prettytable
+, idna
+, packageurl-python
+}:
+
+buildPythonPackage rec {
+  pname = "tern";
+  version = "2.10.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-MMsq8/Obe3ogQSjiP8EebYseUJGcchMOczUrxE9jht4=";
+  };
+
+  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";
+    license = licenses.bsd2;
+    maintainers = teams.determinatesystems.members;
+  };
+}
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..d879d9302eb0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tesla-powerwall/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, requests
+, responses
+}:
+
+buildPythonPackage rec {
+  pname = "tesla-powerwall";
+  version = "0.3.18";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "jrester";
+    repo = "tesla_powerwall";
+    rev = "v${version}";
+    hash = "sha256-Z+axzTiKDgJqGhl2c6g7N1AbmXO46lbaHVOXhMstoCY=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    responses
+  ];
+
+  pytestFlagsArray = [
+    "tests/unit"
+  ];
+
+  pythonImportsCheck = [
+    "tesla_powerwall"
+  ];
+
+  meta = with lib; {
+    description = "API for Tesla Powerwall";
+    homepage = "https://github.com/jrester/tesla_powerwall";
+    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..85cbff5a1d9a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tesla-wall-connector/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, aiohttp
+, aioresponses
+, aresponses
+, backoff
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "tesla-wall-connector";
+  version = "1.0.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "einarhauks";
+    repo = pname;
+    rev = version;
+    hash = "sha256-JBtlGd9aHY8ikhpJ5v7ZcNu3BfLdBmOBZCMa6C0s6gE=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    backoff
+  ];
+
+  checkInputs = [
+    aresponses
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'backoff = "^1.11.1"' 'backoff = "*"'
+  '';
+
+  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..2c0c38daccb0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/teslajsonpy/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, aiohttp
+, authcaptureproxy
+, backoff
+, beautifulsoup4
+, buildPythonPackage
+, fetchFromGitHub
+, httpx
+, poetry-core
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, wrapt
+}:
+
+buildPythonPackage rec {
+  pname = "teslajsonpy";
+  version = "2.4.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "zabuldon";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-YkutsaxPxspIclRlcr5dzk7JKvlX6IXbccca3NLFtSo=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    authcaptureproxy
+    aiohttp
+    backoff
+    beautifulsoup4
+    httpx
+    wrapt
+  ];
+
+  checkInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "teslajsonpy"
+  ];
+
+  meta = with lib; {
+    description = "Python library to work with Tesla API";
+    homepage = "https://github.com/zabuldon/teslajsonpy";
+    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..883d541f8120
--- /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 = [ maintainers.costrouc ];
+  };
+}
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..0b21e17f96b0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tesserocr/default.nix
@@ -0,0 +1,34 @@
+{
+  buildPythonPackage,
+  fetchPypi,
+  lib,
+  # build dependencies
+  cython,
+  leptonica,
+  pkg-config,
+  tesseract,
+  # extra python packages
+  pillow
+}:
+
+buildPythonPackage rec {
+  pname = "tesserocr";
+  version = "2.5.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1bmj76gi8401lcqdaaznfmz9yf11myy1bzivqwwq08z3dwzxswck";
+  };
+
+  nativeBuildInputs = [ cython pkg-config ];
+  buildInputs = [ leptonica tesseract ];
+  propagatedBuildInputs = [ pillow ];
+
+  meta = with lib; {
+    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..5eac0d60b6cf
--- /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
+, pytorch
+, tensorboard
+}:
+
+buildPythonPackage rec {
+  pname = "test-tube";
+  version = "0.628";
+
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "williamFalcon";
+    repo = pname;
+    rev = version;
+    sha256 = "0w60xarmcw06gc4002sy7bjfykdz34gbgniswxkl0lw8a1v0xn2m";
+  };
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  propagatedBuildInputs = [
+    future
+    imageio
+    numpy
+    pandas
+    pytorch
+    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/testcontainers/default.nix b/nixpkgs/pkgs/development/python-modules/testcontainers/default.nix
new file mode 100644
index 000000000000..65c8ed8bf460
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/testcontainers/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, deprecation
+, docker
+, wrapt }:
+
+buildPythonPackage rec {
+  pname = "testcontainers";
+  version = "3.5.0";
+
+  src = fetchFromGitHub {
+    owner = "testcontainers";
+    repo = "testcontainers-python";
+    rev = "v${version}";
+    sha256 = "sha256-uB3MbRVQzbUdZRxkGl635O+K17bkHIGY2JbU8R23Kt0=";
+  };
+
+  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..9f0de060d7d4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/testfixtures/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, mock
+, pytestCheckHook
+, pythonAtLeast
+, pythonOlder
+, sybil
+, twisted
+, zope_component
+}:
+
+buildPythonPackage rec {
+  pname = "testfixtures";
+  version = "7.0.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-jsrFowh5NFFkBZTZykLOibmHcR4eTJMShVMh7CH2zLQ=";
+  };
+
+  checkInputs = [
+    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";
+    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..fd88ea03bf72
--- /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";
+    sha256 = "sha256-A4tahAaa98X66ZYa3QxIQDZkwAwVB6ZDRObEhkbUWKs=";
+  };
+
+  propagatedBuildInputs = [
+    testing-common-database
+    pg8000
+  ];
+
+  checkInputs = [
+    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..4db5aa362f4a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/testpath/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, flit-core
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "testpath";
+  version = "0.6.0";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-LxuX5kQsAmgevgG9hPUxAop8rqGvOCUAD1I0XDAoXg8=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  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/testrepository/default.nix b/nixpkgs/pkgs/development/python-modules/testrepository/default.nix
new file mode 100644
index 000000000000..45093a5f7cf7
--- /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";
+  };
+
+  checkInputs = [ 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..1aaddc3dec9c
--- /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 ];
+
+  checkInputs = [ 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..430d0374ef20
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/testtools/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonRelaxDepsHook
+, pbr
+, python-mimeparse
+, extras
+, unittest2
+, traceback2
+, testscenarios
+}:
+
+buildPythonPackage rec {
+  pname = "testtools";
+  version = "2.5.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "57c13433d94f9ffde3be6534177d10fb0c1507cc499319128958ca91a65cb23f";
+  };
+
+  propagatedBuildInputs = [ pbr python-mimeparse extras ];
+  buildInputs = [ traceback2 ];
+  nativeBuildInputs = [ pythonRelaxDepsHook ];
+
+  # testscenarios has a circular dependency on testtools
+  doCheck = false;
+  checkInputs = [ 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..5f5a0bf85127
--- /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";
+  };
+
+  checkInputs = [ 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..2eae44aeeb27
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/textacy/default.nix
@@ -0,0 +1,71 @@
+{ lib
+, buildPythonPackage
+, cachetools
+, cytoolz
+, fetchPypi
+, jellyfish
+, joblib
+, matplotlib
+, networkx
+, numpy
+, pyemd
+, pyphen
+, pytestCheckHook
+, pythonOlder
+, requests
+, scikit-learn
+, scipy
+, spacy
+, tqdm
+}:
+
+buildPythonPackage rec {
+  pname = "textacy";
+  version = "0.12.0";
+  disabled = pythonOlder "3.7";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "2c92bdd6b47305447b64e4cb6cc43c11675f021f910a8074bc8149dbf5325e5b";
+  };
+
+  propagatedBuildInputs = [
+    cachetools
+    cytoolz
+    jellyfish
+    joblib
+    matplotlib
+    networkx
+    numpy
+    pyemd
+    pyphen
+    requests
+    scikit-learn
+    scipy
+    spacy
+    tqdm
+  ];
+
+  checkInputs = [
+    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..c6def554a641
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/textdistance/default.nix
@@ -0,0 +1,23 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "textdistance";
+  version = "4.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-T2vAf2ZX5pNA1MytsleAoScCWy9rccQELi0BByC0yo4=";
+  };
+
+  # 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";
+    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..e1bfdb5909df
--- /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}";
+    sha256 = "sha256-IHgKG8v0X+LSK6purWBdwDnI/BCs5XA12ZJixuqqXWg=";
+  };
+
+  propagatedBuildInputs = [
+    six
+    future
+  ];
+
+  checkInputs = [
+    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..a8acf346cd60
--- /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
+  ];
+
+  checkInputs = [
+    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/texttable/default.nix b/nixpkgs/pkgs/development/python-modules/texttable/default.nix
new file mode 100644
index 000000000000..b104bd845962
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/texttable/default.nix
@@ -0,0 +1,20 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "texttable";
+  version = "1.6.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "42ee7b9e15f7b225747c3fa08f43c5d6c83bc899f80ff9bae9319334824076e9";
+  };
+
+  meta = with lib; {
+    description = "A module to generate a formatted text table, using ASCII characters";
+    homepage = "https://github.com/foutaise/texttable";
+    license = licenses.lgpl2;
+  };
+}
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..5806b28e3490
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/textual/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, rich
+, typing-extensions
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "textual";
+  version = "0.1.18";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Textualize";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-XVmbt8r5HL8r64ISdJozmM+9HuyvqbpdejWICzFnfiw=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    rich
+  ] ++ lib.optionals (pythonOlder "3.9") [
+    typing-extensions
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'rich = "^12.3.0"' 'rich = "*"'
+  '';
+
+  pythonImportsCheck = [
+    "textual"
+  ];
+
+  meta = with lib; {
+    description = "TUI framework for Python inspired by modern web development";
+    homepage = "https://github.com/Textualize/textual";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jyooru ];
+  };
+}
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..995a62230b22
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/textwrap3/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, tox
+, pytest
+, coverage
+, pytest-cov
+}:
+
+buildPythonPackage rec {
+  pname = "textwrap3";
+  version = "0.9.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "5008eeebdb236f6303dcd68f18b856d355f6197511d952ba74bc75e40e0c3414";
+  };
+
+  checkInputs = [
+    tox
+    pytest
+    coverage
+    pytest-cov
+  ];
+
+  checkPhase = ''
+    pytest
+  '';
+
+  meta = with lib; {
+    description = "Textwrap from Python 3.6 backport plus a few tweaks";
+    homepage = "https://github.com/jonathaneunice/textwrap3";
+    license = licenses.psfl;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..0a8ee2236519
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/textx/default.nix
@@ -0,0 +1,178 @@
+{ lib
+, buildPythonPackage
+, python
+, fetchFromGitHub
+, mkdocs
+, twine
+, arpeggio
+, click
+, future
+, setuptools
+, callPackage
+, gprof2dot
+, html5lib
+, jinja2
+, memory_profiler
+, psutil
+, pytestCheckHook
+}:
+
+let
+  textx = buildPythonPackage rec {
+    pname = "textx";
+    version = "3.0.0";
+    format = "setuptools";
+
+    src = fetchFromGitHub {
+      owner = pname;
+      repo = pname;
+      rev = version;
+      sha256 = "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..021224e9f35d
--- /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;
+
+  checkInputs = [
+    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/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/tgcrypto/default.nix b/nixpkgs/pkgs/development/python-modules/tgcrypto/default.nix
new file mode 100644
index 000000000000..728676b53b38
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tgcrypto/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "tgcrypto";
+  version = "1.2.3";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "pyrogram";
+    repo = "tgcrypto";
+    rev = "v${version}";
+    sha256 = "06g1kv3skq2948h0sjf64s1cr2p1rhxnx5pf9nmvhxkmri1xmfzs";
+  };
+
+  checkInputs = [
+    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..ad0b93fe0940
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/theano-pymc/default.nix
@@ -0,0 +1,48 @@
+{ 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 ];
+  };
+}
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..7a4f0e5ee855
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/thespian/default.nix
@@ -0,0 +1,25 @@
+{ fetchPypi, buildPythonPackage, lib }:
+
+buildPythonPackage rec {
+  version = "3.10.6";
+  pname = "thespian";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "c987a8042ba2303e22371f38a67354593dd81c4c11ba1eba7f6657409288d5ed";
+  };
+
+  # 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..79faa769ddf3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/thinc/default.nix
@@ -0,0 +1,101 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, python
+, fetchPypi
+, pytestCheckHook
+, blis
+, catalogue
+, cymem
+, cython
+, contextvars
+, dataclasses
+, Accelerate
+, CoreFoundation
+, CoreGraphics
+, CoreVideo
+, hypothesis
+, mock
+, murmurhash
+, numpy
+, plac
+, pythonOlder
+, preshed
+, pydantic
+, srsly
+, tqdm
+, typing-extensions
+, wasabi
+}:
+
+buildPythonPackage rec {
+  pname = "thinc";
+  version = "8.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-6q6pHcVsBBUWqCnEYEI6iu9TVwAWEMjWOVvOldglSgs=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "pydantic>=1.7.4,!=1.8,!=1.8.1,<1.9.0" "pydantic"
+  '';
+
+  buildInputs = [
+    cython
+  ] ++ lib.optionals stdenv.isDarwin [
+    Accelerate
+    CoreFoundation
+    CoreGraphics
+    CoreVideo
+  ];
+
+  propagatedBuildInputs = [
+    blis
+    catalogue
+    cymem
+    murmurhash
+    numpy
+    plac
+    preshed
+    srsly
+    tqdm
+    pydantic
+    wasabi
+  ] ++ lib.optional (pythonOlder "3.8") [
+    typing-extensions
+  ] ++ lib.optional (pythonOlder "3.7") [
+    contextvars
+    dataclasses
+  ];
+
+  checkInputs = [
+    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 = "Practical Machine Learning for NLP in Python";
+    homepage = "https://github.com/explosion/thinc";
+    license = licenses.mit;
+    maintainers = with maintainers; [ aborsu ];
+  };
+}
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..3a0b523784a3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/threadpoolctl/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, flit
+, pytestCheckHook
+, numpy
+, scipy
+}:
+
+buildPythonPackage rec {
+  pname = "threadpoolctl";
+  version = "3.1.0";
+
+  disabled = pythonOlder "3.6";
+  format = "flit";
+
+  src = fetchFromGitHub {
+    owner = "joblib";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-/qt7cgFbvpc1BLZC7a4S0RToqSggKXAqF1Xr6xOqzw8=";
+  };
+
+  checkInputs = [ pytestCheckHook numpy scipy ];
+  disabledTests = [
+    # accepts a limited set of cpu models based on project
+    # developers' hardware
+    "test_architecture"
+  ];
+
+  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..35d5f1389fd1
--- /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
+  ];
+
+  checkInputs = [
+    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..dab312c88455
--- /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; [ SuperSandro2000 ];
+  };
+}
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..dcb6f434411a
--- /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;
+    sha256 = "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..0d5f5afe4a5c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/thriftpy2/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, cython
+, fetchFromGitHub
+, pythonOlder
+, ply
+, six
+, tornado
+}:
+
+buildPythonPackage rec {
+  pname = "thriftpy2";
+  version = "0.4.14";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "Thriftpy";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "17f57vsbym4c9yax128bhrwg2zjxcsgl3ja6422y8hyb38v5mdc3";
+  };
+
+  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";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
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/tifffile/default.nix b/nixpkgs/pkgs/development/python-modules/tifffile/default.nix
new file mode 100644
index 000000000000..2452c6bb4453
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tifffile/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, dask
+, fetchPypi
+, fsspec
+, lxml
+, numpy
+, pytestCheckHook
+, pythonOlder
+, zarr
+}:
+
+buildPythonPackage rec {
+  pname = "tifffile";
+  version = "2022.5.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-sDFHoVhit8HZDUdDUZfxSb73pSwlrWfPH5tGX6pxuNI=";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  checkInputs = [
+    dask
+    fsspec
+    lxml
+    pytestCheckHook
+    zarr
+  ];
+
+  disabledTests = [
+    # Test require network access
+    "test_class_omexml"
+    "test_write_ome"
+    # Test file is missing
+    "test_write_predictor"
+    # AssertionError
+    "test_write_bigtiff"
+    "test_write_imagej_raw"
+    # https://github.com/cgohlke/tifffile/issues/142
+    "test_func_bitorder_decode"
+  ];
+
+  pythonImportsCheck = [
+    "tifffile"
+  ];
+
+  meta = with lib; {
+    description = "Read and write image data from and to TIFF files";
+    homepage = "https://github.com/cgohlke/tifffile/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ lebastr ];
+  };
+}
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..375560ad9817
--- /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 = "1.24";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "wsUPQFYi90UxhBEE+ehcF1Ea7eEd6OU4XqsaKaMfGRs=";
+  };
+
+  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/tikzplotlib/default.nix b/nixpkgs/pkgs/development/python-modules/tikzplotlib/default.nix
new file mode 100644
index 000000000000..ebf58dd12e9c
--- /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}";
+    sha256 = "sha256-PLExHhEnxkEiXsE0rqvpNWwVZ+YoaDa2BTx8LktdHl0=";
+  };
+
+  propagatedBuildInputs = [
+    matplotlib
+    numpy
+    pillow
+    webcolors
+    flit-core
+  ];
+
+  checkInputs = [
+    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..99020f8d7ac1
--- /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.16.3";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "TileDB-Inc";
+    repo = "TileDB-Py";
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-Tg2MHlLwwcpXoHoflaNWXmXr6s7dg3IJou4PZBahRzc=";
+  };
+
+  nativeBuildInputs = [
+    cython
+    pybind11
+    setuptools-scm
+  ];
+
+  buildInputs = [
+    tiledb
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    wheel # No idea why but it is listed
+  ];
+
+  checkInputs = [
+    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..90caab8ebef8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tilequant/default.nix
@@ -0,0 +1,38 @@
+{ lib, buildPythonPackage, fetchFromGitHub, GitPython, click, ordered-set, pillow, sortedcollections }:
+
+let
+  aikku93-tilequant = fetchFromGitHub {
+    owner = "SkyTemple";
+    repo = "aikku93-tilequant";
+    rev = "6604e0906edff384b6c8d4cde03e6601731f66fd";
+    sha256 = "0w19h3n2i0xriqsy0b0rifjgbv4hqd7gl78fw0cappkrdykij5r1";
+  };
+in
+buildPythonPackage rec {
+  pname = "tilequant";
+  version = "0.4.0.post0";
+
+  src = fetchFromGitHub {
+    owner = "SkyTemple";
+    repo = pname;
+    rev = version;
+    sha256 = "189af203iay3inj1bbgm3hh1fshn879bcm28ypbvfp27fy7j5b25";
+  };
+
+  postPatch = ''
+    cp -R --no-preserve=mode ${aikku93-tilequant} __aikku93_tilequant
+  '';
+
+  buildInputs = [ GitPython ];
+  propagatedBuildInputs = [ click ordered-set pillow sortedcollections ];
+
+  doCheck = false; # there are no tests
+  pythonImportsCheck = [ "skytemple_tilequant" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/SkyTemple/tilequant";
+    description = "Tool for quantizing image colors using tile-based palette restrictions";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ 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..0c1e44f1400d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tiler/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, numpy
+, tqdm
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "tiler";
+  version = "0.5.7";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-2HWO/iJ9RCWNVmw2slu9F/+Mchk3evB5/F8EfbuMI/Y=";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    tqdm
+  ];
+
+  checkInputs = [
+    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/time-machine/default.nix b/nixpkgs/pkgs/development/python-modules/time-machine/default.nix
new file mode 100644
index 000000000000..f28b8ebf2292
--- /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.8.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "adamchainz";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-L/03H91iZTyaB8vY0FGVu9iaesISAFHLIZliHI1NixI=";
+  };
+
+  propagatedBuildInputs = [
+    python-dateutil
+  ] ++ lib.optionals (pythonOlder "3.9") [
+    backports-zoneinfo
+  ];
+
+  checkInputs = [
+    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..0c2a688f674e
--- /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.15";
+
+  src = fetchFromGitHub {
+    owner = "hustcc";
+    repo = pname;
+    rev = version;
+    sha256 = "03vm7c02l4g2d1x33w382i1psk8i3an7xchk69yinha33fjj1cag";
+  };
+
+  checkInputs = [
+    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..e2f3cc1d3cc8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/timelib/default.nix
@@ -0,0 +1,22 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "timelib";
+  version = "0.2.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "6ac9f79b09b63bbc07db88525c1f62de1f6d50b0fd9937a0cb05e3d38ce0af45";
+  };
+
+  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/timetagger/default.nix b/nixpkgs/pkgs/development/python-modules/timetagger/default.nix
new file mode 100644
index 000000000000..6ecacbca809d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/timetagger/default.nix
@@ -0,0 +1,53 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchFromGitHub
+, asgineer
+, itemdb
+, jinja2
+, markdown
+, pscript
+, pyjwt
+, uvicorn
+, pytestCheckHook
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "timetagger";
+  version = "22.6.6";
+
+  src = fetchFromGitHub {
+    owner = "almarklein";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-2qPtC8gsRw9ZOkl+H8euTwTrPVAB0cdfFflhbLqXz/I=";
+  };
+
+  propagatedBuildInputs = [
+    asgineer
+    itemdb
+    jinja2
+    markdown
+    pscript
+    pyjwt
+    uvicorn
+  ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  checkInputs = [
+    pytestCheckHook
+    requests
+  ];
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    homepage = "https://timetagger.app";
+    license = licenses.gpl3Only;
+    description = "Tag your time, get the insight";
+    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..f5dc5f7c346f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/timezonefinder/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, h3
+, numba
+, numpy
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "timezonefinder";
+  version = "6.0.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "jannikmi";
+    repo = pname;
+    rev = version;
+    hash = "sha256-jquaA/+alSRUaa2wXQ6YoDR4EY9OlZCAdcxS5TR0CAU=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    h3
+    numpy
+  ];
+
+  checkInputs = [
+    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; {
+    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/tinycss/default.nix b/nixpkgs/pkgs/development/python-modules/tinycss/default.nix
new file mode 100644
index 000000000000..42250b058d58
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tinycss/default.nix
@@ -0,0 +1,47 @@
+{ pkgs
+, buildPythonPackage
+, fetchPypi
+, pytest
+, python
+, cython
+, cssutils
+, isPyPy
+}:
+
+buildPythonPackage rec {
+  pname = "tinycss";
+  version = "0.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "12306fb50e5e9e7eaeef84b802ed877488ba80e35c672867f548c0924a76716e";
+  };
+
+  checkInputs = [ pytest ];
+  propagatedBuildInputs = [ cssutils ];
+  nativeBuildInputs = [
+    cython
+  ];
+
+  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
+  '';
+
+  checkPhase = ''
+    py.test $out/${python.sitePackages}
+  '';
+
+  # Disable Cython tests for PyPy
+  TINYCSS_SKIP_SPEEDUPS_TESTS = pkgs.lib.optional isPyPy true;
+
+  meta = with pkgs.lib; {
+    description = "Complete yet simple CSS parser for Python";
+    license = licenses.bsd3;
+    homepage = "https://pythonhosted.org/tinycss/";
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..7e49433bc2f3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tinycss2/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, webencodings
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "tinycss2";
+  version = "1.1.0";
+  disabled = pythonOlder "3.5";
+  format = "flit";
+
+  src = fetchFromGitHub {
+    owner = "kozea";
+    repo = "tinycss2";
+    rev = "v${version}";
+    # for tests
+    fetchSubmodules = true;
+    sha256 = "sha256-WA88EYolL76WqeA1UKR3Sfw11j8NuOGOxPezujYizH8=";
+  };
+
+  propagatedBuildInputs = [ webencodings ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "'pytest-cov', 'pytest-flake8', 'pytest-isort', 'coverage[toml]'" "" \
+      --replace "--isort --flake8 --cov" ""
+  '';
+
+  meta = with lib; {
+    description = "Low-level CSS parser for Python";
+    homepage = "https://github.com/Kozea/tinycss2";
+    license = licenses.bsd3;
+  };
+}
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..ae08cceab1ee
--- /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.7.0";
+  disabled = pythonOlder "3.5";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "msiemens";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-cAIo/qdIOIpPt9vPan5oJfKtH2Gmrm03aLuAHpfUfLY=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  postPatch = ''
+    substituteInPlace pytest.ini \
+      --replace "--cov-append --cov-report term --cov tinydb" ""
+  '';
+
+  checkInputs = [
+    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/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..33fe952ad2a3
--- /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.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "ppannuto";
+    repo = "python-titlecase";
+    rev = "v${version}";
+    sha256 = "169ywzn5wfzwyknqavspkdpwbx31nycxsxkl7iywwk71gs1lskkw";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    regex
+  ];
+
+  checkInputs = [
+    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..9f82dee45ef0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tkinter/default.nix
@@ -0,0 +1,30 @@
+{ 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;
+
+}
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..178ce54c8846
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tld/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, factory_boy
+, faker
+, fetchPypi
+, pytest-cov
+, pytestCheckHook
+, tox
+}:
+
+buildPythonPackage rec {
+  pname = "tld";
+  version = "0.12.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "69fed19d26bb3f715366fb4af66fdeace896c55c052b00e8aaba3a7b63f3e7f0";
+  };
+
+  checkInputs = [
+    factory_boy
+    faker
+    pytest-cov
+    pytestCheckHook
+    tox
+  ];
+
+  # 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; {
+    homepage = "https://github.com/barseghyanartur/tld";
+    description = "Extracts the top level domain (TLD) from the URL given";
+    # 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..f92ea4b8dd8a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tldextract/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, filelock
+, idna
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+, requests
+, requests-file
+, responses
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname   = "tldextract";
+  version = "3.3.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-/hWsMgXlolthaJNp+Yy0XHd4qPKvET18EVWezlGV8tY=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    filelock
+    idna
+    requests
+    requests-file
+  ];
+
+  checkInputs = [
+    pytest-mock
+    pytestCheckHook
+    responses
+  ];
+
+  postPatch = ''
+    substituteInPlace pytest.ini \
+      --replace " --pylint" ""
+  '';
+
+  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";
+    license = with licenses; [ bsd3 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..a886e116e458
--- /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.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "nabla-c0d3";
+    repo = "tls_parser";
+    rev = version;
+    hash = "sha256-A1lYRe1sHDoOFdF20DP+xRMcPBWzokIXFphIpaBmwBc=";
+  };
+
+  checkInputs = [
+    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..dfa7a95e3970
--- /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;
+    sha256 = "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..37751890c7b3
--- /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 = [ maintainers.erictapen ];
+  };
+
+}
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/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/default.nix b/nixpkgs/pkgs/development/python-modules/todoist/default.nix
new file mode 100644
index 000000000000..d4797bdfad35
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/todoist/default.nix
@@ -0,0 +1,22 @@
+{ lib, fetchPypi, buildPythonPackage
+, requests, pythonOlder, typing
+}:
+
+buildPythonPackage rec {
+  pname = "todoist-python";
+  version = "8.1.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-AFRKA5VRD6jyiguZYP7WOQOWqHq1GjUzbuez0f1070U=";
+  };
+
+  propagatedBuildInputs = [ requests ] ++ lib.optional (pythonOlder "3.5") typing;
+
+  meta = with lib; {
+    description = "The official Todoist Python API library";
+    homepage = "https://todoist-python.readthedocs.io/en/latest/";
+    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..af6132cd2771
--- /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;
+    sha256 = "sha256-ncMwiMwYivaFu5jrAsm1oCuXP/PZ2ALT+M+CmV6dtFo=";
+  };
+
+  nativeBuildInputs = [
+    pbr
+    twine
+  ];
+
+  propagatedBuildInputs = [
+    click
+    click-completion
+    inquirer
+    notify-py
+    pbr
+    pendulum
+    ptable
+    requests
+    validate-email
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    pytest-mock
+    faker
+    factory_boy
+  ];
+
+  postPatch = ''
+    substituteInPlace requirements.txt \
+      --replace "notify-py==0.3.1" "notify-py>=0.3.1" \
+      --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..508e38da4500
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/token-bucket/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-runner
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "token-bucket";
+  version = "0.3.0";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "falconry";
+    repo = pname;
+    rev = version;
+    sha256 = "0a703y2d09kvv2l9vq7vc97l4pi2wwq1f2hq783mbw2238jymb3m";
+  };
+
+  nativeBuildInputs = [
+    pytest-runner
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Token Bucket Implementation for Python Web Apps";
+    homepage = "https://github.com/falconry/token-bucket";
+    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..556c35c30705
--- /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}";
+    sha256 = "sha256-YNt4YwkuA3DVq4EjJaIES9V3A6ENa3k6/qVKisjA5Pc=";
+  };
+
+  checkInputs = [ 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/default.nix b/nixpkgs/pkgs/development/python-modules/tokenizers/default.nix
new file mode 100644
index 000000000000..2ff5c452a173
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tokenizers/default.nix
@@ -0,0 +1,145 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, datasets
+, fetchFromGitHub
+, fetchurl
+, libiconv
+, numpy
+, openssl
+, pkg-config
+, pytestCheckHook
+, pythonOlder
+, requests
+, rustPlatform
+, 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.12.1";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "huggingface";
+    repo = pname;
+    rev = "python-v${version}";
+    hash = "sha256-XIXKgcqa6ToAH4OkyaaJALOS9F+sD8d5Z71RttRcIsw=";
+  };
+
+  cargoDeps = rustPlatform.fetchCargoTarball {
+    inherit src sourceRoot;
+    name = "${pname}-${version}";
+    sha256 = "sha256-Euvf0LNMa2Od+6gY1Ldge/7VPrH5mJoZduRRsb+lM/E=";
+  };
+
+  sourceRoot = "source/bindings/python";
+
+  nativeBuildInputs = [
+    pkg-config
+    setuptools-rust
+  ] ++ (with rustPlatform; [
+    cargoSetupHook
+    rust.cargo
+    rust.rustc
+  ]);
+
+  buildInputs = [
+    openssl
+  ] ++ lib.optionals stdenv.isDarwin [
+    libiconv
+    Security
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  checkInputs = [
+    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/tololib/default.nix b/nixpkgs/pkgs/development/python-modules/tololib/default.nix
new file mode 100644
index 000000000000..63720359dabd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tololib/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitLab
+, fetchpatch
+, pytestCheckHook
+, pythonOlder
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "tololib";
+  version = "0.1.0b3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitLab {
+    owner = "MatthiasLohr";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "qkdMy6/ZuBksbBTbDhPyCPWMjubQODjdMsqHTJ7QvQI=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  checkInputs = [
+    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";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..bbd928ac16c7
--- /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;
+    sha256 = "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..c9c9cb46b2c7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tomli/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, callPackage
+, fetchFromGitHub
+, flit-core
+, python
+
+# 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;
+    sha256 = "sha256-v0ZMrHIIaGeORwD4JiBeLthmnKZODK5odZVL0SY4etA=";
+  };
+
+  nativeBuildInputs = [ flit-core ];
+
+  pythonImportsCheck = [ "tomli" ];
+
+  checkPhase = ''
+    runHook preCheck
+    ${python.interpreter} -m unittest discover
+    runHook postCheck
+  '';
+
+  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 SuperSandro2000 ];
+  };
+}
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..6430bef1aa88
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tomlkit/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, enum34
+, functools32, typing ? null
+, pytestCheckHook
+, pyaml
+}:
+
+buildPythonPackage rec {
+  pname = "tomlkit";
+  version = "0.11.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-YZAfgf9AF5URGc0NHtm3rzHIIdaEXIxHdYe73NXlhU4=";
+  };
+
+  propagatedBuildInputs =
+    lib.optionals isPy27 [ enum34 functools32 ]
+    ++ lib.optional isPy27 typing;
+
+  checkInputs = [
+    pyaml
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "tomlkit" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/sdispater/tomlkit";
+    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..6ca48fd1ffb2
--- /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;
+    sha256 = "sha256-iMVwhhxEDuPy9gN8RlRhMij/QMk6bCXg66cNFygsYZQ=";
+  };
+
+  checkInputs = [ 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..8df8fa89a2ca
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/toonapi/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, aiohttp
+, backoff
+, buildPythonPackage
+, fetchFromGitHub
+, yarl
+}:
+
+buildPythonPackage rec {
+  pname = "toonapi";
+  version = "0.2.1";
+
+  src = fetchFromGitHub {
+    owner = "frenck";
+    repo = "python-toonapi";
+    rev = "v${version}";
+    sha256 = "10jh6p0ww51cb9f8amd9jq3lmvby6n2k08qwcr2n8ijbbgyp0ibf";
+  };
+
+  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";
+    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..603afe3ad59c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/toposort/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "toposort";
+  version = "1.7";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-3cIYLEKRKkQFEb1/9dPmocq8Osy8Z0oyWMjEHL+7ISU=";
+  };
+
+  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..284391061367
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/torch-tb-profiler/default.nix
@@ -0,0 +1,48 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, lib
+, pandas
+, pytestCheckHook
+, pytorch
+, 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 ];
+
+  checkInputs = [ pytestCheckHook pytorch 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/torchaudio/bin.nix b/nixpkgs/pkgs/development/python-modules/torchaudio/bin.nix
new file mode 100644
index 000000000000..42558837bc00
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/torchaudio/bin.nix
@@ -0,0 +1,57 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchurl
+, isPy37
+, isPy38
+, isPy39
+, isPy310
+, python
+, pytorch-bin
+, pythonOlder
+, pythonAtLeast
+}:
+
+buildPythonPackage rec {
+  pname = "torchaudio";
+  version = "0.11.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 = !(isPy37 || isPy38 || isPy39 || isPy310);
+
+  propagatedBuildInputs = [
+    pytorch-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 = [ "torchaudio" ];
+
+  postFixup = ''
+    # Note: after patchelf'ing, libcudart can still not be found. However, this should
+    #       not be an issue, because PyTorch is loaded before torchvision and brings
+    #       in the necessary symbols.
+    patchelf --set-rpath "${lib.makeLibraryPath [ stdenv.cc.cc.lib ]}:${pytorch-bin}/${python.sitePackages}/torch/lib:" \
+      "$out/${python.sitePackages}/torchaudio/_torchaudio.so"
+  '';
+
+  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 = platforms.linux;
+    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..70ae3357221f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/torchaudio/binary-hashes.nix
@@ -0,0 +1,66 @@
+# Warning: Need to update at the same time as pytorch-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.11.0" = {
+    x86_64-linux-37 = {
+      name = "torchaudio-0.11.0-cp37-cp37m-linux_x86_64.whl";
+      url = "https://download.pytorch.org/whl/cu113/torchaudio-0.11.0%2Bcu113-cp37-cp37m-linux_x86_64.whl";
+      hash = "sha256-AdqgntXh2rTD7rBePshFAQ2tVl7b+734wG4r471/Y2U=";
+    };
+    x86_64-linux-38 = {
+      name = "torchaudio-0.11.0-cp38-cp38-linux_x86_64.whl";
+      url = "https://download.pytorch.org/whl/cu113/torchaudio-0.11.0%2Bcu113-cp38-cp38-linux_x86_64.whl";
+      hash = "sha256-zuCHDpz3bkOUjYWprqX9VXoUbXfR8Vhdf1VFfOUg8z4=";
+    };
+    x86_64-linux-39 = {
+      name = "torchaudio-0.11.0-cp39-cp39-linux_x86_64.whl";
+      url = "https://download.pytorch.org/whl/cu113/torchaudio-0.11.0%2Bcu113-cp39-cp39-linux_x86_64.whl";
+      hash = "sha256-btI9TpsOjeLnIz6J56avNv4poJTpXjjhDbMy6+ZFQvI=";
+    };
+    x86_64-linux-310 = {
+      name = "torchaudio-0.11.0-cp310-cp310-linux_x86_64.whl";
+      url = "https://download.pytorch.org/whl/cu113/torchaudio-0.11.0%2Bcu113-cp310-cp310-linux_x86_64.whl";
+      hash = "sha256-Zk+AWytEXfJ+HM69BAPhVsvN6pgQwC6uaW7Xux2row4=";
+    };
+    x86_64-darwin-37 = {
+      name = "torchaudio-0.11.0-cp37-cp37m-macosx_10_15_x86_64.whl";
+      url = "https://download.pytorch.org/whl/torchaudio-0.11.0-cp37-cp37m-macosx_10_15_x86_64.whl";
+      hash = "sha256-uaTT4athEWHAZe0hBoBIM/9LhfZNhAIexZBGg2MWn50=";
+    };
+    x86_64-darwin-38 = {
+      name = "torchaudio-0.11.0-cp38-cp38-macosx_10_15_x86_64.whl";
+      url = "https://download.pytorch.org/whl/torchaudio-0.11.0-cp38-cp38-macosx_10_15_x86_64.whl";
+      hash = "sha256-9OndqejTzgu9XnkZJiGfUFS4uFNlx5vi7pAzOs+a2/w=";
+    };
+    x86_64-darwin-39 = {
+      name = "torchaudio-0.11.0-cp39-cp39-macosx_10_15_x86_64.whl";
+      url = "https://download.pytorch.org/whl/torchaudio-0.11.0-cp39-cp39-macosx_10_15_x86_64.whl";
+      hash = "sha256-cNi8B/J3YI0jqaoI2z+68DVmAlS8EtmzYWQMRVZ3dVk=";
+    };
+    x86_64-darwin-310 = {
+      name = "torchaudio-0.11.0-cp310-cp310-macosx_10_15_x86_64.whl";
+      url = "https://download.pytorch.org/whl/torchaudio-0.11.0-cp310-cp310-macosx_10_15_x86_64.whl";
+      hash = "sha256-g2Pj2wqK9YIP19O/g5agryPcgiHJqdS2Di44mAVJKUQ=";
+    };
+    aarch64-darwin-38 = {
+      name = "torchaudio-0.11.0-cp38-cp38-macosx_11_0_arm64.whl";
+      url = "https://download.pytorch.org/whl/torchaudio-0.11.0-cp38-cp38-macosx_11_0_arm64.whl";
+      hash = "sha256-MX/Y7Dn92zrx2tkGWTuezcPt9o5/V4DEL43pVlha5IA=";
+    };
+    aarch64-darwin-39 = {
+      name = "torchaudio-0.11.0-cp39-cp39-macosx_11_0_arm64.whl";
+      url = "https://download.pytorch.org/whl/torchaudio-0.11.0-cp39-cp39-macosx_11_0_arm64.whl";
+      hash = "sha256-5eVRP83VeHAGGWW++/B2V4eyX0mcPgC1j02ETkQYMXc=";
+    };
+    aarch64-darwin-310 = {
+      name = "torchaudio-0.11.0-cp310-cp310-macosx_11_0_arm64.whl";
+      url = "https://download.pytorch.org/whl/torchaudio-0.11.0-cp310-cp310-macosx_11_0_arm64.whl";
+      hash = "sha256-06OyzOuV8E7ZNtozvFO9Zm2rBxWnnbM65HGYUiQdwtI=";
+    };
+  };
+}
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..294c917e0d17
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/torchaudio/prefetch.sh
@@ -0,0 +1,46 @@
+#!/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/cu113"
+darwin_bucket="https://download.pytorch.org/whl"
+
+url_and_key_list=(
+  "x86_64-linux-37 $linux_bucket/torchaudio-${version}%2Bcu113-cp37-cp37m-linux_x86_64.whl torchaudio-${version}-cp37-cp37m-linux_x86_64.whl"
+  "x86_64-linux-38 $linux_bucket/torchaudio-${version}%2Bcu113-cp38-cp38-linux_x86_64.whl torchaudio-${version}-cp38-cp38-linux_x86_64.whl"
+  "x86_64-linux-39 $linux_bucket/torchaudio-${version}%2Bcu113-cp39-cp39-linux_x86_64.whl torchaudio-${version}-cp39-cp39-linux_x86_64.whl"
+  "x86_64-linux-310 $linux_bucket/torchaudio-${version}%2Bcu113-cp310-cp310-linux_x86_64.whl torchaudio-${version}-cp310-cp310-linux_x86_64.whl"
+  "x86_64-darwin-37 $darwin_bucket/torchaudio-${version}-cp37-cp37m-macosx_10_15_x86_64.whl torchaudio-${version}-cp37-cp37m-macosx_10_15_x86_64.whl"
+  "x86_64-darwin-38 $darwin_bucket/torchaudio-${version}-cp38-cp38-macosx_10_15_x86_64.whl torchaudio-${version}-cp38-cp38-macosx_10_15_x86_64.whl"
+  "x86_64-darwin-39 $darwin_bucket/torchaudio-${version}-cp39-cp39-macosx_10_15_x86_64.whl torchaudio-${version}-cp39-cp39-macosx_10_15_x86_64.whl"
+  "x86_64-darwin-310 $darwin_bucket/torchaudio-${version}-cp310-cp310-macosx_10_15_x86_64.whl torchaudio-${version}-cp310-cp310-macosx_10_15_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"
+)
+
+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/torchgpipe/default.nix b/nixpkgs/pkgs/development/python-modules/torchgpipe/default.nix
new file mode 100644
index 000000000000..2c289f852699
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/torchgpipe/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, isPy27
+, pytest-runner
+, pytestCheckHook
+, pytorch
+}:
+
+buildPythonPackage rec {
+  pname = "torchgpipe";
+  version = "0.0.7";
+
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "kakaobrain";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0ki0njhmz1i3pkpr3y6h6ac7p5qh1kih06mknc2s18mfw34f2l55";
+  };
+
+  propagatedBuildInputs = [ pytorch ];
+
+  checkInputs = [ pytest-runner 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..66bdb587bc21
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/torchinfo/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, pytorch
+, torchvision
+}:
+
+buildPythonPackage rec {
+  pname = "torchinfo";
+  version = "1.64";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "TylerYep";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-gcl8RxCD017FP4LtB60WVtOh7jg2Otv/vNd9hKneEAU=";
+  };
+
+  propagatedBuildInputs = [
+    pytorch
+    torchvision
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Skip as it downloads pretrained weights (require network access)
+    "test_eval_order_doesnt_matter"
+    # AssertionError in output
+    "test_google"
+  ];
+
+  pythonImportsCheck = [
+    "torchvision"
+  ];
+
+  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/torchmetrics/default.nix b/nixpkgs/pkgs/development/python-modules/torchmetrics/default.nix
new file mode 100644
index 000000000000..e71e623e428b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/torchmetrics/default.nix
@@ -0,0 +1,78 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, cloudpickle
+, scikit-learn
+, scikitimage
+, packaging
+, psutil
+, py-deprecate
+, pytorch
+, pytestCheckHook
+, torchmetrics
+, pytorch-lightning
+}:
+
+let
+  pname = "torchmetrics";
+  version = "0.9.2";
+in
+buildPythonPackage {
+  inherit pname version;
+
+  src = fetchFromGitHub {
+    owner = "PyTorchLightning";
+    repo = "metrics";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-zkdmWxaTPTMyLe7P/zVfgKSYDCec3uh0eqCtahByMlY=";
+  };
+
+  propagatedBuildInputs = [
+    packaging
+    py-deprecate
+  ];
+
+  # Let the user bring their own instance
+  buildInputs = [
+    pytorch
+  ];
+
+  checkInputs = [
+    pytorch-lightning
+    scikit-learn
+    scikitimage
+    cloudpickle
+    psutil
+    pytestCheckHook
+  ];
+
+  # A cyclic dependency in: integrations/test_lightning.py
+  doCheck = false;
+  passthru.tests.check = torchmetrics.overridePythonAttrs (_: {
+    doCheck = true;
+  });
+
+  disabledTestPaths = [
+    # These require too many "leftpad-level" dependencies
+    "tests/text"
+    "tests/audio"
+    "tests/image"
+
+    # A few non-deterministic things like test_check_compute_groups_is_faster
+    "tests/bases/test_collections.py"
+  ];
+
+  pythonImportsCheck = [
+    "torchmetrics"
+  ];
+
+  meta = with lib; {
+    description = "Machine learning metrics for distributed, scalable PyTorch applications (used in pytorch-lightning)";
+    homepage = "https://torchmetrics.readthedocs.io";
+    license = licenses.asl20;
+    maintainers = with maintainers; [
+      SomeoneSerge
+    ];
+  };
+}
+
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..60a33882021b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/torchvision/bin.nix
@@ -0,0 +1,67 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchurl
+, isPy37
+, isPy38
+, isPy39
+, isPy310
+, patchelf
+, pillow
+, python
+, pytorch-bin
+}:
+
+let
+  pyVerNoDot = builtins.replaceStrings [ "." ] [ "" ] python.pythonVersion;
+  srcs = import ./binary-hashes.nix version;
+  unsupported = throw "Unsupported system";
+  version = "0.12.0";
+in buildPythonPackage {
+  inherit version;
+
+  pname = "torchvision";
+
+  format = "wheel";
+
+  src = fetchurl srcs."${stdenv.system}-${pyVerNoDot}" or unsupported;
+
+  disabled = !(isPy37 || isPy38 || isPy39 || isPy310);
+
+  nativeBuildInputs = [
+    patchelf
+  ];
+
+  propagatedBuildInputs = [
+    pillow
+    pytorch-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" ];
+
+  postFixup = let
+    rpath = lib.makeLibraryPath [ stdenv.cc.cc.lib ];
+  in ''
+    # Note: after patchelf'ing, libcudart can still not be found. However, this should
+    #       not be an issue, because PyTorch is loaded before torchvision and brings
+    #       in the necessary symbols.
+    patchelf --set-rpath "${rpath}:${pytorch-bin}/${python.sitePackages}/torch/lib:" \
+      "$out/${python.sitePackages}/torchvision/_C.so"
+  '';
+
+  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 = platforms.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..271968391ef0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/torchvision/binary-hashes.nix
@@ -0,0 +1,66 @@
+# Warning: use the same CUDA version as pytorch-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.12.0" = {
+    x86_64-linux-37 = {
+      name = "torchvision-0.12.0-cp37-cp37m-linux_x86_64.whl";
+      url = "https://download.pytorch.org/whl/cu113/torchvision-0.12.0%2Bcu113-cp37-cp37m-linux_x86_64.whl";
+      hash = "sha256-i/qktZT+5HQYQjtTHtxOV751DcsP9AHMsSV9/svsGzA=";
+    };
+    x86_64-linux-38 = {
+      name = "torchvision-0.12.0-cp38-cp38-linux_x86_64.whl";
+      url = "https://download.pytorch.org/whl/cu113/torchvision-0.12.0%2Bcu113-cp38-cp38-linux_x86_64.whl";
+      hash = "sha256-NxM+jFsOwvAZmeWRFvbQ422a+xx/j1i9DD3ImW+DVBk=";
+    };
+    x86_64-linux-39 = {
+      name = "torchvision-0.12.0-cp39-cp39-linux_x86_64.whl";
+      url = "https://download.pytorch.org/whl/cu113/torchvision-0.12.0%2Bcu113-cp39-cp39-linux_x86_64.whl";
+      hash = "sha256-bGO5q+KEnv7SexmbbUWaIbsBcIxyDbL8pevZQbLwDbg=";
+    };
+    x86_64-linux-310 = {
+      name = "torchvision-0.12.0-cp310-cp310-linux_x86_64.whl";
+      url = "https://download.pytorch.org/whl/cu113/torchvision-0.12.0%2Bcu113-cp310-cp310-linux_x86_64.whl";
+      hash = "sha256-ocsGOHa967HcZGV+1omD/xMHufmoi166Yg2Hr+SEhfE=";
+    };
+    x86_64-darwin-37 = {
+      name = "torchvision-0.12.0-cp37-cp37m-macosx_10_9_x86_64.whl";
+      url = "https://download.pytorch.org/whl/torchvision-0.12.0-cp37-cp37m-macosx_10_9_x86_64.whl";
+      hash = "sha256-GJM7xZf0VjmTJJcZqWqV28fTN0yQ+7MNPafVGPOv60I=";
+    };
+    x86_64-darwin-38 = {
+      name = "torchvision-0.12.0-cp38-cp38-macosx_10_9_x86_64.whl";
+      url = "https://download.pytorch.org/whl/torchvision-0.12.0-cp38-cp38-macosx_10_9_x86_64.whl";
+      hash = "sha256-DWAuCb1Fc2/y55aOjduw7s6Vb/ltcVSLGxtIeP33S9g=";
+    };
+    x86_64-darwin-39 = {
+      name = "torchvision-0.12.0-cp39-cp39-macosx_10_9_x86_64.whl";
+      url = "https://download.pytorch.org/whl/torchvision-0.12.0-cp39-cp39-macosx_10_9_x86_64.whl";
+      hash = "sha256-RMye+ZLS4qtjsIg/fezrwiRNupO3JUe6EfV6yEUvbq0=";
+    };
+    x86_64-darwin-310 = {
+      name = "torchvision-0.12.0-cp310-cp310-macosx_10_9_x86_64.whl";
+      url = "https://download.pytorch.org/whl/torchvision-0.12.0-cp310-cp310-macosx_10_9_x86_64.whl";
+      hash = "sha256-aTZW5nkLarIeSm6H6BwpgrrZ5FW16yThS7ZyOC7GEw8=";
+    };
+    aarch64-darwin-38 = {
+      name = "torchvision-0.12.0-cp38-cp38-macosx_11_0_arm64.whl";
+      url = "https://download.pytorch.org/whl/torchvision-0.12.0-cp38-cp38-macosx_11_0_arm64.whl";
+      hash = "sha256-n0JCD38LKc09YXdt8xV4JyV6DPFrLAJ3bcFslquxJW0=";
+    };
+    aarch64-darwin-39 = {
+      name = "torchvision-0.12.0-cp39-cp39-macosx_11_0_arm64.whl";
+      url = "https://download.pytorch.org/whl/torchvision-0.12.0-cp39-cp39-macosx_11_0_arm64.whl";
+      hash = "sha256-adgvR7Z7rW3cu4eDO6WVCmwnG6l7quTAlVYQBxvwNPU=";
+    };
+    aarch64-darwin-310 = {
+      name = "torchvision-0.12.0-cp310-cp310-macosx_11_0_arm64.whl";
+      url = "https://download.pytorch.org/whl/torchvision-0.12.0-cp310-cp310-macosx_11_0_arm64.whl";
+      hash = "sha256-oL5FAcoLobGVZEySQ/SaHEmiblKn83kkxCOdC/XsvY0=";
+    };
+  };
+}
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..4eb0368a821e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/torchvision/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, symlinkJoin
+, buildPythonPackage
+, fetchFromGitHub
+, ninja
+, which
+, libjpeg_turbo
+, libpng
+, numpy
+, scipy
+, pillow
+, pytorch
+, pytest
+, cudaSupport ? pytorch.cudaSupport or false # by default uses the value from pytorch
+}:
+
+let
+  inherit (pytorch.cudaPackages) cudatoolkit cudnn;
+
+  cudatoolkit_joined = symlinkJoin {
+    name = "${cudatoolkit.name}-unsplit";
+    paths = [ cudatoolkit.out cudatoolkit.lib ];
+  };
+  cudaArchStr = lib.optionalString cudaSupport lib.strings.concatStringsSep ";" pytorch.cudaArchList;
+in buildPythonPackage rec {
+  pname = "torchvision";
+  version = "0.13.0";
+
+  src = fetchFromGitHub {
+    owner = "pytorch";
+    repo = "vision";
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-nIE1HvmAhRh3Hvj3qlF52sN9LGIorLiXlLtN7tzQxqU=";
+  };
+
+  nativeBuildInputs = [ libpng ninja which ]
+    ++ lib.optionals cudaSupport [ cudatoolkit_joined ];
+
+  TORCHVISION_INCLUDE = "${libjpeg_turbo.dev}/include/";
+  TORCHVISION_LIBRARY = "${libjpeg_turbo}/lib/";
+
+  buildInputs = [ libjpeg_turbo libpng ]
+    ++ lib.optionals cudaSupport [ cudnn ];
+
+  propagatedBuildInputs = [ numpy pillow pytorch scipy ];
+
+  preBuild = lib.optionalString cudaSupport ''
+    export TORCH_CUDA_ARCH_LIST="${cudaArchStr}"
+    export FORCE_CUDA=1
+  '';
+
+  # tries to download many datasets for tests
+  doCheck = false;
+
+  checkPhase = ''
+    HOME=$TMPDIR py.test test --ignore=test/test_datasets_download.py
+  '';
+
+  checkInputs = [ 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..5f38bce8d8b3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/torchvision/prefetch.sh
@@ -0,0 +1,46 @@
+#!/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/cu113"
+darwin_bucket="https://download.pytorch.org/whl"
+
+url_and_key_list=(
+  "x86_64-linux-37 $linux_bucket/torchvision-${version}%2Bcu113-cp37-cp37m-linux_x86_64.whl torchvision-${version}-cp37-cp37m-linux_x86_64.whl"
+  "x86_64-linux-38 $linux_bucket/torchvision-${version}%2Bcu113-cp38-cp38-linux_x86_64.whl torchvision-${version}-cp38-cp38-linux_x86_64.whl"
+  "x86_64-linux-39 $linux_bucket/torchvision-${version}%2Bcu113-cp39-cp39-linux_x86_64.whl torchvision-${version}-cp39-cp39-linux_x86_64.whl"
+  "x86_64-linux-310 $linux_bucket/torchvision-${version}%2Bcu113-cp310-cp310-linux_x86_64.whl torchvision-${version}-cp310-cp310-linux_x86_64.whl"
+  "x86_64-darwin-37 $darwin_bucket/torchvision-${version}-cp37-cp37m-macosx_10_9_x86_64.whl torchvision-${version}-cp37-cp37m-macosx_10_9_x86_64.whl"
+  "x86_64-darwin-38 $darwin_bucket/torchvision-${version}-cp38-cp38-macosx_10_9_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_9_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_9_x86_64.whl torchvision-${version}-cp310-cp310-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"
+)
+
+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..3be82e40a298
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tornado/4.nix
@@ -0,0 +1,31 @@
+{ lib
+, python
+, buildPythonPackage
+, fetchPypi
+, isPy27
+}:
+
+buildPythonPackage rec {
+  pname = "tornado";
+  version = "4.5.3";
+  disabled = isPy27 || python.pythonAtLeast "3.10";
+
+  # We specify the name of the test files to prevent
+  # https://github.com/NixOS/nixpkgs/issues/14634
+  checkPhase = ''
+    ${python.interpreter} -m unittest discover *_test.py
+  '';
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "02jzd23l4r6fswmwxaica9ldlyc2p6q8dk6dyff7j58fmdzf853d";
+  };
+
+  __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..f0dc14b5fa2a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tornado/5.nix
@@ -0,0 +1,32 @@
+{ lib
+, python
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, pythonAtLeast
+}:
+
+buildPythonPackage rec {
+  pname = "tornado";
+  version = "5.1.1";
+  disabled = isPy27 || pythonAtLeast "3.10";
+
+  # We specify the name of the test files to prevent
+  # https://github.com/NixOS/nixpkgs/issues/14634
+  checkPhase = ''
+    ${python.interpreter} -m unittest discover *_test.py
+  '';
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "4e5158d97583502a7e2739951553cbd88a72076f152b4b11b64b9a10c4c49409";
+  };
+
+  __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..c9fa36ec65df
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tornado/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, python
+, buildPythonPackage
+, fetchPypi
+, pycares
+, pycurl
+, twisted
+}:
+
+buildPythonPackage rec {
+  pname = "tornado";
+  version = "6.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-m2MEGb3oTsZmv9fqCkyyqKZRwtXMzb3RlyoMhZ38PBM=";
+  };
+
+  checkInputs = [
+    pycares
+    pycurl
+    twisted
+  ];
+
+  pythonImportsCheck = [ "tornado" ];
+
+  __darwinAllowLocalNetworking = true;
+
+  meta = with lib; {
+    description = "A web framework and asynchronous networking library";
+    homepage = "https://www.tornadoweb.org/";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..7602e6680841
--- /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}";
+    sha256 = "sha256-Ni7GcpkxzAMtP4wBOFsi4KnxK+nC0XCZR/2Z/eS/C+w=";
+  };
+
+  propagatedBuildInputs = [
+    cryptography
+    requests
+   ];
+
+  checkInputs = [
+    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/torrequest/default.nix b/nixpkgs/pkgs/development/python-modules/torrequest/default.nix
new file mode 100644
index 000000000000..4c994f81023a
--- /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;
+    sha256 = "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..2f093200bf35
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/total-connect-client/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, zeep
+}:
+
+buildPythonPackage rec {
+  pname = "total-connect-client";
+  version = "2022.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "craigjmidwinter";
+    repo = "total-connect-client";
+    rev = version;
+    hash = "sha256-S+xki1Bj+wvKhbl2vRRa8gULyxTsH4fyypkrHj3JwH0=";
+  };
+
+  propagatedBuildInputs = [
+    zeep
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "total_connect_client"
+  ];
+
+  meta = with lib; {
+    description = "Interact with Total Connect 2 alarm systems";
+    homepage = "https://github.com/craigjmidwinter/total-connect-client";
+    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..9953e2c17be5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/towncrier/default.nix
@@ -0,0 +1,54 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27
+, click
+, click-default-group
+, incremental
+, jinja2
+, mock
+, pytestCheckHook
+, toml
+, twisted
+, setuptools
+, git # shells out to git
+}:
+
+buildPythonPackage rec {
+  pname = "towncrier";
+  version = "21.9.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-nLb0XBbhoe7J0OdlEWXnvmDNCrgdE6XJbKl6SYrof0g=";
+  };
+
+  propagatedBuildInputs = [
+    click
+    click-default-group
+    incremental
+    jinja2
+    toml
+    setuptools
+  ];
+
+  # zope.interface collision
+  doCheck = !isPy27;
+
+  preCheck = ''
+    export PATH=$out/bin:$PATH
+  '';
+
+  checkInputs = [
+    git
+    mock
+    twisted
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "towncrier" ];
+
+  meta = with lib; {
+    description = "Utility to produce useful, summarised news files";
+    homepage = "https://github.com/twisted/towncrier/";
+    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..cc9a96a1cba7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tox/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, packaging
+, pluggy
+, py
+, six
+, virtualenv
+, setuptools-scm
+, toml
+, filelock
+}:
+
+buildPythonPackage rec {
+  pname = "tox";
+  version = "3.25.1";
+
+  buildInputs = [ setuptools-scm ];
+  propagatedBuildInputs = [ packaging pluggy py six virtualenv toml filelock ];
+
+  doCheck = false;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-wTgyeBX1O8baT+VrrsXyXwBiKuae8/5OHjhXIOIkhvk=";
+  };
+
+  meta = with lib; {
+    description = "Virtualenv-based automation of test activities";
+    homepage = "https://tox.readthedocs.io/";
+    license = licenses.mit;
+  };
+}
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..8f8d49d34f1a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tpm2-pytss/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, asn1crypto
+, cffi
+, cryptography
+, ibm-sw-tpm2
+, pkgconfig # see nativeBuildInputs
+, pkg-config # see nativeBuildInputs
+, pycparser
+, pytestCheckHook
+, python
+, pyyaml
+, setuptools-scm
+, tpm2-tss
+}:
+
+buildPythonPackage rec {
+  pname = "tpm2-pytss";
+  version = "1.2.0";
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-OgWWTjcj3Qd4dSaCwY+fuRQpLSFn4+9o11kPR9n8a54=";
+  };
+
+  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
+  ];
+
+  # https://github.com/tpm2-software/tpm2-pytss/issues/341
+  doCheck = false;
+
+  checkInputs = [
+    ibm-sw-tpm2
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "tpm2_pytss" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/tpm2-software/tpm2-pytss";
+    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/tqdm/default.nix b/nixpkgs/pkgs/development/python-modules/tqdm/default.nix
new file mode 100644
index 000000000000..81e447457c5a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tqdm/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, setuptools-scm
+, pytestCheckHook
+, pytest-asyncio
+, pytest-timeout
+, numpy
+, pandas
+, rich
+, tkinter
+}:
+
+buildPythonPackage rec {
+  pname = "tqdm";
+  version = "4.64.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "13a0spki37rdbx54nspcni3bpsp4d7p5ln570yipf1r01v9mbgj0";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  checkInputs = [
+    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 = [
+    # pytest-asyncio 0.17.0 compat; https://github.com/tqdm/tqdm/issues/1289
+    "--asyncio-mode=strict"
+  ];
+
+  # 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/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..94597726389d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/trackpy/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, numpy
+, scipy
+, six
+, pandas
+, pyyaml
+, matplotlib
+, numba
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "trackpy";
+  version = "0.5.0";
+
+  src = fetchFromGitHub {
+    owner = "soft-matter";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0if069f4sjyjl7wvzyzk8k9q9qjixswcc6aszrrgfb4a4mix3h1g";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    scipy
+    six
+    pandas
+    pyyaml
+    matplotlib
+    numba
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  preCheck = lib.optionalString stdenv.isDarwin ''
+    # specifically needed for darwin
+    export HOME=$(mktemp -d)
+    mkdir -p $HOME/.matplotlib
+    echo "backend: ps" > $HOME/.matplotlib/matplotlibrc
+  '';
+
+  meta = with lib; {
+    broken = (stdenv.isLinux && stdenv.isAarch64);
+    description = "Particle-tracking toolkit";
+    homepage = "https://github.com/soft-matter/trackpy";
+    license = licenses.bsd3;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..0a32f931d132
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/traitlets/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, glibcLocales
+, pytest
+, mock
+, ipython_genutils
+, decorator
+, pythonOlder
+, six
+, hatchling
+}:
+
+buildPythonPackage rec {
+  pname = "traitlets";
+  version = "5.3.0";
+  format = "pyproject";
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-C7nx+fAXqo7Bh9ixsqemYmoqHYdxFrq6UqEpv6Ek+OI=";
+  };
+
+  nativeBuildInputs = [ hatchling ];
+  checkInputs = [ glibcLocales pytest mock ];
+  propagatedBuildInputs = [ ipython_genutils decorator six ];
+
+  checkPhase = ''
+    LC_ALL="en_US.UTF-8" py.test
+  '';
+
+  meta = {
+    description = "Traitlets Python config system";
+    homepage = "http://ipython.org/";
+    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..9e6b1a5056da
--- /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.3.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "4520ef4a675181f38be4a5bab1b1d5472691597fe2cfe4faf91023e89407e2c6";
+  };
+
+  # 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..9fcfafd99e0a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/traitsui/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, traits
+, pyface
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "traitsui";
+  version = "7.4.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-JTNa/+4jQtR+NcJd9ed4XSKlM1hP4b4JQ8y6Rdwa5Yk=";
+  };
+
+  propagatedBuildInputs = [
+    traits
+    pyface
+  ];
+
+  # Needs X server
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "traitsui"
+  ];
+
+  meta = with lib; {
+    description = "Traits-capable windowing framework";
+    homepage = "https://github.com/enthought/traitsui";
+    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..290892672e59
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/traittypes/default.nix
@@ -0,0 +1,47 @@
+{ 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 ];
+
+  checkInputs = [ numpy pandas xarray nose pytestCheckHook ];
+  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/transaction/default.nix b/nixpkgs/pkgs/development/python-modules/transaction/default.nix
new file mode 100644
index 000000000000..78022cdba5ba
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/transaction/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, zope_interface
+, mock
+}:
+
+
+buildPythonPackage rec {
+  pname = "transaction";
+  version = "3.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0c15ef0b7ff3518357ceea75722a30d974c3f85e11aa5cec5d5a2b6a40cfcf68";
+  };
+
+  propagatedBuildInputs = [ zope_interface mock ];
+
+  meta = with lib; {
+    description = "Transaction management";
+    homepage = "https://pypi.python.org/pypi/transaction";
+    license = licenses.zpl20;
+  };
+}
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..97132a964559
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/transformers/default.nix
@@ -0,0 +1,107 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, cookiecutter
+, filelock
+, huggingface-hub
+, importlib-metadata
+, regex
+, requests
+, numpy
+, packaging
+, tensorflow
+, sagemaker
+, ftfy
+, protobuf
+, scikit-learn
+, pillow
+, pyyaml
+, pytorch
+, tokenizers
+, tqdm
+}:
+
+buildPythonPackage rec {
+  pname = "transformers";
+  version = "4.20.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "huggingface";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-3Kx7/3IJM428KXfOPRnPK4TYnAIXVOIMl33j8n5Cw60=";
+  };
+
+  propagatedBuildInputs = [
+    filelock
+    huggingface-hub
+    numpy
+    protobuf
+    packaging
+    pyyaml
+    regex
+    requests
+    tokenizers
+    tqdm
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  passthru.optional-dependencies = {
+    ja = [
+      # fugashi
+      # ipadic
+      # unidic_lite
+      # unidic
+    ];
+    sklearn = [
+      scikit-learn
+    ];
+    tf = [
+      tensorflow
+      # onnxconverter-common
+      # tf2onnx
+    ];
+    torch = [
+      pytorch
+    ];
+    tokenizers = [
+      tokenizers
+    ];
+    modelcreation = [
+      cookiecutter
+    ];
+    sagemaker = [
+      sagemaker
+    ];
+    ftfy = [ ftfy ];
+    onnx = [
+      # onnxconverter-common
+      # tf2onnx
+    ];
+    vision = [
+      pillow
+    ];
+  };
+
+
+  # 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 ];
+  };
+}
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..8b21e64e9a7e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/transforms3d/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, isPy27
+, pytest
+, numpy
+, scipy
+, sympy
+}:
+
+buildPythonPackage rec {
+  pname = "transforms3d";
+  version = "unstable-2019-12-17";
+
+  disabled = isPy27;
+
+  # no Git tag or PyPI release in some time
+  src = fetchFromGitHub {
+    owner = "matthew-brett";
+    repo = pname;
+    rev = "6b20250c610249914ca5e3a3a2964c36ca35c19a";
+    sha256 = "1z789hgk71a6rj6mqp9srpzamg06g58hs2p1l1p344cfnkj5a4kc";
+  };
+
+  propagatedBuildInputs = [ numpy sympy ];
+
+  checkInputs = [ pytest scipy ];
+  checkPhase = "pytest 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/transip/default.nix b/nixpkgs/pkgs/development/python-modules/transip/default.nix
new file mode 100644
index 000000000000..ff37464a0f34
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/transip/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, requests
+, cryptography
+, suds-jurko
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "transip";
+  version = "2.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "benkonrath";
+    repo = "transip-api";
+    rev = "v${version}";
+    hash = "sha256-J/zcDapry8pm1zozzCDzrQED7vvCR6yoE4NcduBFfZQ=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    cryptography
+    suds-jurko
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Constructor tests require network access
+    "test_constructor"
+    "testConstructor"
+  ];
+
+  pythonImportsCheck = [
+    "transip"
+  ];
+
+  meta = with lib; {
+    description = "TransIP API Connector";
+    homepage = "https://github.com/benkonrath/transip-api";
+    license = licenses.mit;
+    maintainers = with maintainers; [ flyfloh ];
+  };
+}
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..e50dec28ef50
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/transitions/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonAtLeast
+, six
+, pygraphviz
+, pytestCheckHook
+, mock
+, graphviz
+, pycodestyle
+, fontconfig
+}:
+
+buildPythonPackage rec {
+  pname = "transitions";
+  version = "0.8.11";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-eyDTKQbqTWDub2wfXcnJ8XiAJCXFsVUhPrDyXCd/BOQ=";
+  };
+
+  propagatedBuildInputs = [
+    six
+    pygraphviz # optional
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    mock
+    graphviz
+    pycodestyle
+  ];
+
+  preCheck = ''
+    export FONTCONFIG_FILE=${fontconfig.out}/etc/fonts/fonts.conf
+    export HOME=$TMPDIR
+  '';
+
+  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/translatepy/default.nix b/nixpkgs/pkgs/development/python-modules/translatepy/default.nix
new file mode 100644
index 000000000000..374c1d5dfaca
--- /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}";
+    sha256 = "sha256-cx5OeBrB8il8KrcyOmQbQ7VCXoaA5RP++oTTxCs/PcM=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    beautifulsoup4
+    pyuseragents
+    safeio
+    inquirer
+  ];
+
+  checkInputs = [ 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..2788d0ec8cb8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/transmission-rpc/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, six
+, typing-extensions
+, requests
+, yarl
+, pythonOlder
+, fetchFromGitHub
+, poetry-core
+}:
+
+buildPythonPackage rec {
+  pname = "transmission-rpc";
+  version = "3.3.2";
+  disabled = pythonOlder "3.6";
+
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "Trim21";
+    repo = "transmission-rpc";
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-GkhNOKatT/hJFw1l1xrf43jtgxvJ+WVvhz83Oe0MZ6w=";
+  };
+
+  # remove once upstream has tagged version with dumped typing-extensions
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'typing_extensions = ">=3.7.4.2,<4.0.0.0"' 'typing_extensions = "*"'
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    six
+    typing-extensions
+    requests
+    yarl
+  ];
+
+  # no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "transmission_rpc" ];
+
+  meta = with lib; {
+    description = "Python module that implements the Transmission bittorent client RPC protocol";
+    homepage = "https://github.com/Trim21/transmission-rpc";
+    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..1c3b2a542bc3
--- /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";
+    sha256 = "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/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..febb59880b69
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/treeo/default.nix
@@ -0,0 +1,57 @@
+{ 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.0.11";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "cgarciae";
+    repo = pname;
+    rev = version;
+    hash = "sha256-zs3F8i+G5OX/A9wOO60xVuvnm2QqrL+dHIrC0qwH37o=";
+  };
+
+  # 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
+  ];
+
+  checkInputs = [ 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 ];
+  };
+}
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..85896ac7921f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/treex/default.nix
@@ -0,0 +1,80 @@
+{ buildPythonPackage
+, cloudpickle
+, dm-haiku
+, einops
+, fetchFromGitHub
+, flax
+, hypothesis
+, jaxlib
+, keras
+, lib
+, poetry-core
+, pytestCheckHook
+, pyyaml
+, rich
+, tensorflow
+, treeo
+}:
+
+buildPythonPackage rec {
+  pname = "treex";
+  version = "0.6.10";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "cgarciae";
+    repo = pname;
+    rev = version;
+    hash = "sha256-ZHfgmRNbFh8DFZkmilY0pmRNQhJFqT689I7Lu8FuFm4=";
+  };
+
+  # 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.
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'rich = "^11.2.0"' 'rich = "*"' \
+      --replace 'treeo = "^0.0.10"' 'treeo = "*"' \
+      --replace 'certifi = "^2021.10.8"' 'certifi = "*"'
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  buildInputs = [ jaxlib ];
+
+  propagatedBuildInputs = [
+    einops
+    flax
+    pyyaml
+    rich
+    treeo
+  ];
+
+  checkInputs = [
+    cloudpickle
+    dm-haiku
+    hypothesis
+    keras
+    pytestCheckHook
+    tensorflow
+  ];
+
+  pythonImportsCheck = [
+    "treex"
+  ];
+
+  disabledTestPaths = [
+    # Require `torchmetrics` which is not packaged in `nixpkgs`.
+    "tests/metrics/test_mean_absolute_error.py"
+    "tests/metrics/test_mean_square_error.py"
+  ];
+
+  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..0f77463077a0
--- /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;
+    sha256 = "sha256-33V+PxQfx4Lt4HamBFIRlP/LQPomRc9I5aNwYDB/Uuw=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    incremental
+    twisted
+  ] ++ twisted.optional-dependencies.tls;
+
+  checkInputs = [
+    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; [ SuperSandro2000 ];
+  };
+}
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..b4a2925a4155
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/trezor/default.nix
@@ -0,0 +1,85 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, installShellFiles
+, attrs
+, click
+, construct
+, ecdsa
+, hidapi
+, libusb1
+, mnemonic
+, pillow
+, protobuf
+, pyblake2
+, requests
+, shamir-mnemonic
+, simple-rlp
+, typing-extensions
+, trezor-udev-rules
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "trezor";
+  version = "0.13.3";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "055d32174d4ecf2353f7622ee44b8e82e3bef78fe40ce5cdbeafc785b422a049";
+  };
+
+  nativeBuildInputs = [ installShellFiles ];
+
+  propagatedBuildInputs = [
+    attrs
+    click
+    construct
+    ecdsa
+    hidapi
+    libusb1
+    mnemonic
+    pillow
+    protobuf
+    pyblake2
+    requests
+    shamir-mnemonic
+    simple-rlp
+    typing-extensions
+  ] ++ lib.optionals stdenv.isLinux [
+    trezor-udev-rules
+  ];
+
+  checkInputs = [ pytestCheckHook ];
+
+  disabledTestPaths = [
+    "tests/test_stellar.py" # requires stellar-sdk
+  ];
+
+  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..e5db9c72a5fe
--- /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;
+    sha256 = "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..0f986f7148e9
--- /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";
+    sha256 = "sha256-UsDUKJCHSJ4gP+P95Pm7RsPpqTJqJhrsW47C7fTZ77I=";
+  };
+
+  buildInputs = [
+    absl-py
+    dm-tree
+    numpy
+    wrapt
+  ];
+
+  propagatedBuildInputs = [
+    tensorflow
+    tensorflow-probability
+  ];
+
+  checkInputs = [
+    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..38587c3f2261
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/trimesh/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, numpy
+}:
+
+buildPythonPackage rec {
+  pname = "trimesh";
+  version = "3.13.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-1+BycZ1fFEfbqoHs/TDnGZXc8IRzWzy2pZ2YkTOPMaA=";
+  };
+
+  propagatedBuildInputs = [ numpy ];
+
+  # tests are not included in pypi distributions and would require lots of
+  # optional dependencies
+  doCheck = false;
+
+  pythonImportsCheck = [ "trimesh" ];
+
+  meta = with lib; {
+    description = "Python library for loading and using triangular meshes";
+    homepage = "https://trimsh.org/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ gebner ];
+  };
+}
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..25caa3e965fb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/trio-asyncio/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, trio
+, outcome
+, sniffio
+, pytest-trio
+, pytestCheckHook
+, 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
+  ];
+
+  checkInputs = [
+    pytest-trio
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    # https://github.com/python-trio/trio-asyncio/issues/112
+    "-W"
+    "ignore::DeprecationWarning"
+  ];
+
+  disabledTestPaths = [
+    "tests/python" # tries to import internal API test.test_asyncio
+  ];
+
+  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..3b33b80e921e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/trio-websocket/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, async_generator
+, pytest-trio
+, pytestCheckHook
+, trio
+, trustme
+, wsproto
+}:
+
+buildPythonPackage rec {
+  pname = "trio-websocket";
+  version = "0.9.2";
+
+  src = fetchFromGitHub {
+    owner = "HyperionGray";
+    repo = "trio-websocket";
+    rev = version;
+    sha256 = "sha256-8VrpI/pk5IhEvqzo036cnIbJ1Hu3UfQ6GHTNkNJUYvo=";
+  };
+
+  propagatedBuildInputs = [
+    async_generator
+    trio
+    wsproto
+  ];
+
+  checkInputs = [
+    pytest-trio
+    pytestCheckHook
+    trustme
+  ];
+
+  pythonImportsCheck = [ "trio_websocket" ];
+
+  meta = with lib; {
+    description = "WebSocket client and server implementation for Python Trio";
+    license = licenses.mit;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..dde139103454
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/trio/default.nix
@@ -0,0 +1,76 @@
+{ lib, buildPythonPackage, fetchPypi, pythonOlder
+, attrs
+, sortedcontainers
+, async_generator
+, idna
+, outcome
+, contextvars
+, pytestCheckHook
+, pyopenssl
+, trustme
+, sniffio
+, stdenv
+, jedi
+, astor
+, yapf
+, coreutils
+}:
+
+buildPythonPackage rec {
+  pname = "trio";
+  version = "0.21.0";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-Uj85t7ae73NQHOv+Gq/UAKmq1bA1Q6Dt7VKVJIj/HBM=";
+  };
+
+  propagatedBuildInputs = [
+    attrs
+    sortedcontainers
+    async_generator
+    idna
+    outcome
+    sniffio
+  ] ++ lib.optionals (pythonOlder "3.7") [ contextvars ];
+
+  # tests are failing on Darwin
+  doCheck = !stdenv.isDarwin;
+
+  checkInputs = [
+    astor
+    jedi
+    pyopenssl
+    pytestCheckHook
+    trustme
+    yapf
+  ];
+
+  preCheck = ''
+    substituteInPlace trio/tests/test_subprocess.py \
+      --replace "/bin/sleep" "${coreutils}/bin/sleep"
+  '';
+
+  # 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"
+  ];
+
+  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/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..103878ccac69
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/trustme/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, cryptography
+, futures ? null
+, pyopenssl
+, service-identity
+, pytestCheckHook
+, idna
+}:
+
+buildPythonPackage rec {
+  pname = "trustme";
+  version = "0.9.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-XgeyPXDO7WTzuzauS5q8UjVMFsmNRasDe+4rX7/+WGw=";
+  };
+
+  checkInputs = [
+    pyopenssl
+    service-identity
+    pytestCheckHook
+  ];
+
+  propagatedBuildInputs = [
+    cryptography
+    idna
+  ] ++ lib.optionals (!isPy3k) [
+    futures
+  ];
+
+  # aarch64-darwin forbids W+X memory, but this tests depends on it:
+  # * https://github.com/pyca/pyopenssl/issues/873
+  disabledTests = lib.optionals (stdenv.isDarwin && stdenv.isAarch64) [
+    "test_pyopenssl_end_to_end"
+  ];
+
+  # 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";
+    license = with licenses; [ mit asl20 ];
+    maintainers = with maintainers; [ catern ];
+  };
+}
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..6dfae0f22b75
--- /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
+, python-Levenshtein
+, html2text
+, weasyprint
+, gevent
+, pillow
+, withPostgresql ? true, psycopg2
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "trytond";
+  version = "6.4.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-eTYm3anMKhgoaB8t5jald5XRD3PIVijJP4vmh0pA9lE=";
+  };
+
+  propagatedBuildInputs = [
+    defusedxml
+    lxml
+    relatorio
+    genshi
+    python-dateutil
+    polib
+    python-sql
+    werkzeug
+    wrapt
+    passlib
+
+    # extra dependencies
+    pydot
+    python-Levenshtein
+    html2text
+    weasyprint
+    gevent
+    pillow
+  ] ++ relatorio.optional-dependencies.fodt
+    ++ passlib.optional-dependencies.bcrypt
+    ++ passlib.optional-dependencies.argon2
+    ++ lib.optional withPostgresql psycopg2;
+
+  checkPhase = ''
+    runHook preCheck
+
+    export HOME=$(mktemp -d)
+    export TRYTOND_DATABASE_URI="sqlite://"
+    export DB_NAME=":memory:";
+    ${python.interpreter} -m unittest discover -s trytond.tests
+
+    runHook postCheck
+  '';
+
+  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/ttls/default.nix b/nixpkgs/pkgs/development/python-modules/ttls/default.nix
new file mode 100644
index 000000000000..9f5917749e67
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ttls/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, colour
+, fetchFromGitHub
+, poetry-core
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "ttls";
+  version = "1.4.3";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "jschlyter";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-lBmkfB7HXB+1xLbfOl4wVtsOVfKhztoDBqzV8i6bFAg=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    colour
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "ttls"
+  ];
+
+  meta = with lib; {
+    description = "Module to interact with Twinkly LEDs";
+    homepage = "https://github.com/jschlyter/ttls";
+    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..ac27cc1aef50
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ttp-templates/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, poetry-core
+}:
+
+buildPythonPackage rec {
+  pname = "ttp-templates";
+  version = "0.3.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "dmulyalin";
+    repo = "ttp_templates";
+    rev = "refs/tags/${version}";
+    hash = "sha256-35Ej76E9qy5EY41Jt2GDCldyXq7IkdqKxVFrBOJh9nE=";
+  };
+
+  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";
+    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..afa66b288ab2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ttp/default.nix
@@ -0,0 +1,109 @@
+{ 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.1";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "dmulyalin";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-FhuIYXktcNnOVX+KU5cDOd2Qk7AcWaSKvfB/BZYpsZo=";
+  };
+
+  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"
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    pyyaml
+    ttp-templates
+  ];
+
+  disabledTestPaths = [
+    # missing package n2g
+    "test/pytest/test_N2G_formatter.py"
+    # missing test file
+    "test/pytest/test_extend_tag.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; {
+    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/tubes/default.nix b/nixpkgs/pkgs/development/python-modules/tubes/default.nix
new file mode 100644
index 000000000000..a605952b2b7d
--- /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;
+    sha256 = "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..3c6690bd39e0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tubeup/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, internetarchive
+, fetchPypi
+, yt-dlp
+, docopt
+, isPy27
+}:
+
+buildPythonPackage rec {
+  pname = "tubeup";
+  version = "0.0.33";
+
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-RFM0vZeA5PDXf9KzlJ8RTSfM7bz50bpwwszU0gjV1DY=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "docopt==0.6.2" "docopt" \
+      --replace "internetarchive==2.0.3" "internetarchive"
+  '';
+
+  propagatedBuildInputs = [ internetarchive docopt yt-dlp ];
+
+  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";
+    license = licenses.gpl3Only;
+    maintainers = [ maintainers.marsam ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tumpa/default.nix b/nixpkgs/pkgs/development/python-modules/tumpa/default.nix
new file mode 100644
index 000000000000..6309e8937a36
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tumpa/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, pyside2
+, johnnycanencrypt
+, pythonOlder
+, wrapQtAppsHook
+}:
+
+buildPythonPackage rec {
+  pname = "tumpa";
+  version = "0.1.2";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "kushaldas";
+    repo = "tumpa";
+    rev = "v${version}";
+    sha256 = "17nhdildapgic5l05f3q1wf5jvz3qqdjv543c8gij1x9rdm8hgxi";
+  };
+
+  propagatedBuildInputs = [
+    setuptools
+    johnnycanencrypt
+    pyside2
+  ];
+
+  nativeBuildInputs = [
+    wrapQtAppsHook
+  ];
+
+  dontWrapQtApps = true;
+  preFixup = ''
+    makeWrapperArgs+=("''${qtWrapperArgs[@]}")
+  '';
+
+  doCheck = false;
+
+  meta = with lib; {
+    description = "OpenPGP key creation and smartcard access";
+    homepage = "https://github.com/kushaldas/tumpa";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ _0x4A6F ];
+  };
+}
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..9f2f177552de
--- /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";
+  };
+
+  checkInputs = [ 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/tuya-iot-py-sdk/default.nix b/nixpkgs/pkgs/development/python-modules/tuya-iot-py-sdk/default.nix
new file mode 100644
index 000000000000..89db0e84f9e1
--- /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}";
+    sha256 = "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..749ac4e19827
--- /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;
+    sha256 = "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..1264f07c1829
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tvdb_api/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, requests-cache
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "tvdb_api";
+  version = "3.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f63f6db99441bb202368d44aaabc956acc4202b18fc343a66bf724383ee1f563";
+  };
+
+  propagatedBuildInputs = [ requests-cache ];
+
+  checkInputs = [ 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 ];
+    # https://github.com/dbr/tvdb_api/issues/94
+    broken = true;
+  };
+}
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..69b126481d3e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tweedledum/default.nix
@@ -0,0 +1,38 @@
+{ 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}";
+    sha256 = "sha256-wgrY5ajaMYxznyNvlD0ul1PFr3W8oV9I/OVsStlZEBM=";
+  };
+
+  nativeBuildInputs = [ cmake ninja scikit-build ];
+  dontUseCmakeConfigure = true;
+
+  pythonImportsCheck = [ "tweedledum" ];
+
+  checkInputs = [ 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..b488ad8eaed7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tweepy/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, aiohttp
+, async-lru
+, buildPythonPackage
+, fetchFromGitHub
+, oauthlib
+, pytestCheckHook
+, pythonOlder
+, requests
+, requests-oauthlib
+, six
+, vcrpy
+}:
+
+buildPythonPackage rec {
+  pname = "tweepy";
+  version = "4.10.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-D/cArsGzWr+rCC9iW9qOfc5fT7UKZDupeR/rQMNK5I4=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    async-lru
+    oauthlib
+    requests
+    requests-oauthlib
+    six
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    vcrpy
+  ];
+
+  pythonImportsCheck = [
+    "tweepy"
+  ];
+
+  meta = with lib; {
+    description = "Twitter library for Python";
+    homepage = "https://github.com/tweepy/tweepy";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
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..39f8629a5b1e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/twentemilieu/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, aiohttp
+, yarl
+, aresponses
+, poetry-core
+, pytest-asyncio
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "twentemilieu";
+  version = "0.6.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "frenck";
+    repo = "python-twentemilieu";
+    rev = "v${version}";
+    sha256 = "sha256-k2jdw2H/bNejNUjIEQlEA1KkHHpkyFlSDC1HKUoMIqQ=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "--cov" "" \
+      --replace '"0.0.0"' '"${version}"'
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    yarl
+  ];
+
+  checkInputs = [
+    aresponses
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "twentemilieu" ];
+
+  meta = with lib; {
+    description = "Python client for Twente Milieu";
+    homepage = "https://github.com/frenck/python-twentemilieu";
+    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..078f6dbde76b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/twilio/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, mock
+, pyjwt
+, pytestCheckHook
+, pythonOlder
+, pytz
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "twilio";
+  version = "7.12.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "twilio";
+    repo = "twilio-python";
+    rev = "refs/tags/${version}";
+    hash = "sha256-gM4P65YMT61kCkvUJPc0fvs+CNYGdgD1dkJ8h3qYzWs=";
+  };
+
+  propagatedBuildInputs = [
+    pyjwt
+    pytz
+    requests
+  ];
+
+  checkInputs = [
+    mock
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Tests require network access
+    "test_set_default_user_agent"
+    "test_set_user_agent_extensions"
+  ];
+
+  pythonImportsCheck = [
+    "twilio"
+  ];
+
+  meta = with lib; {
+    description = "Twilio API client and TwiML generator";
+    homepage = "https://github.com/twilio/twilio-python/";
+    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..f68ec91e1cbb
--- /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.0.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-dWtrdkiR1+IBfeF9jwbOjKE2UMXDJji0iOb+USbY7zk=";
+  };
+
+  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..c3e4682d5a7e
--- /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.1";
+  format = "pyproject";
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-lrHPEveuYRpKQLaujpVwIV2v8GEYKPX+HzehYlWrJKA=";
+  };
+
+  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..77eb17b9fcda
--- /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;
+    sha256 = "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..7779f0531370
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/twisted/default.nix
@@ -0,0 +1,171 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, python
+, appdirs
+, attrs
+, automat
+, bcrypt
+, constantly
+, contextvars
+, cryptography
+, git
+, glibcLocales
+, h2
+, hyperlink
+, idna
+, incremental
+, priority
+, pyasn1
+, pyhamcrest
+, pynacl
+, pyopenssl
+, pyserial
+, service-identity
+, setuptools
+, typing-extensions
+, zope_interface
+
+  # for passthru.tests
+, cassandra-driver
+, klein
+, magic-wormhole
+, scrapy
+, treq
+, txaio
+, txamqp
+, txrequests
+, txtorcon
+, thrift
+, nixosTests
+}:
+
+buildPythonPackage rec {
+  pname = "twisted";
+  version = "22.4.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    pname = "Twisted";
+    inherit version;
+    extension = "tar.gz";
+    sha256 = "sha256-oEeZD1ffrh4L0rffJSbU8W3NyEN3TcEIt4xS8qXxNoA=";
+  };
+
+  propagatedBuildInputs = [
+    attrs
+    automat
+    constantly
+    hyperlink
+    incremental
+    setuptools
+    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 'PTYProcessTestsBuilder_AsyncioSelectorReactorTests.test_openFileDescriptors.skip = "invalid syntax"'>> src/twisted/internet/test/test_process.py
+    echo 'PTYProcessTestsBuilder_SelectReactorTests.test_openFileDescriptors.skip = "invalid syntax"'>> src/twisted/internet/test/test_process.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
+
+    echo 'DomishExpatStreamTests.test_namespaceWithWhitespace.skip = "syntax error: line 1, column 0"'>> src/twisted/words/test/test_domish.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.isAarch64 && stdenv.isDarwin) ''
+    echo 'AbortConnectionTests_AsyncioSelectorReactorTests.test_fullWriteBufferAfterByteExchange.skip = "Timeout after 120 seconds"' >> src/twisted/internet/test/test_tcp.py
+    echo 'AbortConnectionTests_AsyncioSelectorReactorTests.test_resumeProducingAbort.skip = "Timeout after 120 seconds"' >> src/twisted/internet/test/test_tcp.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 = ''
+    $out/bin/twistd --help > /dev/null
+  '';
+
+  checkInputs = [
+    git
+    glibcLocales
+    pyhamcrest
+  ]
+  ++ passthru.optional-dependencies.conch
+  # 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 twisted
+  '';
+
+  passthru = {
+    optional-dependencies = rec {
+      conch = [ appdirs bcrypt cryptography pyasn1 ];
+      conch_nacl = conch ++ [ pynacl ];
+      contextvars = lib.optionals (pythonOlder "3.7") [ contextvars ];
+      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 = "Twisted, an event-driven networking engine written in Python";
+    longDescription = ''
+      Twisted is an event-driven networking engine written in Python
+      and licensed under the MIT license.
+    '';
+    license = licenses.mit;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..c11e8bd4fdaa
--- /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;
+    sha256 = "sha256-bgnXIQuOCrtoknZ9ciB56zWxTCnncM2032TVaey6oXw=";
+  };
+
+  disabled = !isPy3k;
+
+  postPatch = ''
+    substituteInPlace setup.py --replace "'pipenv'," ""
+  '';
+
+  propagatedBuildInputs = [ requests rx ];
+
+  checkInputs = [ 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..9427d39c20af
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/twitchapi/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, aiohttp
+, python-dateutil
+, requests
+, typing-extensions
+, websockets
+}:
+
+buildPythonPackage rec {
+  pname = "twitchapi";
+  version = "2.5.7.1";
+
+  disabled = pythonOlder "3.7";
+
+  format = "setuptools";
+
+  src = fetchPypi {
+    pname = "twitchAPI";
+    inherit version;
+    hash = "sha256-ZhmzrHWbwoHL+9FdkVoc+GGxH1v2j7rB/3ZiaWu9kjQ=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    python-dateutil
+    requests
+    typing-extensions
+    websockets
+  ];
+
+  # upstream has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "twitchAPI.eventsub"
+    "twitchAPI.oauth"
+    "twitchAPI.pubsub"
+    "twitchAPI.twitch"
+    "twitchAPI.types"
+  ];
+
+  meta = with lib; {
+    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..f8a5124f2df4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/twitter/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "twitter";
+  version = "1.19.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a56ff9575fbd50a51ce91107dcb5a4c3fd00c2ba1bcb172ce538b0948d3626e6";
+  };
+
+  nativeBuildInputs = [ setuptools-scm ];
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Twitter API library";
+    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..ce123e5afc41
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/twitterapi/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, requests
+, requests-oauthlib
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "twitterapi";
+  version = "2.7.13";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "geduldig";
+    repo = "TwitterAPI";
+    rev = "v${version}";
+    hash = "sha256-48Gphpo3tPcVEGNOSEb8mQaSQARQDCOGFyhGJ+i4BWI=";
+  };
+
+  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";
+    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..02cf7c0fda6a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/txaio/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, mock
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, twisted
+, zope_interface
+}:
+
+buildPythonPackage rec {
+  pname = "txaio";
+  version = "22.2.1";
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-LkWCtw8EsjRZCCVGhKmEIGwNm1DjB0okpMVauiHSTQE=";
+  };
+
+  propagatedBuildInputs = [
+    twisted
+    zope_interface
+  ];
+
+  checkInputs = [
+    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";
+    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/txredisapi/default.nix b/nixpkgs/pkgs/development/python-modules/txredisapi/default.nix
new file mode 100644
index 000000000000..9d8b268b30b2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/txredisapi/default.nix
@@ -0,0 +1,28 @@
+{ lib, buildPythonPackage, fetchFromGitHub, nixosTests, six, twisted }:
+
+buildPythonPackage rec {
+  pname = "txredisapi";
+  version = "1.4.7";
+
+  src = fetchFromGitHub {
+    owner = "IlyaSkriblovsky";
+    repo = "txredisapi";
+    rev = "1.4.7";
+    sha256 = "1f7j3c5l7jcfphvsk7nqmgyb4jaydbzq081m555kw0f9xxak0pgq";
+  };
+
+  propagatedBuildInputs = [ six twisted ];
+
+  doCheck = false;
+  pythonImportsCheck = [ "txredisapi" ];
+
+  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..cf3bee52c590
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/txrequests/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, twisted
+, requests
+, cryptography
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "txrequests";
+  version = "0.9.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b452a1cafa4d005678f6fa47922a330feb4907d5b4732d1841ca98e89f1362e1";
+  };
+
+  propagatedBuildInputs = [ twisted requests cryptography ];
+
+  # Require network access
+  doCheck = false;
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest discover
+  '';
+
+  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/txtorcon/default.nix b/nixpkgs/pkgs/development/python-modules/txtorcon/default.nix
new file mode 100644
index 000000000000..ef06f711848b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/txtorcon/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, stdenv
+, python
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, cryptography
+, incremental
+, twisted
+, automat
+, zope_interface
+, idna
+, pyopenssl
+, service-identity
+, pytestCheckHook
+, mock
+, lsof
+, GeoIP
+}:
+
+buildPythonPackage rec {
+  pname = "txtorcon";
+  version = "22.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-iaG2XjKks2nWfmwWY4f7xGjMXQUidEjSOaXn6XGKoFM=";
+  };
+
+  propagatedBuildInputs = [
+    cryptography
+    incremental
+    twisted
+    automat
+    zope_interface
+  ] ++ twisted.optional-dependencies.tls;
+
+  checkInputs = [ pytestCheckHook mock lsof GeoIP ];
+
+  doCheck = !(stdenv.isDarwin && stdenv.isAarch64);
+
+  meta = {
+    description = "Twisted-based Tor controller client, with state-tracking and configuration abstractions";
+    homepage = "https://github.com/meejah/txtorcon";
+    maintainers = with lib.maintainers; [ jluttine exarkun ];
+    license = lib.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..6ae66dba90ca
--- /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";
+    sha256 = "sha256-jWB9C/CcqUYAuOQvByHb5D7lOgRwGCNErHrOfljcYXc=";
+  };
+
+  propagatedBuildInputs = [
+    pyzmq
+    twisted
+  ];
+
+  checkInputs = [
+    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/typecode/default.nix b/nixpkgs/pkgs/development/python-modules/typecode/default.nix
new file mode 100644
index 000000000000..2fa0010bdd03
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/typecode/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, setuptools-scm
+, attrs
+, pdfminer-six
+, commoncode
+, plugincode
+, binaryornot
+, typecode-libmagic
+, pytestCheckHook
+, pytest-xdist
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "typecode";
+  version = "30.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-pRGLU/xzQQqDZMIsrq1Fy7VgGIpFjnHtpmO+yL7t4g8=";
+  };
+
+  dontConfigure = true;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    attrs
+    pdfminer-six
+    commoncode
+    plugincode
+    binaryornot
+    typecode-libmagic
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    pytest-xdist
+  ];
+
+  disabledTests = [
+    "TestFileTypesDataDriven"
+    # AssertionError: assert 'application/x-bytecode.python'...
+    "test_compiled_python_1"
+    "test_package_json"
+  ];
+
+  pythonImportsCheck = [
+    "typecode"
+  ];
+
+  meta = with lib; {
+    description = "Comprehensive filetype and mimetype detection using libmagic and Pygments";
+    homepage = "https://github.com/nexB/typecode";
+    license = licenses.asl20;
+    maintainers = teams.determinatesystems.members;
+  };
+}
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..5668b62e200f
--- /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 = "source/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 = teams.determinatesystems.members;
+    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..0c5e1fa3cd27
--- /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=";
+  };
+
+  checkInputs = [
+    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; [ SuperSandro2000 ];
+  };
+}
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..8d04df43efeb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/typed-settings/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, setuptoolsBuildHook
+, attrs
+, cattrs
+, toml
+, pytestCheckHook
+, click
+, click-option-group
+}:
+
+buildPythonPackage rec {
+  pname = "typed-settings";
+  version = "1.1.0";
+  format = "pyproject";
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-Ja2ZLqzJSSvK5hIMhayMztJta/Jc3tmb2tzdlxageAs=";
+  };
+
+  nativeBuildInputs = [
+    setuptoolsBuildHook
+  ];
+
+  propagatedBuildInputs = [
+    attrs
+    cattrs
+    click-option-group
+    toml
+  ];
+
+  pytestFlagsArray = [
+    "tests"
+  ];
+
+  checkInputs = [
+    click
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "typed_settings" ];
+
+  meta = {
+    description = "Typed settings based on attrs classes";
+    homepage = "https://gitlab.com/sscherfke/typed-settings";
+    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..dd3f62527aa2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/typeguard/default.nix
@@ -0,0 +1,48 @@
+{ buildPythonPackage
+, fetchPypi
+, pythonOlder
+, lib
+, setuptools-scm
+, pytestCheckHook
+, typing-extensions
+, glibcLocales
+}:
+
+buildPythonPackage rec {
+  pname = "typeguard";
+  version = "2.13.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "00edaa8da3a133674796cf5ea87d9f4b4c367d77476e185e80251cc13dfbb8c4";
+  };
+
+  buildInputs = [ setuptools-scm ];
+  nativeBuildInputs = [ glibcLocales ];
+
+  LC_ALL="en_US.utf-8";
+
+  postPatch = ''
+    substituteInPlace setup.cfg --replace " --cov" ""
+  '';
+
+  checkInputs = [ pytestCheckHook typing-extensions ];
+
+  disabledTestPaths = [
+    # mypy tests aren't passing with latest mypy
+    "tests/mypy"
+  ];
+
+  disabledTests = [
+    # not compatible with python3.10
+    "test_typed_dict"
+  ];
+
+  disabled = pythonOlder "3.3";
+
+  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;
+  };
+}
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..2019a956ce54
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/typer/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchpatch
+, fetchPypi
+, flit-core
+, click
+, pytestCheckHook
+, rich
+, shellingham
+, pytest-xdist
+, pytest-sugar
+, coverage
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "typer";
+  version = "0.6.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-LVcgpeY/c+rzHtqhX2q4fzXwaQ+MojMBfX0j10OpHXM=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    click
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    pytest-xdist
+    pytest-sugar
+    shellingham
+    rich
+    coverage # execs coverage in tests
+  ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d);
+  '';
+  disabledTests = lib.optionals stdenv.isDarwin [
+    # likely related to https://github.com/sarugaku/shellingham/issues/35
+    "test_show_completion"
+    "test_install_completion"
+  ] ++ lib.optionals (stdenv.isLinux && stdenv.isAarch64) [
+    "test_install_completion"
+  ];
+
+  pythonImportsCheck = [ "typer" ];
+
+  meta = with lib; {
+    description = "Python library for building CLI applications";
+    homepage = "https://typer.tiangolo.com/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ winpat ];
+  };
+}
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..20ca61133713
--- /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";
+  format = "setuptools";
+
+  src = fetchPypi {
+    pname = "types-python-dateutil";
+    inherit version;
+    hash = "sha256-v9PrOcclOupLojsQ9psBfTCwE2YrtL5KtIsgu9dj8wk=";
+  };
+
+  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..bf2c33453204
--- /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";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-DLDMSrbNb5CYHPUwN2vl0BFWyPQjod/xRWu8AlnT45M=";
+  };
+
+  # 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-docutils/default.nix b/nixpkgs/pkgs/development/python-modules/types-docutils/default.nix
new file mode 100644
index 000000000000..14b3e6ed5d25
--- /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.19.0";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-lJNrGWGqzaYexrsKzxFpzXgwtSMLZFhVwdR4m68ZaF4=";
+  };
+
+  # 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-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-protobuf/default.nix b/nixpkgs/pkgs/development/python-modules/types-protobuf/default.nix
new file mode 100644
index 000000000000..e3b8069f53d6
--- /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 = "3.19.22";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-0rJoYbDLRqPIZpsN9Qe373Lkh9pm1h+fNXaqds4CioM=";
+  };
+
+  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-pytz/default.nix b/nixpkgs/pkgs/development/python-modules/types-pytz/default.nix
new file mode 100644
index 000000000000..fe533ab5ea3c
--- /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 = "2022.1.2";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-GoslwiXF5r2EaKqetF3dOzN/ZxbUByrQqk7x5BR47rw=";
+  };
+
+  # 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..28bf37873879
--- /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.11";
+  format = "setuptools";
+
+  src = fetchPypi {
+    pname = "types-PyYAML";
+    inherit version;
+    sha256 = "sha256-f32i/RHpvB5enrPqG+hPSEl0cBeln8Lu4Oo07RFHwuA=";
+  };
+
+  # 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..3ba879569452
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/types-redis/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "types-redis";
+  version = "4.3.14";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-qllV/18QuHqQIcAx6wAqVEpBoKYoAITsB1ioqBKjdcQ=";
+  };
+
+  # 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..f8b663abe6fe
--- /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.28.8";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-ep97FS1ZShwY3UkyzdJZa4777t/XPKpOSrs3VYBbRoU=";
+  };
+
+  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-setuptools/default.nix b/nixpkgs/pkgs/development/python-modules/types-setuptools/default.nix
new file mode 100644
index 000000000000..b84e1059c2eb
--- /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 = "64.0.1";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-gpC2vx2RbmsAd4TVy80RKhr5otdjQyMfzOClUYU0NwI=";
+  };
+
+  # 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..dd3a6b461c78
--- /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.8.11";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-F6X6O1ykU4FXePyYZejs0BGLB7K5+v8+Kwb+RIF03V4=";
+  };
+
+  # 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..ec73535a9386
--- /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";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-t+fqVyMIsQMNyGw7qCXFIQgUwoJWEuxnnreBT43ZKVo=";
+  };
+
+  # 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-typed-ast/default.nix b/nixpkgs/pkgs/development/python-modules/types-typed-ast/default.nix
new file mode 100644
index 000000000000..ca45ec7039ba
--- /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.6";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-UzmUeAz3KbdAwUdQZsRAdi8pqZvalRHU+mhdXuOoQ4k=";
+  };
+
+  # 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; [ SuperSandro2000 veehaitch ];
+  };
+}
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..b17d83a35190
--- /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.22";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-sFr5DnOInmiAlACKl8qVeI24vzc24ndv1D+2sXFIXZQ=";
+  };
+
+  # 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..a4d8125b5d61
--- /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 ];
+  checkInputs = [ 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..30d26293e5d1
--- /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
+  ];
+
+  checkInputs = [
+    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; [ costrouc ];
+  };
+}
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..066c3f452ed1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/typical/default.nix
@@ -0,0 +1,89 @@
+{ lib
+, buildPythonPackage
+, fastjsonschema
+, fetchFromGitHub
+, fetchpatch
+, future-typing
+, inflection
+, mypy
+, orjson
+, pandas
+, pendulum
+, poetry-core
+, pydantic
+, pytestCheckHook
+, pythonOlder
+, sqlalchemy
+, ujson
+}:
+
+buildPythonPackage rec {
+  pname = "typical";
+  version = "2.8.0";
+  format = "pyproject";
+
+  # Support for typing-extensions >= 4.0.0 on Python < 3.10 is missing
+  disabled = pythonOlder "3.10";
+
+  src = fetchFromGitHub {
+    owner = "seandstewart";
+    repo = "typical";
+    rev = "v${version}";
+    hash = "sha256-DRjQmoZzWw5vpwIx70wQg6EO/aHqyX7RWpWZ9uOxSTg=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    fastjsonschema
+    future-typing
+    inflection
+    orjson
+    pendulum
+    ujson
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    mypy
+    pydantic
+    sqlalchemy
+    pandas
+  ];
+
+  patches = [
+    # Switch to poetry-core, https://github.com/seandstewart/typical/pull/193
+    (fetchpatch {
+      name = "switch-to-poetry-core.patch";
+      url = "https://github.com/seandstewart/typical/commit/66b3c34f8969b7fb1f684f0603e514405bab0dd7.patch";
+      sha256 = "sha256-c7qJOtHmJRnVEGl+OADB3HpjvMK8aYDD9+0gplOn9pQ=";
+    })
+  ];
+
+  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/";
+    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..36464204e75d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/typing-extensions/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, flit-core
+, python
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "typing-extensions";
+  version = "4.3.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    pname = "typing_extensions";
+    inherit version;
+    hash = "sha256-5tJnejL0f8frJ5XbHdFcHzTv9ha8ryz7Xpl/hU+hxKY=";
+  };
+
+  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 3.5+";
+    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..d54016049364
--- /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.7.1";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "typing_inspect";
+    sha256 = "1al2lyi3r189r5xgw90shbxvd88ic4si9w7n3d9lczxiv6bl0z84";
+  };
+
+  propagatedBuildInputs = [
+    typing-extensions
+    mypy-extensions
+  ];
+
+  checkInputs = [
+    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/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..ee8166abb946
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tzdata/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, importlib-resources
+, pytest-subtests
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "tzdata";
+  version = "2022.1";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-i1NqjsY9wHUTQrOYQZOjEY+Pyir+JXUrubf//TmFUtM=";
+  };
+
+  checkInputs = [
+    pytestCheckHook
+    pytest-subtests
+  ] ++ lib.optional (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; [ SuperSandro2000 ];
+  };
+}
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..bb51abb1822c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tzlocal/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, pytz-deprecation-shim
+, pytest-mock
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "tzlocal";
+  version = "4.2"; # version needs to be compatible with APScheduler
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ee5842fa3a795f023514ac2d801c4a81d1743bbe642e3940143326b3a00addd7";
+  };
+
+  propagatedBuildInputs = [
+    pytz-deprecation-shim
+  ];
+
+  checkInputs = [
+    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..f44b7db455b1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/u-msgpack-python/default.nix
@@ -0,0 +1,31 @@
+{ buildPythonPackage
+, lib
+, fetchPypi
+, glibcLocales
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "u-msgpack-python";
+  version = "2.7.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b7e7d433cab77171a4c752875d91836f3040306bab5063fb6dbe11f64ea69551";
+  };
+
+  LC_ALL="en_US.UTF-8";
+
+  buildInputs = [ glibcLocales ];
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest discover
+  '';
+
+  meta = {
+    description = "A portable, lightweight MessagePack serializer and deserializer written in pure Python";
+    homepage = "https://github.com/vsergeev/u-msgpack-python";
+    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..6a232cfbe55c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ua-parser/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pyyaml
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "ua-parser";
+  version = "0.15.0";
+
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "ua-parser";
+    repo = "uap-python";
+    rev = version;
+    fetchSubmodules = true;
+    hash = "sha256-TtOj1ZL8+4T95AgF9ErvI+0W35WQ23snFhCyCbuRjxM=";
+  };
+
+  patches = [
+    ./dont-fetch-submodule.patch
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "pyyaml ~= 5.4.0" pyyaml
+  '';
+
+  nativeBuildInputs = [
+    pyyaml
+  ];
+
+  preBuild = ''
+    mkdir -p build/lib/ua_parser
+  '';
+
+  checkInputs = [
+    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/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..261e50b9afab
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/uamqp/default.nix
@@ -0,0 +1,76 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, certifi
+, CFNetwork
+, cmake
+, CoreFoundation
+, enum34
+, fetchpatch
+, fetchPypi
+, isPy3k
+, openssl
+, Security
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "uamqp";
+  version = "1.5.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-guhfOMvddC4E+oOmvpeG8GsXEfqLcSHVdtj3w8fF2Vs=";
+  };
+
+  patches = lib.optionals (stdenv.isDarwin && stdenv.isx86_64) [
+    ./darwin-azure-c-shared-utility-corefoundation.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
+  '';
+
+  nativeBuildInputs = [
+    cmake
+  ];
+
+  buildInputs = lib.optionals stdenv.isDarwin [
+    CoreFoundation
+    CFNetwork
+    Security
+  ];
+
+  propagatedBuildInputs = [
+    certifi
+    openssl
+    six
+  ] ++ lib.optionals (!isPy3k) [
+    enum34
+  ];
+
+  dontUseCmakeConfigure = true;
+
+  # Project has no tests
+  doCheck = false;
+
+  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..4d7fe6b034b4
--- /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";
+    }
+  )];
+
+  checkInputs = [ 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 = [ maintainers.costrouc ];
+  };
+}
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..49ab9906c51b
--- /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
+  ];
+
+  checkInputs = [
+    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/uc-micro-py/default.nix b/nixpkgs/pkgs/development/python-modules/uc-micro-py/default.nix
new file mode 100644
index 000000000000..9b20e2251165
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/uc-micro-py/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "uc-micro-py";
+  version = "1.0.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "tsutsu3";
+    repo = "uc.micro-py";
+    rev = "v${version}";
+    hash = "sha256-23mKwoRGjtxpCOC26V8bAN5QEHLDOoSqPeTlUuIrxZ0=";
+  };
+
+  checkInputs = [ pytestCheckHook ];
+  pythonImportsCheck = [ "uc_micro" ];
+
+  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/udatetime/default.nix b/nixpkgs/pkgs/development/python-modules/udatetime/default.nix
new file mode 100644
index 000000000000..457020af6457
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/udatetime/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+}:
+
+buildPythonPackage rec {
+  pname = "udatetime";
+  version = "0.0.16";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "09vlcskvaxnfk73l9w5xgl2ks9l62g1b24yrm0xxb7gn93qxglw2";
+  };
+
+  patches = [
+    # fix build with python 3.9
+    (fetchpatch {
+      url = "https://github.com/freach/udatetime/pull/33.patch";
+      sha256 = "02wm7ivkv1viqn2wflgd10dgpddfqfrwacmrldigb1mwb79n554j";
+    })
+  ];
+
+  # 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/ufo2ft/default.nix b/nixpkgs/pkgs/development/python-modules/ufo2ft/default.nix
new file mode 100644
index 000000000000..5a87bfd42c2b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ufo2ft/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools-scm
+, fonttools
+, defcon
+, compreffor
+, booleanoperations
+, cffsubr
+, ufoLib2
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "ufo2ft";
+  version = "2.28.0";
+
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-pWHvjAvHNWlmJiQ75JRmFyrjYnzbJG7M8/DGoIWpEBk=";
+  };
+
+  patches = [
+    # Use cu2qu from fonttools.
+    # https://github.com/googlefonts/ufo2ft/pull/461
+    ./fonttools-cu2qu.patch
+  ];
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    fonttools
+    defcon
+    compreffor
+    booleanoperations
+    cffsubr
+    ufoLib2
+  ];
+
+  checkInputs = [
+    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; [ jtojnar ];
+  };
+}
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..fab42e5169b8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ufoLib2/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, attrs
+, fonttools
+, pytestCheckHook
+, fs
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "ufoLib2";
+  version = "0.13.1";
+
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-MnWi2mI+bUt+4pyYTNs6W4a7wj8KHOlEhti7XDCKpHs=";
+  };
+
+  propagatedBuildInputs = [
+    attrs
+    fonttools
+    # required by fonttools[ufo]
+    fs
+  ];
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+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; [ jtojnar ];
+  };
+}
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..ac0fd9fb66b1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/uharfbuzz/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, cython
+, setuptools-scm
+, pytestCheckHook
+, ApplicationServices
+}:
+
+buildPythonPackage rec {
+  pname = "uharfbuzz";
+  version = "0.24.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.5";
+
+  # Fetching from GitHub as Pypi contains different versions
+  src = fetchFromGitHub {
+    owner = "harfbuzz";
+    repo = "uharfbuzz";
+    rev = "v${version}";
+    sha256 = "sha256-DyFXbwB28JH2lvmWDezRh49tjCvleviUNSE5LHG3kUg=";
+    fetchSubmodules = true;
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    cython
+    setuptools-scm
+  ];
+
+  buildInputs = lib.optionals stdenv.isDarwin [ ApplicationServices ];
+
+  checkInputs = [
+    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; [ wolfangaukang ];
+  };
+}
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..ee2fede8e9f8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ujson/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPyPy
+, pytestCheckHook
+, pythonOlder
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "ujson";
+  version = "5.4.0";
+  disabled = isPyPy || pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-a5U+CUQeMHUEEwdV5b1rFYUBeNWR9mKSu6RgjE9/mwA=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  checkInputs = [
+    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; [ SuperSandro2000 ];
+  };
+}
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..dfdcf3515220
--- /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
+  ];
+
+  checkInputs = [
+    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..00854ded3167
--- /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
+  ];
+
+  checkInputs = [
+    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/ultraheat-api/default.nix b/nixpkgs/pkgs/development/python-modules/ultraheat-api/default.nix
new file mode 100644
index 000000000000..9eee34d15431
--- /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.4.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "ultraheat_api";
+    inherit version;
+    hash = "sha256-6idbapqxPgA6st2ayuEiHc6WDDmsb3AJU1FnJjOukaM=";
+  };
+
+  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..25016f9b4cc5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/umap-learn/default.nix
@@ -0,0 +1,69 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, keras
+, numba
+, numpy
+, pynndescent
+, pytestCheckHook
+, pythonOlder
+, scikit-learn
+, scipy
+, tensorflow
+, tqdm
+}:
+
+buildPythonPackage rec {
+  pname = "umap-learn";
+  version = "0.5.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "lmcinnes";
+    repo = "umap";
+    rev = version;
+    hash = "sha256-S2+k7Ec4AxsN6d0GUGnU81oLnBgmlZp8OmUFCNaUJYw=";
+  };
+
+  propagatedBuildInputs = [
+    numba
+    numpy
+    pynndescent
+    scikit-learn
+    scipy
+    tqdm
+  ];
+
+  checkInputs = [
+    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; [ costrouc ];
+  };
+}
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..9b37edfb2841
--- /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
+  ];
+
+  checkInputs = [
+    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..06bdf12349dc
--- /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;
+    sha256 = "sha256-gBEeCDnyOcWyM8tHcgF7SDoLehVzpYG5Krd0ajXm+qs=";
+  };
+
+  propagatedBuildInputs = [ future ];
+  checkInputs = [ 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..15c7322fb3c3
--- /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.8.0";
+  disabled = pythonAtLeast "3.9"; # See: https://github.com/rocky/python-uncompyle6/issues/331
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-YgYzYY9t/B8+eBh+Igk014/8Y5wOOdrsofxTWquBcBQ=";
+  };
+
+  checkInputs = [ 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/unicode-slugify/default.nix b/nixpkgs/pkgs/development/python-modules/unicode-slugify/default.nix
new file mode 100644
index 000000000000..102af56618b8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/unicode-slugify/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nose
+, six
+, unittest2
+, unidecode
+}:
+
+buildPythonPackage rec {
+  pname = "unicode-slugify";
+  version = "0.1.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "25f424258317e4cb41093e2953374b3af1f23097297664731cdb3ae46f6bd6c3";
+  };
+
+  propagatedBuildInputs = [ six unidecode ];
+
+  checkInputs = [ nose unittest2 ];
+
+  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..a14895fa7996
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/unicodedata2/default.nix
@@ -0,0 +1,22 @@
+{ lib, buildPythonPackage, fetchPypi, pytestCheckHook, isPy27 }:
+
+buildPythonPackage rec {
+  pname = "unicodedata2";
+  version = "14.0.0";
+
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit version pname;
+    sha256 = "110nnvh02ssp92xbmswy39aa186jrmb7m41x4220wigl8c0dzxs1";
+  };
+
+  checkInputs = [ pytestCheckHook ];
+
+  meta = with lib; {
+    description = "Backport and updates for the unicodedata module";
+    homepage = "https://github.com/mikekap/unicodedata2";
+    license = licenses.asl20;
+    maintainers = [ 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..8a568a47c0e4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/unicorn/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, setuptools
+, unicorn-emu
+}:
+
+buildPythonPackage rec {
+  pname = "unicorn";
+  version = lib.getVersion unicorn-emu;
+  format = "setuptools";
+
+  src = unicorn-emu.src;
+
+  sourceRoot = "source/bindings/python";
+
+  prePatch = ''
+    ln -s ${unicorn-emu}/lib/libunicorn${stdenv.targetPlatform.extensions.sharedLibrary} prebuilt/
+    ln -s ${unicorn-emu}/lib/libunicorn.a 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..db69fef99cb3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/unicrypto/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pycryptodome
+, pycryptodomex
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "unicrypto";
+  version = "0.0.8";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-BIf53ZAJwybulTGnlBKuGK1nNCWhyADWSUe5b96wTN8=";
+  };
+
+  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";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..96e487871aa3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/unidecode/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "unidecode";
+  version = "1.3.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "avian2";
+    repo = pname;
+    rev = "${pname}-${version}";
+    hash = "sha256-2LRV6Egst2bdxefEzfuA9Ef8zMSWvmlCEV/sIzezyPw=";
+  };
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "unidecode"
+  ];
+
+  meta = with lib; {
+    description = "ASCII transliterations of Unicode text";
+    homepage = "https://pypi.python.org/pypi/Unidecode/";
+    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/unidiff/default.nix b/nixpkgs/pkgs/development/python-modules/unidiff/default.nix
new file mode 100644
index 000000000000..8fe8a760cf09
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/unidiff/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchPypi, python }:
+
+buildPythonPackage rec {
+  pname = "unidiff";
+  version = "0.7.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "2bbcbc986e1fb97f04b1d7b864aa6002ab02f4d8a996bf03aa6e5a81447d1fc5";
+  };
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest discover -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..68d28d0f4756
--- /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.5";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "bdraco";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-WO1oLD09fokMR7lVCqs1Qeodjc+Yg431otl9rohtmPo=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    pyroute2
+  ];
+
+  checkInputs = [
+    aioresponses
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "--asyncio-mode=legacy"
+  ];
+
+  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..a1061ad9df91
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/unify/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, untokenize
+, python
+}:
+
+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 ];
+
+  checkPhase = "${python.interpreter} -m unittest discover";
+
+  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..13ae42823ff1
--- /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 = [ maintainers.costrouc ];
+  };
+}
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..c59b3428c096
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/unittest-xml-reporting/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, lxml
+, 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;
+    sha256 = "sha256-lOJ/+8CVJUXdIaZLLF5PpPkG0DzlNgo46kRZ1Xy7Ju0=";
+  };
+
+  propagatedBuildInputs = [
+    lxml
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  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 SuperSandro2000 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/unittest2/collections-compat.patch b/nixpkgs/pkgs/development/python-modules/unittest2/collections-compat.patch
new file mode 100644
index 000000000000..350c9d716783
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/unittest2/collections-compat.patch
@@ -0,0 +1,19 @@
+diff --git a/unittest2/compatibility.py b/unittest2/compatibility.py
+index 9e5f1a5..473957c 100644
+--- a/unittest2/compatibility.py
++++ b/unittest2/compatibility.py
+@@ -1,4 +1,5 @@
+ import collections
++import collections.abc
+ import os
+ import sys
+ 
+@@ -140,7 +141,7 @@ except ImportError:
+ ###  ChainMap (helper for configparser and string.Template)
+ ########################################################################
+ 
+-class ChainMap(collections.MutableMapping):
++class ChainMap(collections.abc.MutableMapping):
+     ''' A ChainMap groups multiple dicts (or other mappings) together
+     to create a single, updateable view.
+ 
diff --git a/nixpkgs/pkgs/development/python-modules/unittest2/default.nix b/nixpkgs/pkgs/development/python-modules/unittest2/default.nix
new file mode 100644
index 000000000000..786b8996f83b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/unittest2/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, six
+, traceback2
+, pythonAtLeast
+}:
+
+buildPythonPackage rec {
+  version = "1.1.0";
+  pname = "unittest2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0y855kmx7a8rnf81d3lh5lyxai1908xjp0laf4glwa4c8472m212";
+  };
+
+  patches = lib.optionals (pythonAtLeast "3.7") [
+    ./collections-compat.patch
+  ];
+
+  propagatedBuildInputs = [ six traceback2 ];
+
+  # 1.0.0 and up create a circle dependency with traceback2/pbr
+  doCheck = false;
+
+  postPatch = ''
+    # argparse is needed for python < 2.7, which we do not support anymore.
+    substituteInPlace setup.py --replace "argparse" ""
+
+    # fixes a transient error when collecting tests, see https://bugs.launchpad.net/python-neutronclient/+bug/1508547
+    sed -i '510i\        return None, False' unittest2/loader.py
+    # https://github.com/pypa/packaging/pull/36
+    sed -i 's/version=VERSION/version=str(VERSION)/' setup.py
+  '';
+
+  meta = with lib; {
+    description = "A backport of the new features added to the unittest testing framework";
+    homepage = "https://pypi.org/project/unittest2/";
+    license = licenses.bsd0;
+  };
+}
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..ca3f2b6ce445
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/univers/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, fetchPypi
+, fetchpatch
+, buildPythonPackage
+, setuptools-scm
+, attrs
+, packaging
+, pyparsing
+, semantic-version
+, semver
+, commoncode
+, pytestCheckHook
+, saneyaml
+}:
+
+buildPythonPackage rec {
+  pname = "univers";
+  version = "30.7.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-yM0SDBpkiZEbaZ0ugjiMwwUFKqZGbmh1JNlv5qvPAYo=";
+  };
+
+  patches = [
+    # Make tests work when not using virtualenv, can be dropped with the next version
+    # Upstream PR (already merged): https://github.com/nexB/univers/pull/77
+    (fetchpatch {
+      url = "https://github.com/nexB/univers/commit/b74229cc1c8790287633cd7220d6b2e97c508302.patch";
+      sha256 = "sha256-i6zWv9rAlwCMghd9g5FP6WIQLLDLYvp+6qJ1E7nfTSY=";
+    })
+  ];
+
+  nativeBuildInputs = [ setuptools-scm ];
+  propagatedBuildInputs = [ attrs packaging pyparsing semantic-version semver ];
+  checkInputs = [ commoncode pytestCheckHook saneyaml ];
+
+  dontConfigure = true; # ./configure tries to setup virtualenv and downloads dependencies
+
+  disabledTests = [ "test_codestyle" ];
+
+  pythonImportsCheck = [ "univers" ];
+
+  meta = with lib; {
+    description = "Library for parsing version ranges and expressions";
+    homepage = "https://github.com/nexB/univers";
+    license = with licenses; [ asl20 bsd3 mit ];
+    maintainers = with maintainers; [ armijnhemel sbruder ];
+  };
+}
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..4feb29a09016
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/unrardll/default.nix
@@ -0,0 +1,22 @@
+{ lib, buildPythonPackage, fetchPypi, unrar }:
+
+buildPythonPackage rec {
+  pname = "unrardll";
+  version = "0.1.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "8bebb480b96cd49d4290d814914f39cff75cf0fa0514c4790bb32b1757227c78";
+  };
+
+  buildInputs = [ unrar ];
+
+  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..aad23c6fdf9f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/unrpa/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildPythonPackage, fetchPypi, uncompyle6, isPy27 }:
+
+buildPythonPackage rec {
+  pname = "unrpa";
+  version = "2.3.0";
+
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0yl4qdwp3in170ks98qnldqz3r2iyzil5g1775ccg98qkh95s724";
+  };
+
+  propagatedBuildInputs = [ uncompyle6 ];
+
+  pythonImportsCheck = [ "unrpa" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/Lattyware/unrpa";
+    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/untangle/default.nix b/nixpkgs/pkgs/development/python-modules/untangle/default.nix
new file mode 100644
index 000000000000..6582f5080bd0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/untangle/default.nix
@@ -0,0 +1,29 @@
+{ lib, buildPythonPackage, fetchFromGitHub, python, 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}";
+    sha256 = "sha256-cJkN8vT5hW5hRuLxr/6udwMO4GVH1pJhAc6qmPO2EEI=";
+  };
+
+  propagatedBuildInputs = [
+    defusedxml
+  ];
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest discover -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..55becfeac4e8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/untokenize/default.nix
@@ -0,0 +1,24 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "untokenize";
+  version = "0.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3865dbbbb8efb4bb5eaa72f1be7f3e0be00ea8b7f125c69cbd1f5fda926f37a2";
+  };
+
+  checkPhase = "${python.interpreter} -m unittest discover";
+
+  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..52b422c0e1d3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/upb-lib/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, pyserial-asyncio
+, pytz
+}:
+
+buildPythonPackage rec {
+  pname = "upb-lib";
+  version = "0.5.1";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-iXwJPe6YYG2TWiQ/dXbeIiadzGMgFzZa6Now692r+t0=";
+  };
+
+  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..e70a49be5a87
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/upcloud-api/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, requests
+, pytestCheckHook
+, responses
+}:
+
+buildPythonPackage rec {
+  pname = "upcloud-api";
+  version = "2.0.0";
+
+  src = fetchFromGitHub {
+    owner = "UpCloudLtd";
+    repo = "upcloud-python-api";
+    rev = "v${version}";
+    sha256 = "1kkgrn97pw4k49ys97hjrvh2j8y2p2r9970v9csgrk5wci4562wm";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    responses
+  ];
+
+  pythonImportsCheck = [ "upcloud_api" ];
+
+  meta = with lib; {
+    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..a89f0df403c3
--- /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
+  ];
+
+  checkInputs = [
+    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..50bbb8b6fd21
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/uproot/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, awkward
+, numpy
+, lz4
+, setuptools
+, xxhash
+, zstandard
+, pytestCheckHook
+, scikit-hep-testdata
+}:
+
+buildPythonPackage rec {
+  pname = "uproot";
+  version = "4.3.3";
+
+  # fetch from github for tests
+  src = fetchFromGitHub {
+    owner = "scikit-hep";
+    repo = "uproot4";
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-7wc5KmnjCA90zOaq3qi5V1vvXi4tPwor8tK20i9WrTY=";
+  };
+
+  propagatedBuildInputs = [
+    awkward
+    numpy
+    lz4
+    setuptools
+    xxhash
+    zstandard
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    scikit-hep-testdata
+  ];
+  preCheck = ''
+    export HOME="$(mktemp -d)"
+  '';
+  disabledTests = [
+    # tests that try to download files
+    "test_http"
+    "test_no_multipart"
+    "test_fallback"
+    "test_pickle_roundtrip_http"
+  ];
+  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"
+  ];
+  pythonImportsCheck = [ "uproot" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/scikit-hep/uproot5";
+    description = "ROOT I/O in pure Python and Numpy";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ veprbl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/uproot3-methods/default.nix b/nixpkgs/pkgs/development/python-modules/uproot3-methods/default.nix
new file mode 100644
index 000000000000..f5760b974ffd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/uproot3-methods/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, numpy
+, awkward0
+}:
+
+buildPythonPackage rec {
+  version = "0.10.1";
+  pname = "uproot3-methods";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "dd68f90be1ea276360b96369836849df29045f7fe4e534f9ac21ea00798ee358";
+  };
+
+  nativeBuildInputs = [ awkward0 ];
+
+  propagatedBuildInputs = [ numpy awkward0 ];
+
+  # No tests on PyPi
+  doCheck = false;
+  pythonImportsCheck = [ "uproot3_methods" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/scikit-hep/uproot3-methods";
+    description = "Pythonic mix-ins for ROOT classes";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ costrouc SuperSandro2000 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/uproot3/default.nix b/nixpkgs/pkgs/development/python-modules/uproot3/default.nix
new file mode 100644
index 000000000000..e5b3903eefa7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/uproot3/default.nix
@@ -0,0 +1,47 @@
+{ lib, fetchFromGitHub, buildPythonPackage, isPy27
+, awkward0, backports_lzma ? null, cachetools, lz4, pandas
+, pytestCheckHook, pkgconfig, mock
+, numpy, requests, uproot3-methods, xxhash, zstandard
+}:
+
+buildPythonPackage rec {
+  pname = "uproot3";
+  version = "3.14.4";
+
+  src = fetchFromGitHub {
+    owner = "scikit-hep";
+    repo = "uproot3";
+    rev = version;
+    sha256 = "sha256-hVJpKdYvyoCPyqgZzKYp30SvkYm+HWSNBdd9bYCYACE=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace '"pytest-runner"' ""
+  '';
+
+  propagatedBuildInputs = [
+    awkward0
+    cachetools
+    lz4
+    numpy
+    uproot3-methods
+    xxhash
+    zstandard
+  ] ++ lib.optional isPy27 backports_lzma;
+
+  checkInputs = [
+    mock
+    pandas
+    pkgconfig
+    pytestCheckHook
+    requests
+  ] ++ lib.optional isPy27 backports_lzma;
+
+  meta = with lib; {
+    homepage = "https://github.com/scikit-hep/uproot3";
+    description = "ROOT I/O in pure Python and Numpy";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ktf SuperSandro2000 ];
+  };
+}
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/uranium/default.nix b/nixpkgs/pkgs/development/python-modules/uranium/default.nix
new file mode 100644
index 000000000000..58b96b5cd7a4
--- /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;
+    sha256 = "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..b09b2e1b7671
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/uri-template/default.nix
@@ -0,0 +1,30 @@
+{ lib, buildPythonPackage, fetchFromGitHub, python }:
+
+buildPythonPackage rec {
+  pname = "uri-template";
+  version = "1.2.0";
+
+  src = fetchFromGitHub {
+    owner = "plinss";
+    repo = "uri_template";
+    rev = "v${version}";
+    sha256 = "sha256-IAq6GpEwimq45FU0QugLZLSOhwAmC1KbpZKD0zyxsUs=";
+  };
+
+  postPatch = ''
+    sed -i -e 's/0.0.0/${version}/' setup.py
+  '';
+
+  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 = [];
+  };
+}
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..814e7fd8c19a
--- /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;
+    sha256 = "sha256-Q0bt/Fw7efaUvM1tYJmjIrvrYo2/LNhu6lWkVs5RJPA=";
+  };
+
+  propagatedBuildInputs = [
+    simplejson
+  ];
+
+  checkInputs = [
+    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..3d1b274d0690
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/uritools/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "uritools";
+  version = "4.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "420d94c1ff4bf90c678fca9c17b8314243bbcaa992c400a95e327f7f622e1edf";
+  };
+
+  pythonImportsCheck = [
+    "uritools"
+  ];
+
+  meta = with lib; {
+    description = "RFC 3986 compliant, Unicode-aware, scheme-agnostic replacement for urlparse";
+    homepage = "https://github.com/tkem/uritools/";
+    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..3032f7791a70
--- /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
+  ];
+
+  checkInputs = [
+    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";
+      sha256 = "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..ce520ba1cca3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/urlextract/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, dnspython
+, fetchPypi
+, filelock
+, idna
+, platformdirs
+, pytestCheckHook
+, pythonOlder
+, uritools
+}:
+
+buildPythonPackage rec {
+  pname = "urlextract";
+  version = "1.6.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-V08NjFYtN3M2pRVIQMfk7s9UwQKlOJcciX9zEwdaiIc=";
+  };
+
+  propagatedBuildInputs = [
+    filelock
+    idna
+    platformdirs
+    uritools
+  ];
+
+  checkInputs = [
+    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";
+    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..3cdbdd3a111b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/urllib3/default.nix
@@ -0,0 +1,79 @@
+{ lib
+, brotli
+, brotlicffi
+, buildPythonPackage
+, certifi
+, cryptography
+, fetchPypi
+, idna
+, isPyPy
+, mock
+, pyopenssl
+, pysocks
+, pytest-freezegun
+, pytest-timeout
+, pytestCheckHook
+, python-dateutil
+, tornado
+, trustme
+}:
+
+buildPythonPackage rec {
+  pname = "urllib3";
+  version = "1.26.11";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-6m6PshCxnZUPq5O2DJAJImxjoogIvIOG4FMB4liDrAo=";
+  };
+
+  # FIXME: remove backwards compatbility hack
+  propagatedBuildInputs = passthru.optional-dependencies.brotli
+    ++ passthru.optional-dependencies.socks;
+
+  checkInputs = [
+    python-dateutil
+    mock
+    pytest-freezegun
+    pytest-timeout
+    pytestCheckHook
+    tornado
+    trustme
+  ];
+
+  # 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;
+
+  preCheck = ''
+    export CI # Increases LONG_TIMEOUT
+  '';
+
+  pythonImportsCheck = [
+    "urllib3"
+  ];
+
+  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 ];
+  };
+
+  meta = with lib; {
+    description = "Powerful, sanity-friendly HTTP client for Python";
+    homepage = "https://github.com/shazow/urllib3";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..cd0e028c50c0
--- /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
+  ];
+
+  checkInputs = [
+    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 = teams.determinatesystems.members;
+  };
+}
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..192676ceac82
--- /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;
+    sha256 = "sha256-AYAgy8hku17Ye+F9wmsGnq4nVcsp86nFaarDve0e+vQ=";
+  };
+
+  propagatedBuildInputs = [
+    urwid
+  ];
+
+  checkInputs = [
+    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..57e64ba97a89
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/urwid/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, glibcLocales
+}:
+
+buildPythonPackage rec {
+  pname = "urwid";
+  version = "2.1.2";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "588bee9c1cb208d0906a9f73c613d2bd32c3ed3702012f51efe318a3f2127eae";
+  };
+
+  # tests need to be able to set locale
+  LC_ALL = "en_US.UTF-8";
+  checkInputs = [ glibcLocales ];
+
+  # tests which assert on strings don't decode results correctly
+  doCheck = isPy3k;
+
+  pythonImportsCheck = [
+    "urwid"
+  ];
+
+  meta = with lib; {
+    description = "A full-featured console (xterm et al.) user interface library";
+    homepage = "https://urwid.org/";
+    license = licenses.lgpl21Plus;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..863989156c3d
--- /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;
+    sha256 = "sha256-yGSjwagCd5TiwEFtF6ZhDuVqj4PTa5pVXhs8ebr2O/g=";
+  };
+
+  propagatedBuildInputs = [ urwid ];
+
+  patches = [
+    (fetchpatch {
+      url = "https://github.com/pazz/urwidtrees/commit/ed39dbc4fc67b0e0249bf108116a88cd18543aa9.patch";
+    sha256 = "sha256-fA+30d2uVaoNCg4rtoWLNPvrZtq41Co4vcmM80hkURs=";
+    })
+  ];
+
+  checkInputs = [ 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..4e7d97068f25
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/us/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, jellyfish
+}:
+
+buildPythonPackage rec {
+  pname = "us";
+  version = "2.0.2";
+
+  propagatedBuildInputs = [ jellyfish ];
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "cb11ad0d43deff3a1c3690c74f0c731cff5b862c73339df2edd91133e1496fbc";
+  };
+
+  # Upstream requires jellyfish==0.5.6 but we have 0.6.1
+  postPatch = ''
+    substituteInPlace setup.py --replace "jellyfish==" "jellyfish>="
+  '';
+
+  doCheck = false; # pypi version doesn't include tests
+
+  meta = {
+    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 = lib.licenses.bsd3;
+  };
+}
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..6c8b3ede8088
--- /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}";
+    sha256 = "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..636409f1d967
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/userpath/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, click
+}:
+
+buildPythonPackage rec {
+  pname = "userpath";
+  version = "1.7.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256="sha256-3NZsX6mxo8EjYvMJu7W8eZK6yK+G0XtOaxpLFmoRxD8=";
+  };
+
+  propagatedBuildInputs = [ click ];
+
+  # test suite is difficult to emulate in sandbox due to shell manipulation
+  doCheck = false;
+
+  pythonImportsCheck = [ "click" "userpath" ];
+
+  meta = with lib; {
+    description = "Cross-platform tool for adding locations to the user PATH";
+    homepage = "https://github.com/ofek/userpath";
+    license = [ licenses.asl20 licenses.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..3e7773fb2fd9
--- /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;
+    sha256 = "sha256-eL3vG3yS02enbLYorKvvYKbju9HInffUhrZgkodwhvo=";
+  };
+
+  checkInputs = [
+    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/utils/default.nix b/nixpkgs/pkgs/development/python-modules/utils/default.nix
new file mode 100644
index 000000000000..a6dd57e0e5ea
--- /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";
+  };
+
+  checkInputs = [
+    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..1490172a463a
--- /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";
+  };
+
+  checkInputs = [
+    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..26d23f08afa4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/uvicorn/default.nix
@@ -0,0 +1,73 @@
+{ lib
+, buildPythonPackage
+, callPackage
+, fetchFromGitHub
+, click
+, h11
+, httptools
+, python-dotenv
+, pyyaml
+, typing-extensions
+, uvloop
+, watchfiles
+, websockets
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "uvicorn";
+  version = "0.18.2";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "encode";
+    repo = pname;
+    rev = version;
+    hash = "sha256-nxtDqYh2OmDtoV10CEBGYQrQBf+Xtuf5k9yR6UfCgYc=";
+  };
+
+  outputs = [
+    "out"
+    "testsout"
+  ];
+
+  propagatedBuildInputs = [
+    click
+    h11
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    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..b9cd883f43c0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/uvicorn/tests.nix
@@ -0,0 +1,49 @@
+{ stdenv
+, buildPythonPackage
+, asgiref
+, uvicorn
+, httpx
+, pytest-asyncio
+, pytestCheckHook
+, pytest-mock
+, requests
+, trustme
+, watchgod
+, wsproto
+}:
+
+buildPythonPackage rec {
+  pname = "uvicorn-tests";
+  inherit (uvicorn) version;
+
+  src = uvicorn.testsout;
+
+  dontBuild = true;
+  dontInstall = true;
+
+  checkInputs = [
+    asgiref
+    uvicorn
+    httpx
+    pytestCheckHook
+    pytest-asyncio
+    pytest-mock
+    requests
+    trustme
+
+    # strictly optional dependencies
+    watchgod
+    wsproto
+  ]
+  ++ uvicorn.optional-dependencies.standard;
+
+  doCheck = !stdenv.isDarwin;
+
+  __darwinAllowLocalNetworking = true;
+
+  disabledTests = [
+    "test_supported_upgrade_request"
+    "test_invalid_upgrade"
+  ];
+}
+
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..da17c78a5eb9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/uvloop/default.nix
@@ -0,0 +1,99 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, libuv
+, CoreServices
+, ApplicationServices
+  # Check Inputs
+, aiohttp
+, psutil
+, pyopenssl
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "uvloop";
+  version = "0.16.0";
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f74bc20c7b67d1c27c72601c78cf95be99d5c2cdd4514502b4f3eb0933ff1228";
+  };
+
+  buildInputs = [
+    libuv
+  ] ++ lib.optionals stdenv.isDarwin [
+    CoreServices
+    ApplicationServices
+  ];
+
+  dontUseSetuptoolsCheck = true;
+  checkInputs = [
+    aiohttp
+    pytestCheckHook
+    psutil
+  ];
+
+  LIBUV_CONFIGURE_HOST = stdenv.hostPlatform.config;
+
+  pytestFlagsArray = [
+    # from pytest.ini, these are NECESSARY to prevent failures
+    "--capture=no"
+    "--assert=plain"
+    "--strict"
+    "--tb=native"
+    # Depend on pyopenssl
+    "--deselect tests/test_tcp.py::Test_UV_TCPSSL::test_flush_before_shutdown"
+    "--deselect tests/test_tcp.py::Test_UV_TCPSSL::test_renegotiation"
+    # test gets stuck in epoll_pwait on hydras aarch64 builders
+    # https://github.com/MagicStack/uvloop/issues/412
+    "--deselect tests/test_tcp.py::Test_AIO_TCPSSL::test_remote_shutdown_receives_trailing_data"
+  ] ++ lib.optionals (stdenv.isDarwin && stdenv.isAarch64) [
+    # Flaky test: https://github.com/MagicStack/uvloop/issues/412
+    "--deselect tests/test_tcp.py::Test_UV_TCPSSL::test_shutdown_timeout_handler_not_set"
+    # 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 = lib.optionalString stdenv.isDarwin ''
+    # Work around "OSError: AF_UNIX path too long"
+    # https://github.com/MagicStack/uvloop/issues/463
+    export TMPDIR="/tmp"
+  '' + ''
+    # pyopenssl is not well supported by upstream
+    # https://github.com/NixOS/nixpkgs/issues/175875
+    substituteInPlace tests/test_tcp.py \
+      --replace "from OpenSSL import SSL as openssl_ssl" ""
+    # force using installed/compiled uvloop vs source by moving tests to temp dir
+    export TEST_DIR=$(mktemp -d)
+    cp -r tests $TEST_DIR
+    pushd $TEST_DIR
+  '';
+
+  postCheck = ''
+    popd
+  '';
+
+  pythonImportsCheck = [
+    "uvloop"
+    "uvloop.loop"
+  ];
+
+  # Some of the tests use localhost networking.
+  __darwinAllowLocalNetworking = true;
+
+  meta = with lib; {
+    description = "Fast implementation of asyncio event loop on top of libuv";
+    homepage = "https://github.com/MagicStack/uvloop";
+    license = licenses.mit;
+    maintainers = with maintainers; [ costrouc ];
+  };
+}
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..d43f007c35cd
--- /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
+  ];
+
+  checkInputs = [
+    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..8cb42064ba21
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/validators/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, decorator
+, six
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "validators";
+  version = "0.20.0";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-JBSM5OZBAKLV4mcjPiPnr+tVMWtH0w+q5+tucpK8Imo=";
+  };
+
+  propagatedBuildInputs = [
+    decorator
+    six
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Python Data Validation for Humans™";
+    homepage = "https://github.com/kvesteri/validators";
+    license = licenses.bsd3;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/validictory/default.nix b/nixpkgs/pkgs/development/python-modules/validictory/default.nix
new file mode 100644
index 000000000000..c4172079a607
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/validictory/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, pythonAtLeast
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "validictory";
+  version = "1.1.2";
+
+  disabled = pythonAtLeast "3.10"; # abandoned, should be removed when we move to py310/311
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1fim11vj990rmn59qd67knccjx1p4an7gavbgprpabsrb13bi1rs";
+  };
+
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Validate dicts against a schema";
+    homepage = "https://github.com/sunlightlabs/validictory";
+    license = licenses.mit;
+  };
+
+}
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..3f0f40fc26c6
--- /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 = "0.6";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-BvnHn0Erk87Ce3tYwYf0tBwRJMrG19Af/Y568VJ02uo=";
+  };
+
+  nativeBuildInputs = [ flit ];
+
+  checkInputs = [ 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..c417cb47e2d3
--- /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..821dbb19e635
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vallox-websocket-api/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, construct
+, websockets
+, asynctest
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "vallox-websocket-api";
+  version = "2.12.0";
+
+  disabled = pythonOlder "3.6";
+
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "yozik04";
+    repo = "vallox_websocket_api";
+    rev = "refs/tags/${version}";
+    hash = "sha256-Ibp+oAd6q8Vu9V+TaLzlPbWIDheFUjCyW83Hg4Ztw20=";
+  };
+
+  propagatedBuildInputs = [
+    construct
+    websockets
+  ];
+
+  checkInputs = [
+    asynctest
+    pytestCheckHook
+  ];
+
+  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..bfd5e1ca8b2b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vapoursynth/default.nix
@@ -0,0 +1,22 @@
+{ vapoursynth, cython, buildPythonPackage, python }:
+
+buildPythonPackage {
+  pname = "vapoursynth";
+
+  inherit (vapoursynth) version src;
+
+  nativeBuildInputs = [
+    cython
+  ];
+
+  buildInputs = [
+    vapoursynth
+  ];
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest discover -s $src/test -p "*test.py"
+  '';
+
+  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..2b5dccec558a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/variants/default.nix
@@ -0,0 +1,35 @@
+{ buildPythonPackage
+, isPy27
+, fetchPypi
+, pytest-runner
+, setuptools-scm
+, pytestCheckHook
+, six
+, lib
+}:
+
+buildPythonPackage rec {
+  pname = "variants";
+  version = "0.2.0";
+
+  src = fetchPypi {
+    inherit pname version ;
+    sha256 = "511f75b4cf7483c27e4d86d9accf2b5317267900c166d17636beeed118929b90";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    six
+  ];
+
+  meta = with lib; {
+    description = "Library providing syntactic sugar for creating variant forms of a canonical function";
+    homepage = "https://github.com/python-variants/variants";
+    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/vcrpy/default.nix b/nixpkgs/pkgs/development/python-modules/vcrpy/default.nix
new file mode 100644
index 000000000000..8dbc7b50546e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vcrpy/default.nix
@@ -0,0 +1,51 @@
+{ buildPythonPackage
+, lib
+, isPy27
+, six
+, fetchPypi
+, pyyaml
+, mock
+, contextlib2
+, wrapt
+, pytest
+, pytest-httpbin
+, yarl
+, pythonOlder
+, pythonAtLeast
+}:
+
+buildPythonPackage rec {
+  pname = "vcrpy";
+  version = "4.2.0";
+
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-lFILhvt2WSWtyMd/+TToml4VbCjnSjFDICF+8bRUr+A=";
+  };
+
+  checkInputs = [
+    pytest
+    pytest-httpbin
+  ];
+
+  propagatedBuildInputs = [
+    pyyaml
+    wrapt
+    six
+  ]
+  ++ lib.optionals (pythonOlder "3.3") [ contextlib2 mock ]
+  ++ lib.optionals (pythonAtLeast "3.4") [ yarl ];
+
+  checkPhase = ''
+    py.test --ignore=tests/integration -k "not TestVCRConnection"
+  '';
+
+  meta = with lib; {
+    description = "Automatically mock your HTTP interactions to simplify and speed up testing";
+    homepage = "https://github.com/kevin1024/vcrpy";
+    license = licenses.mit;
+  };
+}
+
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..70ddf7bec97a
--- /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=";
+  };
+
+  checkInputs = [ 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..b51246739518
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vdirsyncer/default.nix
@@ -0,0 +1,75 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, click
+, click-log
+, click-threading
+, requests-toolbelt
+, requests
+, requests-oauthlib
+, atomicwrites
+, hypothesis
+, pytestCheckHook
+, pytest-localserver
+, pytest-subtesthack
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "vdirsyncer";
+  version = "0.18.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-J7w+1R93STX7ujkpFcjI1M9jmuUaRLZ0aGtJoQJfwgE=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "click-log>=0.3.0, <0.4.0" "click-log>=0.3.0, <0.5.0"
+
+    sed -i -e '/--cov/d' -e '/--no-cov/d' setup.cfg
+  '';
+
+  propagatedBuildInputs = [
+    atomicwrites
+    click
+    click-log
+    click-threading
+    requests
+    requests-oauthlib
+    requests-toolbelt
+  ];
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  checkInputs = [
+    hypothesis
+    pytestCheckHook
+    pytest-localserver
+    pytest-subtesthack
+  ];
+
+  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"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/pimutils/vdirsyncer";
+    description = "Synchronize calendars and contacts";
+    license = licenses.mit;
+    maintainers = with maintainers; [ loewenheim ];
+  };
+}
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..9bc875963163
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vega/default.nix
@@ -0,0 +1,33 @@
+{ lib, buildPythonPackage , fetchPypi, pythonOlder
+, jupyter_core, pandas, ipywidgets, jupyter }:
+
+buildPythonPackage rec {
+  pname = "vega";
+  version = "3.6.0";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-cO+7Ynbv/+uoNUOPQvDNZji04llHUBlm95Cyfy+Ny80=";
+  };
+
+  propagatedBuildInputs = [ jupyter jupyter_core pandas ipywidgets ];
+
+  # currently, recommonmark is broken on python3
+  doCheck = false;
+  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 ];
+    platforms = platforms.unix;
+  };
+}
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..70235aa95bd7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vega_datasets/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchPypi, pandas, pytest }:
+
+buildPythonPackage rec {
+  pname = "vega_datasets";
+  version = "0.9.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9dbe9834208e8ec32ab44970df315de9102861e4cda13d8e143aab7a80d93fc0";
+  };
+
+  propagatedBuildInputs = [ pandas ];
+
+  checkInputs = [ pytest ];
+
+  checkPhase = ''
+    py.test vega_datasets --doctest-modules -k 'not column_names'
+  '';
+
+  meta = with lib; {
+    description = "A Python package for offline access to vega datasets";
+    homepage = "https://github.com/altair-viz/vega_datasets";
+    license = licenses.mit;
+  };
+}
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..7328494a61ff
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vehicle/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, aiohttp
+, aresponses
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pydantic
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, yarl
+}:
+
+buildPythonPackage rec {
+  pname = "vehicle";
+  version = "0.4.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "frenck";
+    repo = "python-vehicle";
+    rev = "v${version}";
+    sha256 = "sha256-dvSdYrONUEe+bdZ+9nALrOQ6gJwq9e1dLvuq08xP5tQ=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    pydantic
+    yarl
+  ];
+
+  checkInputs = [
+    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";
+    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..b31af8f36f52
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/velbus-aio/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, backoff
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pyserial
+, pyserial-asyncio
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "velbus-aio";
+  version = "20212.6.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Cereal2nd";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-MqSqwyfNICEU6h7+HAep3z1Uak30rlQ6noWEB3awVpA=";
+    fetchSubmodules = true;
+  };
+
+  propagatedBuildInputs = [
+    backoff
+    pyserial
+    pyserial-asyncio
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "velbusaio"
+  ];
+
+  meta = with lib; {
+    description = "Python library to support the Velbus home automation system";
+    homepage = "https://github.com/Cereal2nd/velbus-aio";
+    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..0672060d3570
--- /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.18";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-ucz0Ejpgiss8boF8dzt45FwpieNoJ6S3DUvtay6FDrw=";
+  };
+
+  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..f13bd4cbdc43
--- /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";
+  };
+
+  checkInputs = [ 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..009dcd60edb0
--- /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=";
+  };
+
+  checkInputs = [
+    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..9fbea40b1e8e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/versioneer/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "versioneer";
+  version = "0.23";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-1rbWjCmWU3NqKfGZMJ7kMG6XoPDQp47LceIckM4TIrs=";
+  };
+
+  # 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/warner/python-versioneer";
+    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..951ae8d9874d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/versionfinder/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, backoff
+, buildPythonPackage
+, fetchFromGitHub
+, GitPython
+, 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
+  ];
+
+  checkInputs = [
+    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";
+    license = licenses.agpl3Plus;
+    maintainers = with maintainers; [ zakame ];
+  };
+}
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..8c4bb49ebaff
--- /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}"'
+  '';
+
+  checkInputs = [ 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/vertica-python/default.nix b/nixpkgs/pkgs/development/python-modules/vertica-python/default.nix
new file mode 100644
index 000000000000..3b994b7e50d0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vertica-python/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, future
+, mock
+, parameterized
+, pytestCheckHook
+, python-dateutil
+, pythonOlder
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "vertica-python";
+  version = "1.1.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-3t9W12tnZztNV6E/f5br3FeznqZQuT6/DAXrbR0sDAU=";
+  };
+
+  propagatedBuildInputs = [
+    future
+    python-dateutil
+    six
+  ];
+
+  checkInputs = [
+    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";
+    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/videocr/default.nix b/nixpkgs/pkgs/development/python-modules/videocr/default.nix
new file mode 100644
index 000000000000..a6ac156b7063
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/videocr/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python-Levenshtein
+, pytesseract
+, opencv4
+, fuzzywuzzy
+}:
+
+buildPythonPackage rec {
+  pname = "videocr";
+  version = "0.1.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1clifwczvhvbaw2spgxkkyqsbqh21vyfw3rh094pxfmq89ylyj63";
+  };
+
+  propagatedBuildInputs = [
+    python-Levenshtein
+    pytesseract
+    opencv4
+    fuzzywuzzy
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --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..b4a16c44a072
--- /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 = [ maintainers.costrouc ];
+  };
+}
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..cd64dcc75643
--- /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";
+  };
+
+  checkInputs = [
+    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..05ce50199708
--- /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;
+    sha256 = "sha256-j06Bbv0hWSmrlCv8RfgvfGTyOF+vSX+zZnX3AvG5Hys=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "get-mac" "getmac"
+  '';
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  propagatedBuildInputs = [
+    getmac
+    requests
+    semver
+  ];
+
+  checkInputs = [
+    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..3f272a84b89b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vine/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, case
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "vine";
+  version = "5.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-fTsWJKlT2oLvY0YgE7vScdPrdXUUifmAdZjo80C9Y34=";
+  };
+
+  checkInputs = [
+    case
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "vine"
+  ];
+
+  meta = with lib; {
+    description = "Python promises";
+    homepage = "https://github.com/celery/vine";
+    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/virtual-display/default.nix b/nixpkgs/pkgs/development/python-modules/virtual-display/default.nix
new file mode 100644
index 000000000000..bc7469e1d61a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/virtual-display/default.nix
@@ -0,0 +1,23 @@
+{ lib, buildPythonPackage, fetchPypi, EasyProcess }:
+
+buildPythonPackage rec {
+  pname = "PyVirtualDisplay";
+  version = "3.0";
+
+  propagatedBuildInputs = [ EasyProcess ];
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "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/virtualenv-clone/default.nix b/nixpkgs/pkgs/development/python-modules/virtualenv-clone/default.nix
new file mode 100644
index 000000000000..6d407d7ea24b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/virtualenv-clone/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, virtualenv
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "virtualenv-clone";
+  version = "0.5.7";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "edwardgeorge";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-qrN74IwLRqiVPxU8gVhdiM34yBmiS/5ot07uroYPDVw=";
+  };
+
+  postPatch = ''
+    substituteInPlace tests/__init__.py \
+      --replace "'virtualenv'" "'${virtualenv}/bin/virtualenv'"
+
+    substituteInPlace tests/test_virtualenv_sys.py \
+      --replace "'virtualenv'" "'${virtualenv}/bin/virtualenv'"
+  '';
+
+  propagatedBuildInputs = [
+    virtualenv
+  ];
+
+  checkInputs = [
+    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/0001-Check-base_prefix-and-base_exec_prefix-for-Python-2.patch b/nixpkgs/pkgs/development/python-modules/virtualenv/0001-Check-base_prefix-and-base_exec_prefix-for-Python-2.patch
new file mode 100644
index 000000000000..2b34da289e2d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/virtualenv/0001-Check-base_prefix-and-base_exec_prefix-for-Python-2.patch
@@ -0,0 +1,37 @@
+From 21563405d6e2348ee457187f7fb61beb102bb367 Mon Sep 17 00:00:00 2001
+From: Frederik Rietdijk <fridh@fridh.nl>
+Date: Sun, 24 May 2020 09:33:13 +0200
+Subject: [PATCH] Check base_prefix and base_exec_prefix for Python 2
+
+This is a Nixpkgs-specific change so it can support virtualenvs from Nix envs.
+---
+ src/virtualenv/discovery/py_info.py | 8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+diff --git a/src/virtualenv/discovery/py_info.py b/src/virtualenv/discovery/py_info.py
+index 6f12128..74e9218 100644
+--- a/src/virtualenv/discovery/py_info.py
++++ b/src/virtualenv/discovery/py_info.py
+@@ -51,13 +51,17 @@ class PythonInfo(object):
+         self.version = u(sys.version)
+         self.os = u(os.name)
+ 
++        config_vars = {} if sys.version_info.major is not 2 else sysconfig._CONFIG_VARS
++        base_prefix = config_vars.get("prefix")
++        base_exec_prefix = config_vars.get("exec_prefix")
++
+         # information about the prefix - determines python home
+         self.prefix = u(abs_path(getattr(sys, "prefix", None)))  # prefix we think
+-        self.base_prefix = u(abs_path(getattr(sys, "base_prefix", None)))  # venv
++        self.base_prefix = u(abs_path(getattr(sys, "base_prefix", base_prefix)))  # venv
+         self.real_prefix = u(abs_path(getattr(sys, "real_prefix", None)))  # old virtualenv
+ 
+         # information about the exec prefix - dynamic stdlib modules
+-        self.base_exec_prefix = u(abs_path(getattr(sys, "base_exec_prefix", None)))
++        self.base_exec_prefix = u(abs_path(getattr(sys, "base_exec_prefix", base_exec_prefix)))
+         self.exec_prefix = u(abs_path(getattr(sys, "exec_prefix", None)))
+ 
+         self.executable = u(abs_path(sys.executable))  # the executable we were invoked via
+-- 
+2.25.1
+
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..3fba7cdb50c5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/virtualenv/default.nix
@@ -0,0 +1,93 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, pythonOlder
+, isPy27
+, backports-entry-points-selectable
+, cython
+, distlib
+, fetchPypi
+, filelock
+, flaky
+, importlib-metadata
+, importlib-resources
+, pathlib2
+, platformdirs
+, pytest-freezegun
+, pytest-mock
+, pytest-timeout
+, pytestCheckHook
+, setuptools-scm
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "virtualenv";
+  version = "20.15.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-KIFxE0ov87+xovVPEZ53zRuBwp/BJlojVvPo0Ux9WMQ=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    backports-entry-points-selectable
+    distlib
+    filelock
+    platformdirs
+    six
+  ] ++ lib.optionals (pythonOlder "3.4" && !stdenv.hostPlatform.isWindows) [
+    pathlib2
+  ] ++ lib.optionals (pythonOlder "3.7") [
+    importlib-resources
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  patches = lib.optionals (isPy27) [
+    ./0001-Check-base_prefix-and-base_exec_prefix-for-Python-2.patch
+  ];
+
+  checkInputs = [
+    cython
+    flaky
+    pytest-freezegun
+    pytest-mock
+    pytest-timeout
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  # Ignore tests which require network access
+  disabledTestPaths = [
+    "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 isPy27 [
+    "test_python_via_env_var"
+    "test_python_multi_value_prefer_newline_via_env_var"
+  ];
+
+  pythonImportsCheck = [ "virtualenv" ];
+
+  meta = with lib; {
+    description = "A tool to create isolated Python environments";
+    homepage = "http://www.virtualenv.org";
+    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..27c67de69332
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vispy/default.nix
@@ -0,0 +1,73 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, substituteAll
+, fetchPypi
+, cython
+, fontconfig
+, freetype-py
+, hsluv
+, kiwisolver
+, libGL
+, numpy
+, setuptools-scm
+, setuptools-scm-git-archive
+}:
+
+buildPythonPackage rec {
+  pname = "vispy";
+  version = "0.11.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-zi0lalMdQF8pWTPHSZaRL79D9lUhbbX8ao/zp4dHhBo=";
+  };
+
+  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; {
+    homepage = "https://vispy.org/index.html";
+    description = "Interactive scientific visualization in Python";
+    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..6b86123ade75
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/viv-utils/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, funcy
+, intervaltree
+, pefile
+, typing-extensions
+, vivisect
+, pytest-sugar
+, pytestCheckHook
+, python-flirt
+}:
+buildPythonPackage rec {
+  pname = "viv-utils";
+  version = "0.7.5";
+
+  src = fetchFromGitHub {
+    owner = "williballenthin";
+    repo = "viv-utils";
+    rev = "v${version}";
+    sha256 = "sha256-JDu+1n1wP2Vsp2V/bKdE+RFp6bE8RNmimi4wdsatwME=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "==" ">="
+  '';
+
+  propagatedBuildInputs = [
+    funcy
+    intervaltree
+    pefile
+    typing-extensions
+    vivisect
+  ];
+
+  checkInputs = [
+    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";
+    license = licenses.asl20;
+    maintainers = teams.determinatesystems.members;
+  };
+}
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..df0c72a34494
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vivisect/default.nix
@@ -0,0 +1,70 @@
+{ lib
+, buildPythonPackage
+, isPy3k
+, fetchPypi
+, wrapQtAppsHook
+
+# propagates
+, pyasn1
+, pyasn1-modules
+, cxxfilt
+, msgpack
+, pycparser
+
+# extras: gui
+, pyqt5
+, pyqtwebengine
+
+# knobs
+, withGui ? false
+}:
+
+buildPythonPackage rec {
+  pname = "vivisect";
+  version = "1.0.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-Y8y6sAQJa9baPPdhtuR9Jv1tJkNWJsS1hJ1lknkHWU4=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace 'cxxfilt>=0.2.1,<0.3.0' 'cxxfilt'
+  '';
+
+  nativeBuildInputs = [
+    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 = "Pure python disassembler, debugger, emulator, and static analysis framework";
+    homepage = "https://github.com/vivisect/vivisect";
+    license = licenses.asl20;
+    maintainers = teams.determinatesystems.members;
+  };
+}
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..57088b9c3993
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vmprof/default.nix
@@ -0,0 +1,41 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, 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 ];
+
+  # 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
+  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..ef33a46cc34c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vncdo/default.nix
@@ -0,0 +1,38 @@
+{ lib, fetchFromGitHub
+, buildPythonPackage, isPy27
+, pillow
+, twisted
+, pexpect
+, nose
+, ptyprocess
+}:
+buildPythonPackage rec {
+  pname = "vncdo";
+  version = "0.12.0";
+
+  src = fetchFromGitHub {
+    owner = "sibson";
+    repo = "vncdotool";
+    rev = "v${version}";
+    sha256 = "0h3ccr8zi7xpgn6hz43x1045x5l4bhha7py8x00g8bv6gaqlbwxn";
+  };
+
+  propagatedBuildInputs = [
+    pillow
+    twisted
+    pexpect
+    nose
+    ptyprocess
+  ];
+
+  doCheck = !isPy27;
+
+  meta = with lib; {
+    homepage = "https://github.com/sibson/vncdotool";
+    description = "A command line VNC client and python library";
+    license = licenses.mit;
+    maintainers = with maintainers; [ elitak ];
+    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/volkszaehler/default.nix b/nixpkgs/pkgs/development/python-modules/volkszaehler/default.nix
new file mode 100644
index 000000000000..cbc51d024a6e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/volkszaehler/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, aiohttp
+, async-timeout
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "volkszaehler";
+  version = "0.3.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "home-assistant-ecosystem";
+    repo = "python-volkszaehler";
+    rev = version;
+    sha256 = "sha256-EiruMlhXvbUhCaDtHc3qCLbpp/KHp9rVpk2FmbR4A/k=";
+  };
+
+  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";
+    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..31ea68662a40
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/voluptuous-serialize/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, isPy3k
+, pytestCheckHook
+, voluptuous
+}:
+
+buildPythonPackage rec  {
+  pname = "voluptuous-serialize";
+  version = "2.5.0";
+
+  disabled = !isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "home-assistant-libs";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-8rWMz8tBanxHdU/F4HhBxxz3ltqbdRoP4JED2dmZfTk=";
+  };
+
+  propagatedBuildInputs = [ voluptuous ];
+
+  checkInputs = [
+    pytestCheckHook
+    voluptuous
+  ];
+
+  pythonImportsCheck = [ "voluptuous_serialize" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/home-assistant-libs/voluptuous-serialize";
+    license = licenses.asl20;
+    description = "Convert Voluptuous schemas to dictionaries so they can be serialized";
+    maintainers = with maintainers; [ ];
+  };
+}
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..4212de031be8
--- /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=";
+  };
+
+  checkInputs = [
+    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..adb55bd0726d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/volvooncall/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, setuptools
+, geopy
+, docopt
+, certifi
+, amqtt
+, websockets
+, aiohttp
+, pytestCheckHook
+, asynctest
+, pytest-asyncio
+}:
+
+buildPythonPackage rec {
+  pname = "volvooncall";
+  version = "0.10.1";
+
+  disabled = pythonOlder "3.8";
+
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "molobrakos";
+    repo = "volvooncall";
+    rev = "v${version}";
+    hash = "sha256-udYvgKj7Rlc/hA86bbeBfnoVRjKkXT4TwpceWz226cU=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  passthru.optional-dependencies = {
+    console = [
+      certifi
+      docopt
+      geopy
+    ];
+    mqtt = [
+      amqtt
+      certifi
+    ];
+  };
+
+  checkInputs = [
+    asynctest
+    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";
+    license = licenses.unlicense;
+    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..8bc7c0badc1e
--- /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.3.0";
+
+  src = fetchPypi{
+    inherit pname version;
+    sha256 = "sha256-lIvSpgnXHiFEMrdObAODh5/T/J8rXsPVIRyWCnt2w7Q=";
+  };
+
+  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..a39f0a47dfa8
--- /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=";
+  };
+
+  checkInputs = [
+    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..7310bf393c0c
--- /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";
+    sha256 = "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..8095ccf98f0c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vsts/default.nix
@@ -0,0 +1,30 @@
+{ buildPythonPackage
+, lib
+, python
+, fetchPypi
+, msrest
+}:
+
+buildPythonPackage rec {
+  version = "0.1.25";
+  pname = "vsts";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "15sgwqa72ynpahj101r2kc15s3dnsafg5gqx0sz3hnqz29h925ys";
+  };
+
+  propagatedBuildInputs = [ 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..4928c2adc40c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vsure/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "vsure";
+  version = "1.8.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-Zh83t7yjZU2NjOgCkqPUHbqvEyEWXGITRgr5d2fLtRI=";
+  };
+
+  propagatedBuildInputs = [ 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";
+    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..8228047d9ce9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vt-py/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-asyncio
+, pytest-httpserver
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "vt-py";
+  version = "0.14.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "VirusTotal";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-901VW56vr6ysMlzspgVbPMLnDIpJRgSEOEQ8ohHp+mc=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  checkInputs = [
+    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/";
+    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..b1dc6ac48cf2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vulcan-api/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, aenum
+, aiodns
+, aiohttp
+, buildPythonPackage
+, cchardet
+, fetchFromGitHub
+, pyopenssl
+, pythonOlder
+, pytz
+, related
+, requests
+, uonet-request-signer-hebe
+, yarl
+}:
+
+buildPythonPackage rec {
+  pname = "vulcan-api";
+  version = "2.1.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "kapi2289";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-XYpQ1uqRmdqsGeKyHKGxFyXMN9HugTiPUx9tFUiGSpU=";
+  };
+
+  propagatedBuildInputs = [
+    aenum
+    aiodns
+    aiohttp
+    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/";
+    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..0062bbd9e415
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vulture/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pint
+, pythonOlder
+, pytestCheckHook
+, toml
+}:
+
+buildPythonPackage rec {
+  pname = "vulture";
+  version = "2.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-KDFpQFXrLjagnDt2gJNINxArm2wJaSBuOQLVE2Ehd8M=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace " --cov vulture --cov-report=html --cov-report=term --cov-report=xml --cov-append" ""
+  '';
+
+  propagatedBuildInputs = [
+    toml
+  ];
+
+  checkInputs = [
+    pint
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "vulture"
+  ];
+
+  meta = with lib; {
+    description = "Finds unused code in Python programs";
+    homepage = "https://github.com/jendrikseipp/vulture";
+    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..242fe47b33d0
--- /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";
+  };
+
+  checkInputs = [ 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/w3lib/default.nix b/nixpkgs/pkgs/development/python-modules/w3lib/default.nix
new file mode 100644
index 000000000000..d7074269e6a9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/w3lib/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, six
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "w3lib";
+  version = "1.22.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1pv02lvvmgz2qb61vz1jkjc04fgm4hpfvaj5zm4i3mjp64hd1mha";
+  };
+
+  propagatedBuildInputs = [ six ];
+
+  checkInputs = [ pytestCheckHook ];
+  pythonImportsCheck = [ "w3lib" ];
+
+  disabledTests = [
+    "test_add_or_replace_parameter"
+  ];
+
+  meta = with lib; {
+    description = "A library of web-related functions";
+    homepage = "https://github.com/scrapy/w3lib";
+    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/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..699af4120158
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wakeonlan/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "wakeonlan";
+  version = "2.1.0";
+  disabled = pythonOlder "3.6";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "remcohaszing";
+    repo = "pywakeonlan";
+    rev = version;
+    sha256 = "sha256-5ri4bXc0EMNntzmcUZYpRIfaXoex4s5M6psf/9ta17Y=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "test_wakeonlan.py"
+  ];
+
+  pythonImportsCheck = [
+    "wakeonlan"
+  ];
+
+  meta = with lib; {
+    description = "Python module for wake on lan";
+    homepage = "https://github.com/remcohaszing/pywakeonlan";
+    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..20896da9d222
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wallbox/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, aenum
+, requests
+, simplejson
+}:
+
+buildPythonPackage rec {
+  pname = "wallbox";
+  version = "0.4.9";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "90e664cf7d99eb1baf20a9ff5fd415dfa14ddafabcefd606e15b5bcd25f969e9";
+  };
+
+  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";
+    license = licenses.mit;
+    maintainers = with maintainers; [ 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..fc6dbadaecb6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wandb/default.nix
@@ -0,0 +1,167 @@
+{ lib
+, stdenv
+, azure-core
+, bokeh
+, buildPythonPackage
+, click
+, docker_pycreds
+, fetchFromGitHub
+, flask
+, git
+, GitPython
+, jsonref
+, jsonschema
+, matplotlib
+, nbclient
+, nbformat
+, pandas
+, pathtools
+, promise
+, protobuf
+, psutil
+, pydantic
+, pytest-mock
+, pytest-xdist
+, pytestCheckHook
+, python-dateutil
+, pythonOlder
+, pytorch
+, pyyaml
+, requests
+, scikit-learn
+, sentry-sdk
+, setproctitle
+, setuptools
+, shortuuid
+, substituteAll
+, tqdm
+}:
+
+buildPythonPackage rec {
+  pname = "wandb";
+  version = "0.12.21";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = "client";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-jKb2pNmCW4MYz6ncsMNg7o5giCI2bpKER/kb8lfJekI=";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./hardcode-git-path.patch;
+      git = "${lib.getBin git}/bin/git";
+    })
+  ];
+
+  # setuptools is necessary since pkg_resources is required at runtime.
+  propagatedBuildInputs = [
+    click
+    docker_pycreds
+    GitPython
+    pathtools
+    promise
+    protobuf
+    psutil
+    python-dateutil
+    pyyaml
+    requests
+    sentry-sdk
+    setproctitle
+    setuptools
+    shortuuid
+  ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  checkInputs = [
+    azure-core
+    bokeh
+    flask
+    jsonref
+    jsonschema
+    matplotlib
+    nbclient
+    nbformat
+    pandas
+    pydantic
+    pytest-mock
+    pytest-xdist
+    pytestCheckHook
+    pytorch
+    scikit-learn
+    tqdm
+  ];
+
+  disabledTestPaths = [
+    # Tests that try to get chatty over sockets or spin up servers, not possible in the nix build environment.
+    "tests/unit_tests/integrations/test_keras.py"
+    "tests/unit_tests/integrations/test_torch.py"
+    "tests/unit_tests/test_cli.py"
+    "tests/unit_tests/test_data_types.py"
+    "tests/unit_tests/test_file_stream.py"
+    "tests/unit_tests/test_file_upload.py"
+    "tests/unit_tests/test_footer.py"
+    "tests/unit_tests/test_internal_api.py"
+    "tests/unit_tests/test_label_full.py"
+    "tests/unit_tests/test_login.py"
+    "tests/unit_tests/test_meta.py"
+    "tests/unit_tests/test_metric_full.py"
+    "tests/unit_tests/test_metric_internal.py"
+    "tests/unit_tests/test_mode_disabled.py"
+    "tests/unit_tests/test_model_workflows.py"
+    "tests/unit_tests/test_mp_full.py"
+    "tests/unit_tests/test_public_api.py"
+    "tests/unit_tests/test_redir.py"
+    "tests/unit_tests/test_runtime.py"
+    "tests/unit_tests/test_sender.py"
+    "tests/unit_tests/test_start_method.py"
+    "tests/unit_tests/test_tb_watcher.py"
+    "tests/unit_tests/test_telemetry_full.py"
+    "tests/unit_tests/test_util.py"
+    "tests/unit_tests/wandb_agent_test.py"
+    "tests/unit_tests/wandb_artifacts_test.py"
+    "tests/unit_tests/wandb_integration_test.py"
+    "tests/unit_tests/wandb_run_test.py"
+    "tests/unit_tests/wandb_settings_test.py"
+    "tests/unit_tests/wandb_sweep_test.py"
+    "tests/unit_tests/wandb_tensorflow_test.py"
+    "tests/unit_tests/wandb_verify_test.py"
+    "tests/unit_tests/test_tpu.py"
+    "tests/unit_tests/test_plots.py"
+    "tests/unit_tests/test_report_api.py"
+
+    # Requires metaflow, which is not yet packaged.
+    "tests/unit_tests/integrations/test_metaflow.py"
+
+    # Fails and borks the pytest runner as well.
+    "tests/unit_tests/wandb_test.py"
+
+    # Tries to access /homeless-shelter
+    "tests/unit_tests/test_tables.py"
+  ];
+
+  # Disable test that fails on darwin due to issue with python3Packages.psutil:
+  # https://github.com/giampaolo/psutil/issues/1219
+  disabledTests = lib.optional stdenv.isDarwin [
+    "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..23097c535e06
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wandb/hardcode-git-path.patch
@@ -0,0 +1,83 @@
+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/client.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
+@@ -1745,7 +1745,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.
+@@ -1764,7 +1764,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:
+@@ -1818,7 +1818,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/sdk/internal/internal_api.py b/wandb/sdk/internal/internal_api.py
+index 612220b9..b761bfbd 100644
+--- a/wandb/sdk/internal/internal_api.py
++++ b/wandb/sdk/internal/internal_api.py
+@@ -660,7 +660,7 @@ class Api:
+         )
+         patch = BytesIO()
+         if self.git.dirty:
+-            self.git.repo.git.execute(["git", "diff"], output_stream=patch)
++            self.git.repo.git.execute(["@git@", "diff"], output_stream=patch)
+             patch.seek(0)
+         cwd = "."
+         if self.git.enabled:
+diff --git a/wandb/sdk/internal/meta.py b/wandb/sdk/internal/meta.py
+index 6c53f750..c385951a 100644
+--- a/wandb/sdk/internal/meta.py
++++ b/wandb/sdk/internal/meta.py
+@@ -125,7 +125,7 @@ class Meta:
+         logger.debug("save patches")
+         try:
+             root = self._git.root
+-            diff_args = ["git", "diff"]
++            diff_args = ["@git@", "diff"]
+             if self._git.has_submodule_diff:
+                 diff_args.append("--submodule=diff")
+ 
+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..3b8dfce61146
--- /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.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1yxls7ywfg954c3vxgnp98qa1b8dsq9b2fld11fb9sx1k4mjc29d";
+  };
+
+  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/warcio/default.nix b/nixpkgs/pkgs/development/python-modules/warcio/default.nix
new file mode 100644
index 000000000000..ae870a37fe57
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/warcio/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, six
+, setuptools
+, pytestCheckHook
+, httpbin
+, requests
+, wsgiprox
+, multidict
+}:
+
+buildPythonPackage rec {
+  pname = "warcio";
+  version = "1.7.4";
+
+  src = fetchFromGitHub {
+    owner = "webrecorder";
+    repo = "warcio";
+    rev = "aa702cb321621b233c6e5d2a4780151282a778be"; # Repo has no git tags, see https://github.com/webrecorder/warcio/issues/126
+    sha256 = "sha256-wn2rd73wRfOqHu9H0GIn76tmEsERBBCQatnk4b/JToU=";
+  };
+
+  patches = [
+    (fetchpatch {
+      name = "add-offline-option.patch";
+      url = "https://github.com/webrecorder/warcio/pull/135/commits/2546fe457c57ab0b391764a4ce419656458d9d07.patch";
+      sha256 = "sha256-3izm9LvAeOFixiIUUqmd5flZIxH92+NxL7jeu35aObQ=";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    six
+    setuptools
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    httpbin
+    requests
+    wsgiprox
+    multidict # Optional. Without this, one test in test/test_utils.py is skipped.
+  ];
+
+  pytestFlagsArray = [ "--offline" ];
+
+  pythonImportsCheck = [ "warcio" ];
+
+  meta = with lib; {
+    description = "Streaming WARC/ARC library for fast web archive IO";
+    homepage = "https://github.com/webrecorder/warcio";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ Luflosi ];
+  };
+}
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..c646107c32f7
--- /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
+  ];
+
+  checkInputs = [
+    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..8da1cf55b54a
--- /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"
+  '';
+
+  checkInputs = [ 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..16c89ae63a0d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wasabi/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "wasabi";
+  version = "0.9.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-rabxPptw7ya/lfrQ/r396+IAXimgitWPS7rjg6lymM8=";
+  };
+
+  checkInputs = [
+    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/wasm/default.nix b/nixpkgs/pkgs/development/python-modules/wasm/default.nix
new file mode 100644
index 000000000000..adc3c958bee1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wasm/default.nix
@@ -0,0 +1,30 @@
+{ buildPythonPackage
+, fetchPypi
+, pythonAtLeast
+, lib
+}:
+
+buildPythonPackage rec {
+  pname = "wasm";
+  version = "1.2";
+
+  disabled = pythonAtLeast "3.10"; # project is abandoned, remove we whe move to py310/311
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "179xcinfc35xgk0bf9y58kwxzymzk7c1p58w6khmqfiqvb91j3r8";
+  };
+
+  # there are no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "wasm" ];
+
+  meta = with lib; {
+    description = "WebAssembly decoder and disassembler";
+    homepage = "https://github.com/athre0z/wasm";
+    changelog = "https://github.com/athre0z/wasm/blob/master/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ arturcygan ];
+  };
+}
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..3444f541282e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wasmer/default.nix
@@ -0,0 +1,99 @@
+{ stdenv
+, lib
+, rustPlatform
+, callPackage
+, fetchFromGitHub
+, buildPythonPackage
+, libiconv
+, libffi
+, libxml2
+, 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;
+
+      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; {
+        broken = stdenv.isDarwin;
+        description = "Python extension to run WebAssembly binaries";
+        homepage = "https://github.com/wasmerio/wasmer-python";
+        license = licenses.mit;
+        platforms = platforms.unix;
+        maintainers = with maintainers; [ SuperSandro2000 ];
+      };
+    };
+in
+rec {
+  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 = [ rustPlatform.rust.rustc.llvm ];
+    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..bdb3adfe93ce
--- /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 rec {
+  pname = "wasmer-tests";
+  inherit (wasmer) version;
+
+  src = wasmer.testsout;
+
+  dontBuild = true;
+  dontInstall = true;
+
+  checkInputs = [
+    pytestCheckHook
+    wasmer
+    wasmer-compiler-cranelift
+    wasmer-compiler-llvm
+    wasmer-compiler-singlepass
+  ];
+}
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..c530ea66cde6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/watchdog/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, pathtools
+, pyyaml
+, flaky
+, pytest-timeout
+, pytestCheckHook
+, CoreServices
+}:
+
+buildPythonPackage rec {
+  pname = "watchdog";
+  version = "2.1.9";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-Q84g67NqUfIfo3b3bR1GkkUrJSfM1gGVDWntNrniFgk=";
+  };
+
+  patches = lib.optionals (stdenv.isDarwin && !stdenv.isAarch64) [
+    ./force-kqueue.patch
+  ];
+
+  buildInputs = lib.optionals stdenv.isDarwin [ CoreServices ];
+
+  propagatedBuildInputs = [
+    pathtools
+    pyyaml
+  ];
+
+  checkInputs = [
+    flaky
+    pytest-timeout
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "--cov=watchdog" "" \
+      --replace "--cov-report=term-missing" ""
+  '';
+
+  disabledTests = [
+    # probably failing because of an encoding related issue
+    "test_create_wrong_encoding"
+  ] ++ lib.optionals (stdenv.isDarwin && !stdenv.isAarch64) [
+    "test_delete"
+  ];
+
+  disabledTestPaths = [
+    # Tests are flaky
+    "tests/test_inotify_buffer.py"
+  ];
+
+  pythonImportsCheck = [
+    "watchdog"
+  ];
+
+  meta = with lib; {
+    description = "Python API and shell utilities to monitor file system events";
+    homepage = "https://github.com/gorakhargosh/watchdog";
+    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..de222d891214
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/watchdog/force-kqueue.patch
@@ -0,0 +1,159 @@
+diff --git a/setup.py b/setup.py
+index 072dfc8..64732bb 100644
+--- a/setup.py
++++ b/setup.py
+@@ -39,7 +39,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/test_emitter.py b/tests/test_emitter.py
+index bec052c..242fbea 100644
+--- a/tests/test_emitter.py
++++ b/tests/test_emitter.py
+@@ -42,13 +42,11 @@ if platform.is_linux():
+         InotifyEmitter as Emitter,
+         InotifyFullEmitter,
+     )
+-elif platform.is_darwin():
+-    from watchdog.observers.fsevents import FSEventsEmitter as Emitter
+ elif platform.is_windows():
+     from watchdog.observers.read_directory_changes import (
+         WindowsApiEmitter as Emitter
+     )
+-elif platform.is_bsd():
++elif platform.is_bsd() or platform.is_darwin():
+     from watchdog.observers.kqueue import (
+         KqueueEmitter as Emitter
+     )
+@@ -57,12 +55,6 @@ logging.basicConfig(level=logging.DEBUG)
+ logger = logging.getLogger(__name__)
+ 
+ 
+-if platform.is_darwin():
+-    # enable more verbose logs
+-    fsevents_logger = logging.getLogger("fsevents")
+-    fsevents_logger.setLevel(logging.DEBUG)
+-
+-
+ @pytest.fixture(autouse=True)
+ def setup_teardown(tmpdir):
+     global p, emitter, event_queue
+@@ -85,9 +77,6 @@ def start_watching(path=None, use_full_emitter=False, recursive=True):
+     else:
+         emitter = Emitter(event_queue, ObservedWatch(path, recursive=recursive))
+ 
+-    if platform.is_darwin():
+-        emitter.suppress_history = True
+-
+     emitter.start()
+ 
+ 
+@@ -345,7 +334,7 @@ def test_separate_consecutive_moves():
+     if platform.is_windows():
+         expected_events = [a_deleted, d_created]
+ 
+-    if platform.is_bsd():
++    if platform.is_bsd() or platform.is_darwin():
+         # Due to the way kqueue works, we can't really order
+         # 'Created' and 'Deleted' events in time, so creation queues first
+         expected_events = [d_created, a_deleted, dir_modif, dir_modif]
+@@ -355,7 +344,7 @@ def test_separate_consecutive_moves():
+ 
+ 
+ @pytest.mark.flaky(max_runs=5, min_passes=1, rerun_filter=rerun_filter)
+-@pytest.mark.skipif(platform.is_bsd(), reason="BSD create another set of events for this test")
++@pytest.mark.skipif(platform.is_bsd() or platform.is_darwin(), reason="BSD create another set of events for this test")
+ def test_delete_self():
+     mkdir(p('dir1'))
+     start_watching(p('dir1'))
+@@ -365,7 +354,7 @@ def test_delete_self():
+     assert not emitter.is_alive()
+ 
+ 
+-@pytest.mark.skipif(platform.is_windows() or platform.is_bsd(),
++@pytest.mark.skipif(platform.is_windows() or platform.is_bsd() or platform.is_darwin(),
+                     reason="Windows|BSD create another set of events for this test")
+ def test_fast_subdirectory_creation_deletion():
+     root_dir = p('dir1')
+@@ -429,7 +418,7 @@ def test_recursive_on():
+         assert event.src_path == p('dir1', 'dir2', 'dir3')
+         assert isinstance(event, DirModifiedEvent)
+ 
+-        if not platform.is_bsd():
++        if not (platform.is_bsd() or platform.is_darwin()):
+             event = event_queue.get(timeout=5)[0]
+             assert event.src_path == p('dir1', 'dir2', 'dir3', 'a')
+             assert isinstance(event, FileModifiedEvent)
+@@ -452,26 +441,6 @@ def test_recursive_off():
+         if platform.is_linux():
+             expect_event(FileClosedEvent(p('b')))
+ 
+-    # currently limiting these additional events to macOS only, see https://github.com/gorakhargosh/watchdog/pull/779
+-    if platform.is_darwin():
+-        mkdir(p('dir1', 'dir2'))
+-        with pytest.raises(Empty):
+-            event_queue.get(timeout=5)
+-        mkfile(p('dir1', 'dir2', 'somefile'))
+-        with pytest.raises(Empty):
+-            event_queue.get(timeout=5)
+-
+-        mkdir(p('dir3'))
+-        expect_event(DirModifiedEvent(p()))  # the contents of the parent directory changed
+-
+-        mv(p('dir1', 'dir2', 'somefile'), p('somefile'))
+-        expect_event(FileMovedEvent(p('dir1', 'dir2', 'somefile'), p('somefile')))
+-        expect_event(DirModifiedEvent(p()))
+-
+-        mv(p('dir1', 'dir2'), p('dir2'))
+-        expect_event(DirMovedEvent(p('dir1', 'dir2'), p('dir2')))
+-        expect_event(DirModifiedEvent(p()))
+-
+ 
+ @pytest.mark.skipif(platform.is_windows(),
+                     reason="Windows create another set of events for this test")
+@@ -493,7 +462,7 @@ def test_renaming_top_level_directory():
+ 
+     expect_event(DirMovedEvent(p('a', 'b'), p('a2', 'b')))
+ 
+-    if platform.is_bsd():
++    if platform.is_bsd() or platform.is_darwin():
+         expect_event(DirModifiedEvent(p()))
+ 
+     open(p('a2', 'b', 'c'), 'a').close()
+@@ -584,7 +553,7 @@ def test_move_nested_subdirectories():
+     expect_event(DirMovedEvent(p('dir1', 'dir2', 'dir3'), p('dir2', 'dir3')))
+     expect_event(FileMovedEvent(p('dir1', 'dir2', 'dir3', 'a'), p('dir2', 'dir3', 'a')))
+ 
+-    if platform.is_bsd():
++    if platform.is_bsd() or platform.is_darwin():
+         event = event_queue.get(timeout=5)[0]
+         assert p(event.src_path) == p()
+         assert isinstance(event, DirModifiedEvent)
+@@ -643,7 +612,7 @@ def test_move_nested_subdirectories_on_windows():
+ 
+ 
+ @pytest.mark.flaky(max_runs=5, min_passes=1, rerun_filter=rerun_filter)
+-@pytest.mark.skipif(platform.is_bsd(), reason="BSD create another set of events for this test")
++@pytest.mark.skipif(platform.is_bsd() or platform.is_darwin(), reason="BSD create another set of events for this test")
+ def test_file_lifecyle():
+     start_watching()
+ 
+diff --git a/tests/test_fsevents.py b/tests/test_fsevents.py
+index 4a4fabf..49886a1 100644
+--- a/tests/test_fsevents.py
++++ b/tests/test_fsevents.py
+@@ -3,8 +3,7 @@
+ import pytest
+ from watchdog.utils import platform
+ 
+-if not platform.is_darwin():  # noqa
+-    pytest.skip("macOS only.", allow_module_level=True)
++pytest.skip("doesn't work with Nix yet", allow_module_level=True)
+ 
+ import logging
+ import os
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..f85bc75c800e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/watchfiles/default.nix
@@ -0,0 +1,70 @@
+{ stdenv
+, lib
+, anyio
+, buildPythonPackage
+, fetchFromGitHub
+, rustPlatform
+, setuptools-rust
+, pythonOlder
+, dirty-equals
+, pytest-mock
+, pytest-timeout
+, pytestCheckHook
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "watchfiles";
+  version = "0.15.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "samuelcolvin";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-DibxoVH7uOy9rxzhiN4HmihA7HtdzErmJOnsI/NWY5I=";
+  };
+
+  cargoDeps = rustPlatform.fetchCargoTarball {
+    inherit src;
+    name = "${pname}-${version}";
+    hash = "sha256-EakC/rSIS42Q4Y0pvWKG7mzppU5KjCktnC09iFMZM0A=";
+  };
+
+  nativeBuildInputs = [
+  ] ++ (with rustPlatform; [
+    cargoSetupHook
+    maturinBuildHook
+    rust.cargo
+    rust.rustc
+  ]);
+
+  propagatedBuildInputs = [
+    anyio
+  ];
+
+  preCheck = ''
+    rm -rf watchfiles
+  '';
+
+  checkInputs = [
+    dirty-equals
+    pytest-mock
+    pytest-timeout
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "watchfiles"
+  ];
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    description = "Simple, modern 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..80d95b3175f6
--- /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;
+    sha256 = "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..526066f1fa74
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/waterfurnace/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, click
+, fetchFromGitHub
+, mock
+, pytest-runner
+, pytestCheckHook
+, requests
+, websocket-client
+}:
+
+buildPythonPackage rec {
+  pname = "waterfurnace";
+  version = "1.1.0";
+
+  src = fetchFromGitHub {
+    owner = "sdague";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1ba247fw1fvi7zy31zj2wbjq7fajrbxhp139cl9jj67rfvxfv8xf";
+  };
+
+  propagatedBuildInputs = [
+    click
+    pytest-runner
+    requests
+    websocket-client
+  ];
+
+  checkInputs = [
+    mock
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "waterfurnace" ];
+
+  meta = with lib; {
+    description = "Python interface to waterfurnace geothermal systems";
+    homepage = "https://github.com/sdague/waterfurnace";
+    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..10be7466063c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/watermark/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, importlib-metadata
+, ipython
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "watermark";
+  version = "2.3.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "rasbt";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-E3UxdGlxTcvkiKa3RoG9as6LybyW+QrCUZvA9VHwxlk=";
+  };
+
+  propagatedBuildInputs = [
+    ipython
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  checkInputs =  [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "watermark"
+  ];
+
+  meta = with lib; {
+    description = "IPython extension for printing date and timestamps, version numbers, and hardware information";
+    homepage = "https://github.com/rasbt/watermark";
+    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..cce9a162e865
--- /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
+  ];
+
+  checkInputs = [
+    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..3090ee815440
--- /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
+  ];
+
+  checkInputs = [
+    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..21dbe7b8ae82
--- /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.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-3mzK+YBRhLDqcEJDyMK43Le6eCH3B89unXpuu8nIe1g=";
+  };
+
+  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..dd561d1c0568
--- /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;
+    sha256 = "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..c7b7e9bc9e82
--- /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;
+    sha256 = "sha256-aRkrjlwKfQ3F/xGH7rPjmBQWM6S95RxpyH9Y/oftNhw=";
+  };
+
+  checkInputs = [
+    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; [ SuperSandro2000 ];
+  };
+}
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..709dae66c42e
--- /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.4";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-uk/FVY+JRr8f/HA0sFuBTYJdaUESSZyGA14OTTmLamc=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [ bracex ];
+
+  checkInputs = [ 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; [ SuperSandro2000 ];
+  };
+}
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..7d5cbc69ecaa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wcwidth/default.nix
@@ -0,0 +1,36 @@
+{ lib, fetchPypi, buildPythonPackage, pytestCheckHook
+, isPy3k
+, backports_functools_lru_cache
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "wcwidth";
+  version = "0.2.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83";
+  };
+
+  checkInputs = [ pytestCheckHook ];
+
+  propagatedBuildInputs = [ setuptools ] ++ lib.optionals (!isPy3k) [
+    backports_functools_lru_cache
+  ];
+
+  # 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/weasyprint/default.nix b/nixpkgs/pkgs/development/python-modules/weasyprint/default.nix
new file mode 100644
index 000000000000..e4576a303c50
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/weasyprint/default.nix
@@ -0,0 +1,105 @@
+{ buildPythonPackage
+, fetchPypi
+, fetchpatch
+, pytestCheckHook
+, cairosvg
+, flit-core
+, fonttools
+, pydyf
+, pyphen
+, cffi
+, cssselect2
+, html5lib
+, tinycss2
+, glib
+, harfbuzz
+, pango
+, fontconfig
+, lib
+, stdenv
+, ghostscript
+, isPy3k
+, substituteAll
+, pillow
+}:
+
+buildPythonPackage rec {
+  pname = "weasyprint";
+  version = "54.3";
+  disabled = !isPy3k;
+
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "weasyprint";
+    sha256 = "sha256-4E2gQGMFZsRMqiAgM/B/hYdl9TZwkEWoCXOfPQSOidY=";
+  };
+
+  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}";
+    })
+    # Disable tests for new Ghostscript
+    # Remove when next version is released
+    (fetchpatch {
+      url = "https://github.com/Kozea/WeasyPrint/commit/e544398b00d76bc0317ea7e2abe40dc46b380910.patch";
+      sha256 = "sha256-oQO3j9Mo1x98WaLPROxsOn0qkeYRJrCx5QWWKoHvabE=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    cffi
+    cssselect2
+    fonttools
+    html5lib
+    pillow
+    pydyf
+    pyphen
+    tinycss2
+  ] ++ fonttools.optional-dependencies.woff;
+
+  checkInputs = [
+    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";
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "--isort --flake8 --cov --no-cov-on-fail" ""
+  '';
+
+  preCheck = ''
+    # Fontconfig wants to create a cache.
+    export HOME=$TMPDIR
+  '';
+
+  meta = with lib; {
+    homepage = "https://weasyprint.org/";
+    description = "Converts web documents to PDF";
+    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..bcd1c48ff61a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/weasyprint/library-paths.patch
@@ -0,0 +1,32 @@
+diff --git a/weasyprint/text/ffi.py b/weasyprint/text/ffi.py
+index 0734cbea..22e31a5e 100644
+--- a/weasyprint/text/ffi.py
++++ b/weasyprint/text/ffi.py
+@@ -387,22 +387,11 @@ def _dlopen(ffi, *names):
+     return ffi.dlopen(names[0])  # pragma: no cover
+ 
+ 
+-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()
+
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..9246b2b571e7
--- /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; [ fortuneteller2k ];
+  };
+}
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..1b40519d592a
--- /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" ];
+
+  checkInputs = [ 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 SuperSandro2000 ];
+  };
+
+}
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..57b0e82b6bc4
--- /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.2.0";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-mdaJQMRS4HcmSFoV/vQ/EviubAxbORvLp2Bl1FJ/uF0=";
+  };
+
+  pythonImportsCheck = [
+    "webargs"
+  ];
+
+  propagatedBuildInputs = [ marshmallow ];
+
+  checkInputs = [
+    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..176d2f661608
--- /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 ];
+  checkInputs = [ 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..8b551f1c66a0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/webauthn/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, asn1crypto
+, cbor2
+, pythonOlder
+, pydantic
+, pyopenssl
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "webauthn";
+  version = "1.6.0";
+  disabled = pythonOlder "3";
+
+  src = fetchFromGitHub {
+    owner = "duo-labs";
+    repo = "py_webauthn";
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-Ts0zKnQg1EaBNB9xQmzOpEVwDSFwHNjIhEP1jTwEOFI=";
+  };
+
+  propagatedBuildInputs = [
+    asn1crypto
+    cbor2
+    pydantic
+    pyopenssl
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "webauthn" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/duo-labs/py_webauthn";
+    description = "Implementation of the WebAuthn API";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..ccd4163492f1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/webcolors/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "webcolors";
+  version = "1.12";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-FtBD06CP1qGxt+Pp5iZA0JeQ3OgNK91HkqF1s1/nlKk=";
+  };
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest discover -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..8e4b378244f5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/webdav4/default.nix
@@ -0,0 +1,89 @@
+{ lib
+, buildPythonPackage
+, cheroot
+, colorama
+, fetchFromGitHub
+, fsspec
+, httpx
+, pytestCheckHook
+, python-dateutil
+, pythonOlder
+, setuptools-scm
+, wsgidav
+}:
+
+buildPythonPackage rec {
+  pname = "webdav4";
+  version = "0.9.7";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "skshetry";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-7v4dcwbTCGiEMkAQHtH9+zQj745dI0QqoEqdxRYRuO4=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    httpx
+    python-dateutil
+  ];
+
+  checkInputs = [
+    cheroot
+    colorama
+    pytestCheckHook
+    wsgidav
+  ] ++ passthru.optional-dependencies.fsspec;
+
+  passthru.optional-dependencies = {
+    fsspec = [
+      fsspec
+    ];
+    http2 = [
+      httpx.optional-dependencies.http2
+    ];
+    all = [
+      fsspec
+      httpx.optional-dependencies.http2
+    ];
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace " --cov" ""
+  '';
+
+  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"
+  ];
+
+  disabledTestPaths = [
+    # Tests requires network access
+    "tests/test_client.py"
+    "tests/test_fsspec.py"
+  ];
+
+  meta = with lib; {
+    description = "Library for interacting with WebDAV";
+    homepage = "https://skshetry.github.io/webdav4/";
+    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..4d2c37f6b0e2
--- /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 ];
+
+  checkInputs = [ 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..fa89241d7d8f
--- /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";
+  };
+
+  checkInputs = [ 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..e4fb4f0ea324
--- /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=";
+  };
+
+  checkInputs = [
+    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..6ceefbaa20ce
--- /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," ""
+  '';
+
+  checkInputs = [
+    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/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..a73703f12a11
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/websocket-client/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, pytestCheckHook
+, python-socks
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "websocket-client";
+  version = "1.3.3";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-1YxfKE1qm/g3natCMln+j4W3DV+l0pFtV5GoRZSxIrE=";
+  };
+
+  propagatedBuildInputs = [
+    python-socks
+    six
+   ];
+
+  checkInputs = [
+    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..538055b98909
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/websockets/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, python
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "websockets";
+  version = "10.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "aaugustin";
+    repo = pname;
+    rev = version;
+    hash = "sha256-ZUn/DvO1Kx7Uxne4DF/am69YL1c48qpgQrGek355Z+4=";
+  };
+
+  # Tests fail on Darwin with `OSError: AF_UNIX path too long`
+  doCheck = !stdenv.isDarwin;
+
+  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
+  '';
+
+  checkPhase = ''
+    runHook preCheck
+    ${python.interpreter} -m unittest discover
+    runHook postCheck
+  '';
+
+  pythonImportsCheck = [
+    "websockets"
+  ];
+
+  meta = with lib; {
+    description = "WebSocket implementation in Python";
+    homepage = "https://websockets.readthedocs.io/";
+    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..e1f311ba027b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/websockify/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, numpy
+}:
+
+buildPythonPackage rec {
+  version = "0.10.0";
+  pname = "websockify";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "6c4cc1bc132abb4a99834bcb1b4bd72f51d35a08d08093a817646ecc226ac44e";
+  };
+
+  propagatedBuildInputs = [ numpy ];
+
+  # Ran 0 tests in 0.000s
+  doCheck = false;
+
+  pythonImportsCheck = [ "websockify" ];
+
+  meta = with lib; {
+    description = "WebSockets support for any application/server";
+    homepage = "https://github.com/kanaka/websockify";
+    license = licenses.lgpl3;
+    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..47a25c25d1f4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/webssh/default.nix
@@ -0,0 +1,45 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchPypi
+, paramiko
+, pytestCheckHook
+, tornado
+}:
+
+buildPythonPackage rec {
+  pname = "webssh";
+  version = "1.6.0";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-yqjwahh2METXD83geTGt5sUL+vmxbrYxj4KtwTxbD94=";
+  };
+
+  propagatedBuildInputs = [
+    paramiko
+    tornado
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "webssh"
+  ];
+
+  disabledTests = [
+    # Test fails with AttributeError (possibly related to paramiko update)
+    "test_app_with_bad_host_key"
+  ];
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    description = "Web based SSH client";
+    homepage = "https://github.com/huashengdun/webssh/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ davidtwco ];
+  };
+}
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..c1ae249c87eb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/webtest-aiohttp/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, 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;
+    sha256 = "sha256-UuAz/k/Tnumupv3ybFR7PkYHwG3kH7M5oobZykEP+ao=";
+  };
+
+  propagatedBuildInputs = [
+    webtest
+  ];
+
+  checkInputs = [
+    aiohttp
+    pytest-aiohttp
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "webtest_aiohttp"
+  ];
+
+  meta = with lib; {
+    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..50e7a1c73e61
--- /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
+  ];
+
+  checkInputs = [
+    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/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..672e761562f3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/weconnect-mqtt/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, paho-mqtt
+, python-dateutil
+, weconnect
+}:
+
+buildPythonPackage rec {
+  pname = "weconnect-mqtt";
+  version = "0.39.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "tillsteinbach";
+    repo = "WeConnect-mqtt";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-Mmv4rIABg8jlk7a2VYn3lozCdZtAy3w5tK+3z8bwqZA=";
+  };
+
+  propagatedBuildInputs = [
+    paho-mqtt
+    python-dateutil
+    weconnect
+  ];
+
+  postPatch = ''
+    substituteInPlace weconnect_mqtt/__version.py \
+      --replace "develop" "${version}"
+    substituteInPlace pytest.ini \
+      --replace "--cov=weconnect_mqtt --cov-config=.coveragerc --cov-report html" "" \
+      --replace "pytest-cov" ""
+    substituteInPlace requirements.txt \
+      --replace "weconnect[Images]~=0.40.0" "weconnect"
+  '';
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "weconnect_mqtt"
+  ];
+
+  meta = with lib; {
+    description = "Python client that publishes data from Volkswagen WeConnect";
+    homepage = "https://github.com/tillsteinbach/WeConnect-mqtt";
+    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..734f6ed37a45
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/weconnect/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, ascii-magic
+, buildPythonPackage
+, fetchFromGitHub
+, pillow
+, pytest-httpserver
+, pytestCheckHook
+, pythonOlder
+, requests
+, oauthlib
+}:
+
+buildPythonPackage rec {
+  pname = "weconnect";
+  version = "0.47.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "tillsteinbach";
+    repo = "WeConnect-python";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-wQBl8oxU+Dfsgs+udxcb01hquny+AFKnu4J7AULYOdc=";
+  };
+
+  propagatedBuildInputs = [
+    ascii-magic
+    oauthlib
+    pillow
+    requests
+  ];
+
+  checkInputs = [
+    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~=9.2.0" "pillow"
+    substituteInPlace pytest.ini \
+      --replace "--cov=weconnect --cov-config=.coveragerc --cov-report html" "" \
+      --replace "pytest-cov" ""
+  '';
+
+  pythonImportsCheck = [
+    "weconnect"
+  ];
+
+  meta = with lib; {
+    description = "Python client for the Volkswagen WeConnect Services";
+    homepage = "https://github.com/tillsteinbach/WeConnect-python";
+    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..aaaecc6098fa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/werkzeug/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, watchdog
+, dataclasses
+, ephemeral-port-reserve
+, pytest-timeout
+, pytest-xprocess
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "werkzeug";
+  version = "2.1.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "Werkzeug";
+    inherit version;
+    sha256 = "sha256-HOCOgJPtZ9Y41jh5/Rujc1gX96gN42dNKT9ZhPJftuY=";
+  };
+
+  propagatedBuildInputs = lib.optionals (!stdenv.isDarwin) [
+    # watchdog requires macos-sdk 10.13+
+    watchdog
+  ] ++ lib.optionals (pythonOlder "3.7") [
+    dataclasses
+  ];
+
+  checkInputs = [
+    ephemeral-port-reserve
+    pytest-timeout
+    pytest-xprocess
+    pytestCheckHook
+  ];
+
+  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'"
+  ];
+
+  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; [ SuperSandro2000 ];
+  };
+}
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..eb934fde1129
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/west/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, buildPythonPackage
+, colorama
+, configobj
+, fetchPypi
+, packaging
+, pykwalify
+, pythonOlder
+, pyyaml
+}:
+
+buildPythonPackage rec {
+  pname = "west";
+  version = "0.13.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-B6B7shZ8FM5pyXzXknJv9mwr+ERq4kiEzRf5jLTCicM=";
+  };
+
+  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";
+    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..91afabd368cf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wfuzz/default.nix
@@ -0,0 +1,72 @@
+{ 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=";
+  };
+
+  propagatedBuildInputs = [
+    chardet
+    pycurl
+    six
+    setuptools
+    pyparsing
+  ] ++ lib.optionals stdenv.hostPlatform.isWindows [
+    colorama
+  ];
+
+  checkInputs = [
+    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"
+  ];
+
+  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..9244e26520cd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/whatthepatch/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "whatthepatch";
+  version = "1.0.2";
+
+  src = fetchFromGitHub {
+    owner = "cscorley";
+    repo = pname;
+    rev = version;
+    hash = "sha256-0l/Ebq7Js9sKFJ/RzkQ1aWEDCxt+COVd2qVnLSWwFx0=";
+  };
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "whatthepatch" ];
+
+  meta = with lib; {
+    description = "Python library for both parsing and applying patch files";
+    homepage = "https://github.com/cscorley/whatthepatch";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jyooru ];
+  };
+}
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..3140870289d8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wheel-filename/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, attrs
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+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=";
+  };
+
+  buildInputs = [
+    attrs
+  ];
+
+  checkInputs = [
+    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..438084e6c058
--- /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
+  ];
+
+  checkInputs = [
+    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..93db54b0c6e6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wheel/0001-tests-Rename-a-a-o-_-.py-_-.py.patch
@@ -0,0 +1,37 @@
+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 651c034..9b94ac8 100644
+--- a/tests/test_bdist_wheel.py
++++ b/tests/test_bdist_wheel.py
+@@ -58,7 +58,7 @@ def test_unicode_record(wheel_paths):
+     with ZipFile(path) as zf:
+         record = zf.read('unicode.dist-0.1.dist-info/RECORD')
+ 
+-    assert u'åäö_日本語.py'.encode('utf-8') in record
++    assert u'æɐø_日本價.py'.encode('utf-8') in record
+ 
+ 
+ def test_licenses_default(dummy_dist, monkeypatch, tmpdir):
+-- 
+2.17.2 (Apple Git-113)
+
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..8735a37b21ff
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wheel/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, bootstrapped-pip
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "wheel";
+  version = "0.37.1";
+  format = "other";
+
+  src = fetchFromGitHub {
+    owner = "pypa";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-JlTmUPY3yo/uROyd3nW1dJa23zbLhgQTwcmqZkPOrHs=";
+    name = "${pname}-${version}-source";
+    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 = [
+    bootstrapped-pip
+    setuptools
+  ];
+
+  # No tests in archive
+  doCheck = false;
+  pythonImportsCheck = [ "wheel" ];
+
+  # We add this flag to ignore the copy installed by bootstrapped-pip
+  pipInstallFlags = [ "--ignore-installed" ];
+
+  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/whichcraft/default.nix b/nixpkgs/pkgs/development/python-modules/whichcraft/default.nix
new file mode 100644
index 000000000000..b771615ebbdd
--- /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 ];
+
+  checkInputs = [ 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..7f0b61b37510
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/whirlpool-sixth-sense/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, aioconsole
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-asyncio
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+, websockets
+}:
+
+buildPythonPackage rec {
+  pname = "whirlpool-sixth-sense";
+  version = "0.17.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "abmantis";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    sha256 = "0b7bqg4h9q9rk3hv2im903xn7jgfyf36kcv31v96ap75yrvip6wa";
+  };
+
+  propagatedBuildInputs = [
+    aioconsole
+    aiohttp
+    websockets
+  ];
+
+  checkInputs = [
+    pytest-asyncio
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  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..b36a5c9a23c8
--- /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}";
+    sha256 = "sha256-CnCbRmI2jc67mTtfupoE1uHtobrAiWoUXbfX8YeEV6A=";
+  };
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  checkInputs = [
+    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..02a1b050f914
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/whispers/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, astroid
+, beautifulsoup4
+, buildPythonPackage
+, fetchFromGitHub
+, jproperties
+, luhn
+, lxml
+, pytest-mock
+, pytestCheckHook
+, python-Levenshtein
+, pythonOlder
+, pyyaml
+}:
+
+buildPythonPackage rec {
+  pname = "whispers";
+  version = "1.5.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Skyscanner";
+    repo = pname;
+    rev = version;
+    hash = "sha256-jruUGyoZCyMu015QKtlvfx5WRMfxo/eYUue9wUIWb6o=";
+  };
+
+  propagatedBuildInputs = [
+    astroid
+    beautifulsoup4
+    jproperties
+    luhn
+    lxml
+    python-Levenshtein
+    pyyaml
+  ];
+
+  checkInputs = [
+    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..d4d956119409
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/whitenoise/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, brotli
+, buildPythonPackage
+, django
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "whitenoise";
+  version = "6.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "evansd";
+    repo = pname;
+    rev = version;
+    hash = "sha256-mUjyX4eQOiMweje6UPyfyJsiHwzF5OQ93KuxFedWxbQ=";
+  };
+
+  propagatedBuildInputs = [
+    brotli
+  ];
+
+  checkInputs = [
+    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 = "Radically simplified static file serving for WSGI applications";
+    homepage = "http://whitenoise.evans.io/";
+    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..fcb4d938934d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/whodap/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, asynctest
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, httpx
+}:
+
+buildPythonPackage rec {
+  pname = "whodap";
+  version = "0.1.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "pogzyb";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-gLA6tT6ZUMjb2ZF5t6DdI5nqiX2Uxatj3ThmQ+VZu9A=";
+  };
+
+  propagatedBuildInputs = [
+    httpx
+  ];
+
+  checkInputs = [
+    asynctest
+    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";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
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..51ed08fe4ced
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/whois/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, inetutils
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "whois";
+  version = "0.9.16";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "DannyCork";
+    repo = "python-whois";
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-tpgRBTA+0c0F5XA+dusqPHlegV5r2Ny7AZeRBvS1pcQ=";
+  };
+
+  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/";
+    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..e31d97a07d92
--- /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";
+  };
+
+  checkInputs = [ 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..7609eb376f1c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/widgetsnbextension/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, notebook
+, ipywidgets
+}:
+
+buildPythonPackage rec {
+  pname = "widgetsnbextension";
+  version = "3.6.1";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-nISuZMKJPHy+Lqr8dQUiGnlcJ9aJOEVANKxIcxmnWxA=";
+  };
+
+  # setup.py claims to require notebook, but the source doesn't have any imports
+  # in it.
+  postPatch = ''
+    substituteInPlace setup.py --replace "'notebook>=4.4.1'," ""
+  '';
+
+  propagatedBuildInputs = [ ];
+
+  # No tests in archive
+  doCheck = false;
+
+  meta = {
+    description = "IPython HTML widgets for Jupyter";
+    homepage = "http://ipython.org/";
+    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..024852ca4067
--- /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}";
+    sha256 = "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..80738318433d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wiffi/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "wiffi";
+  version = "1.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "mampfes";
+    repo = "python-wiffi";
+    rev = version;
+    sha256 = "sha256-uB4M3etW1DCE//V2pcmsLZbORmrL00pbPADMQD5y3CY=";
+  };
+
+  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";
+    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..0b5a9444dbfd
--- /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}";
+    sha256 = "sha256-scg/DvApvyQZtzDgkHFJzf9gCRfJgBvZ64CG/c2Cx8E=";
+  };
+
+  disabled = pythonOlder "2.6";
+
+  postPatch = ''
+    substituteInPlace wifi/scan.py \
+      --replace "/sbin/iwlist" "${wirelesstools}/bin/iwlist"
+  '';
+
+  checkInputs = [
+    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/willow/default.nix b/nixpkgs/pkgs/development/python-modules/willow/default.nix
new file mode 100644
index 000000000000..4f6955c2dbdb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/willow/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, six
+, pillow
+}:
+
+buildPythonPackage rec {
+  pname = "willow";
+  version = "1.4.1";
+  disabled = pythonOlder "2.7";
+
+  src = fetchPypi {
+    pname = "Willow";
+    inherit version;
+    sha256 = "sha256-Dfj/UoUx4AtI1Av3Ltgb6sHcgvLULlu+1K/wIYvvjA0=";
+  };
+
+  propagatedBuildInputs = [ six pillow ];
+
+  # Test data is not included
+  # https://github.com/torchbox/Willow/issues/34
+  doCheck = false;
+
+  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..52ae843d4260
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/winacl/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "winacl";
+  version = "0.1.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-G6xWep0hMACCqiJGuw+UpZH8qOIY4WO6sY3w4y7v6gY=";
+  };
+
+  # 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";
+    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..6869c9f0b08a
--- /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.10";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-L1qNLEufRZFEQmkJ4mp05VBRLiO2z5r1LCoAADx8P9s=";
+  };
+
+  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/wktutils/default.nix b/nixpkgs/pkgs/development/python-modules/wktutils/default.nix
new file mode 100644
index 000000000000..8d8fe83c527c
--- /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.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "asfadmin";
+    repo = "Discovery-WKTUtils";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-nAmU51f7K2n69G/vlLTji9EpMU1ynUpj/bZVZsaDEwM=";
+  };
+
+  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..9d42c48a606f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wled/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, aiohttp
+, awesomeversion
+, backoff
+, buildPythonPackage
+, cachetools
+, fetchFromGitHub
+, poetry-core
+, yarl
+, aresponses
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "wled";
+  version = "0.14.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "frenck";
+    repo = "python-wled";
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-ytjCjxnJOMmFlGS+AuEAbIZcV2yoTgaXSLdqxPg6Hew=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    awesomeversion
+    backoff
+    cachetools
+    yarl
+  ];
+
+  checkInputs = [
+    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 = [
+    "wled"
+  ];
+
+  meta = with lib; {
+    description = "Asynchronous Python client for WLED";
+    homepage = "https://github.com/frenck/python-wled";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
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..e9f5ec19d1d1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/woob/default.nix
@@ -0,0 +1,95 @@
+{ lib
+, babel
+, buildPythonPackage
+, colorama
+, cssselect
+, feedparser
+, fetchFromGitLab
+, gdata
+, gnupg
+, google-api-python-client
+, html2text
+, libyaml
+, lxml
+, mechanize
+, nose
+, pdfminer-six
+, pillow
+, prettytable
+, pyqt5
+, python-dateutil
+, pythonOlder
+, pyyaml
+, requests
+, simplejson
+, termcolor
+, unidecode
+}:
+
+buildPythonPackage rec {
+  pname = "woob";
+  version = "3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitLab {
+    owner = "woob";
+    repo = pname;
+    rev = version;
+    hash = "sha256-XLcHNidclORbxVXgcsHY6Ja/dak+EVSKTaVQmg1f/rw=";
+  };
+
+  nativeBuildInputs = [
+    pyqt5
+  ];
+
+  propagatedBuildInputs = [
+    babel
+    colorama
+    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" ""
+  '';
+
+  checkInputs = [
+    nose
+  ];
+
+  checkPhase = ''
+    nosetests
+  '';
+
+  pythonImportsCheck = [
+    "woob"
+  ];
+
+  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..7497ad154890
--- /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 = teams.determinatesystems.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/word2vec/default.nix b/nixpkgs/pkgs/development/python-modules/word2vec/default.nix
new file mode 100644
index 000000000000..c3caf374ff1e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/word2vec/default.nix
@@ -0,0 +1,55 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchPypi
+, fetchzip
+, cython
+, numpy
+, scikit-learn
+, six
+, setuptools-scm
+, gcc
+, pytest
+, pytest-cov
+, isPy27
+}:
+let
+  testData = fetchzip {
+    url = "http://mattmahoney.net/dc/text8.zip";
+    sha256 = "0w3l64bww9znmmvd9cqbfmh3dddnlrjicz43y5qq6fhi9cfqjfar";
+  };
+in
+buildPythonPackage rec {
+  pname = "word2vec";
+  version = "0.11.1";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "222d8ffb47f385c43eba45e3f308e605fc9736b2b7137d74979adf1a31e7c8b4";
+  };
+
+  nativeBuildInputs = [ setuptools-scm gcc ];
+
+  propagatedBuildInputs = [ cython numpy scikit-learn six ];
+
+  checkInputs = [ pytest pytest-cov ];
+
+  # Checks require test data downloaded separately
+  # See project source Makefile:test-data rule for reference
+  checkPhase = ''
+    PATH=$PATH:$out/bin
+    mkdir data
+    head -c 100000 ${testData}/text8 > data/text8-small
+    pytest
+  '';
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    description = "Tool for computing continuous distributed representations of words";
+    homepage = "https://github.com/danielfrg/word2vec";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ NikolaMandic ];
+  };
+
+}
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..2ac682c775fe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wordcloud/default.nix
@@ -0,0 +1,75 @@
+{ lib
+, buildPythonPackage
+, cython
+, fetchFromGitHub
+, fetchpatch
+, matplotlib
+, mock
+, numpy
+, pillow
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "wordcloud";
+  version = "1.8.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "amueller";
+    repo = pname;
+    rev = version;
+    hash = "sha256-4EFQfv+Jn9EngUAyDoJP0yv9zr9Tnbrdwq1YzDacB9Q=";
+  };
+
+  nativeBuildInputs = [
+    cython
+  ];
+
+  propagatedBuildInputs = [
+    matplotlib
+    numpy
+    pillow
+  ];
+
+  checkInputs = [
+    mock
+    pytestCheckHook
+  ];
+
+  patches = [
+    (fetchpatch {
+      # https://github.com/amueller/word_cloud/pull/616
+      url = "https://github.com/amueller/word_cloud/commit/858a8ac4b5b08494c1d25d9e0b35dd995151a1e5.patch";
+      sha256 = "sha256-+aDTMPtOibVwjPrRLxel0y4JFD5ERB2bmJi4zRf/asg=";
+    })
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace " --cov --cov-report xml --tb=short" ""
+  '';
+
+  preCheck = ''
+    cd test
+  '';
+
+  pythonImportsCheck = [
+    "wordcloud"
+  ];
+
+  disabledTests = [
+    # Don't tests CLI
+    "test_cli_as_executable"
+  ];
+
+  meta = with lib; {
+    description = "Word cloud generator in Python";
+    homepage = "https://github.com/amueller/word_cloud";
+    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..72a2f013928d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wordfreq/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, regex
+, langcodes
+, ftfy
+, msgpack
+, mecab-python3
+, jieba
+, pytestCheckHook
+, isPy27
+, fetchFromGitHub
+}:
+
+buildPythonPackage rec {
+  pname = "wordfreq";
+  version = "2.5.1";
+  disabled = isPy27;
+
+   src = fetchFromGitHub {
+    owner = "LuminosoInsight";
+    repo = "wordfreq";
+    rev = "v${version}";
+    sha256 = "1lw7kbsydd89hybassnnhqnj9s5ch9wvgd6pla96198nrq9mj7fw";
+   };
+
+  propagatedBuildInputs = [
+    regex
+    langcodes
+    ftfy
+    msgpack
+    mecab-python3
+    jieba
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py --replace "regex ==" "regex >="
+  '';
+
+  checkInputs = [ 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/LuminosoInsight/wordfreq/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ixxie ];
+  };
+}
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..fed9a3c9007f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/worldengine/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, buildPythonPackage
+, isPy27
+, fetchFromGitHub
+, noise
+, numpy
+, pyplatec
+, protobuf
+, purepng
+, h5py
+, gdal
+, 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 = [ noise numpy pyplatec protobuf purepng h5py gdal ];
+
+  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' \
+  '';
+
+  doCheck = !isPy27; # google namespace clash
+  checkInputs = [ pytestCheckHook ];
+
+  disabledTests = [
+    "TestSerialization"
+  ];
+
+  meta = with lib; {
+    homepage = "http://world-engine.org";
+    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..e04424ba49e2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wrapio/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "wrapio";
+  version = "2.0.0";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-CUocIbdZ/tJQCxAHzhFpB267ynlXf8Mu+thcRRc0yeg=";
+  };
+
+  doCheck = false;
+  pythonImportsCheck = [ "wrapio" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/Exahilosys/wrapio";
+    description = "Handling event-based streams";
+    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..b53c52d6098a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wrapt/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "wrapt";
+  version = "1.13.3";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "GrahamDumpleton";
+    repo = pname;
+    rev = version;
+    hash = "sha256-kq3Ujkn4HzonzjuQfVnPNnQV+2Rnbr3ZfYmrnY3upxU=";
+  };
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  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..2714169aaddd
--- /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
+  ];
+
+  checkInputs = [
+    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.isLinux && stdenv.isAarch64) || 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..8abf78520dca
--- /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";
+  };
+
+  checkInputs = [ 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..8ba797449494
--- /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
+  ];
+
+  checkInputs = [
+    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..81ed4fdf7667
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wsgi-intercept/default.nix
@@ -0,0 +1,31 @@
+{ lib, buildPythonPackage, fetchPypi, six, httplib2, py, pytestCheckHook, requests, urllib3 }:
+
+buildPythonPackage rec {
+  pname = "wsgi-intercept";
+  version = "1.10.0";
+
+  src = fetchPypi {
+    pname = "wsgi_intercept";
+    inherit version;
+    sha256 = "sha256-BX8EWtR8pXkibcliJbfBw6/5VdHs9HczjM1c1SWx3wk=";
+  };
+
+  propagatedBuildInputs = [ six ];
+
+  checkInputs = [ 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 = "wsgi_intercept installs a WSGI application in place of a real URI for testing";
+    homepage = "https://github.com/cdent/wsgi-intercept";
+    license = licenses.mit;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..882f4091040f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wsgidav/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, cheroot
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, defusedxml
+, jinja2
+, json5
+, python-pam
+, pyyaml
+, requests
+, webtest
+}:
+
+buildPythonPackage rec {
+  pname = "wsgidav";
+  version = "4.0.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "mar10";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-LQdS9d2DB4PXqRSzmtZCSyCQI47ncLCG+RSB+goZYoA=";
+  };
+
+  propagatedBuildInputs = [
+    defusedxml
+    jinja2
+    json5
+    python-pam
+    pyyaml
+  ];
+
+  checkInputs = [
+    cheroot
+    pytestCheckHook
+    requests
+    webtest
+  ];
+
+  pythonImportsCheck = [
+    "wsgidav"
+  ];
+
+  meta = with lib; {
+    description = "Generic and extendable WebDAV server based on WSGI";
+    homepage = "https://wsgidav.readthedocs.io/";
+    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..af35c23e455f
--- /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";
+    sha256 = "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/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..bcc9428b460b
--- /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.1.0";
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-ouVr/Vx82DwTadg7X+zNbTd5i3SHKGbmJhbg7PERvag=";
+  };
+
+  propagatedBuildInputs = [ h11 ];
+
+  checkInputs = [ 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; [ SuperSandro2000 ];
+  };
+}
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..35be8ba260c4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wtf-peewee/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, peewee
+, wtforms
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "wtf-peewee";
+  version = "3.0.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "faa953fe3f705d4f2b48f3c1a81c5c5a6a38f9ed1378c9a830e6efc1b0fccb15";
+  };
+
+  patches = [
+    (fetchpatch {
+      name = "fix-wtforms3.patch";
+      url = "https://github.com/coleifer/wtf-peewee/commit/b1764f4474c73a9a2b34ae6b7db61274f5252a7f.patch";
+      sha256 = "0maz3fm9bi8p80nk9sdb34xq55xq8ihm51y7k0m8ck9aaypvwbig";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    peewee
+    wtforms
+  ];
+
+  checkPhase = ''
+    ${python.interpreter} runtests.py
+  '';
+
+  meta = with lib; {
+    description = "WTForms integration for peewee models";
+    homepage = "https://github.com/coleifer/wtf-peewee/";
+    license = licenses.mit;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..ef2e06cc3e71
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wtforms/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, markupsafe
+, babel
+, pytestCheckHook
+, email-validator
+}:
+
+buildPythonPackage rec {
+  version = "3.0.1";
+  pname = "wtforms";
+
+  src = fetchPypi {
+    pname = "WTForms";
+    inherit version;
+    sha256 = "1g654ghavds387hqxmhg9s8x222x89wbq1ggzxbsyn6x2axindbb";
+  };
+
+  propagatedBuildInputs = [ markupsafe babel ];
+
+
+  checkInputs = [
+    pytestCheckHook
+    email-validator
+  ];
+
+  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 = [ 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..395f3ad5b107
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wurlitzer/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, mock
+, pytest
+, selectors2
+}:
+
+buildPythonPackage rec {
+  pname = "wurlitzer";
+  version = "3.0.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "36051ac530ddb461a86b6227c4b09d95f30a1d1043de2b4a592e97ae8a84fcdf";
+  };
+
+  propagatedBuildInputs = lib.optionals isPy27 [ selectors2 ];
+
+  checkInputs = [ mock pytest ];
+
+  checkPhase = ''
+    py.test test.py
+  '';
+
+  meta = {
+    description = "Capture C-level output in context managers";
+    homepage = "https://github.com/minrk/wurlitzer";
+    license = lib.licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/wxPython/4.0.nix b/nixpkgs/pkgs/development/python-modules/wxPython/4.0.nix
new file mode 100644
index 000000000000..3a86ef4c6390
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wxPython/4.0.nix
@@ -0,0 +1,79 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, pkg-config
+, which
+, cairo
+, pango
+, python
+, doxygen
+, ncurses
+, libintl
+, wxGTK
+, wxmac
+, IOKit
+, Carbon
+, Cocoa
+, AudioToolbox
+, OpenGL
+, CoreFoundation
+, pillow
+, numpy
+}:
+
+buildPythonPackage rec {
+  pname = "wxPython";
+  version = "4.0.7.post2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5a229e695b64f9864d30a5315e0c1e4ff5e02effede0a07f16e8d856737a0c4e";
+  };
+
+  doCheck = false;
+
+  nativeBuildInputs = [ pkg-config which doxygen ]
+  ++ (if stdenv.isDarwin then [ wxmac ] else [ wxGTK ]);
+
+  buildInputs = [ ncurses libintl ]
+  ++ (if stdenv.isDarwin
+  then
+    [ AudioToolbox Carbon Cocoa CoreFoundation IOKit OpenGL ]
+  else
+    [ wxGTK.gtk ]
+  );
+
+  propagatedBuildInputs = [ pillow numpy ];
+
+  DOXYGEN = "${doxygen}/bin/doxygen";
+
+  preConfigure = lib.optionalString (!stdenv.isDarwin) ''
+    substituteInPlace wx/lib/wxcairo/wx_pycairo.py \
+      --replace 'cairoLib = None' 'cairoLib = ctypes.CDLL("${cairo}/lib/libcairo.so")'
+    substituteInPlace wx/lib/wxcairo/wx_pycairo.py \
+      --replace '_dlls = dict()' '_dlls = {k: ctypes.CDLL(v) for k, v in [
+        ("gdk",        "${wxGTK.gtk}/lib/libgtk-x11-2.0.so"),
+        ("pangocairo", "${pango.out}/lib/libpangocairo-1.0.so"),
+        ("appsvc",     None)
+      ]}'
+  '';
+
+  buildPhase = ''
+    ${python.interpreter} build.py -v --use_syswx dox etg --nodoc sip build_py
+  '';
+
+  installPhase = ''
+    ${python.interpreter} setup.py install --skip-build --prefix=$out
+  '';
+
+  passthru = { wxWidgets = if stdenv.isDarwin then wxmac else wxGTK; };
+
+
+  meta = {
+    description = "Cross platform GUI toolkit for Python, Phoenix version";
+    homepage = "http://wxpython.org/";
+    license = lib.licenses.wxWindows;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/wxPython/4.1.nix b/nixpkgs/pkgs/development/python-modules/wxPython/4.1.nix
new file mode 100644
index 000000000000..94fb10f113b3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wxPython/4.1.nix
@@ -0,0 +1,103 @@
+{ lib
+, stdenv
+, fetchPypi
+, buildPythonPackage
+, which
+, pkg-config
+, python
+, isPy27
+, doxygen
+, cairo
+, ncurses
+, pango
+, wxGTK
+, pillow
+, numpy
+, libXinerama
+, libSM
+, libXxf86vm
+, libXtst
+, libGLU
+, libGL
+, xorgproto
+, gst_all_1
+, libglvnd
+, mesa
+, webkitgtk
+, autoPatchelfHook
+}:
+let
+  dynamic-linker = stdenv.cc.bintools.dynamicLinker;
+in
+buildPythonPackage rec {
+  pname = "wxPython";
+  version = "4.1.1";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0a1mdhdkda64lnwm1dg0dlrf9rs4gkal3lra6hpqbwn718cf7r80";
+  };
+
+  # https://github.com/NixOS/nixpkgs/issues/75759
+  # https://github.com/wxWidgets/Phoenix/issues/1316
+  doCheck = false;
+
+  nativeBuildInputs = [
+    which
+    doxygen
+    wxGTK.gtk
+    pkg-config
+  ] ++ lib.optionals stdenv.isLinux [
+    autoPatchelfHook
+  ];
+
+  buildInputs = [
+    wxGTK.gtk
+    ncurses
+  ] ++ lib.optionals stdenv.isLinux [
+    libXinerama
+    libSM
+    libXxf86vm
+    libXtst
+    xorgproto
+    gst_all_1.gstreamer
+    gst_all_1.gst-plugins-base
+    libGLU
+    libGL
+    libglvnd
+    mesa
+    webkitgtk
+  ];
+
+  propagatedBuildInputs = [ pillow numpy ];
+
+  DOXYGEN = "${doxygen}/bin/doxygen";
+
+  preConfigure = lib.optionalString (!stdenv.isDarwin) ''
+    substituteInPlace wx/lib/wxcairo/wx_pycairo.py \
+      --replace '_dlls = dict()' '_dlls = {k: ctypes.CDLL(v) for k, v in [
+        ("gdk",        "${wxGTK.gtk}/lib/libgtk-x11-3.0.so"),
+        ("pangocairo", "${pango.out}/lib/libpangocairo-1.0.so"),
+        ("cairoLib = None", "cairoLib = ctypes.CDLL('${cairo}/lib/libcairo.so')"),
+        ("appsvc",     None)
+      ]}'
+  '';
+
+  buildPhase = ''
+    ${python.interpreter} build.py -v build_wx dox etg --nodoc sip build_py
+  '';
+
+  installPhase = ''
+    ${python.interpreter} setup.py install --skip-build --prefix=$out
+    wrapPythonPrograms
+  '';
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    description = "Cross platform GUI toolkit for Python, Phoenix version";
+    homepage = "http://wxpython.org/";
+    license = licenses.wxWindows;
+    maintainers = with maintainers; [ tfmoraes ];
+  };
+}
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..e9cfe3174327
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/x11_hash/default.nix
@@ -0,0 +1,22 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  version = "1.4";
+  pname = "x11_hash";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "172skm9xbbrivy1p4xabxihx9lsnzi53hvzryfw64m799k2fmp22";
+  };
+
+  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..752204760d4e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xapian/default.nix
@@ -0,0 +1,42 @@
+{ 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-eGzCjQVmCyJ5VEE68OL2bk6tKgbT322rrqSERUtgHvU=";
+  };
+
+  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/";
+    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..ba48de4de7e1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xapp/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, psutil
+, pygobject3
+, gtk3
+, gobject-introspection
+, xapp
+, polkit
+}:
+
+buildPythonPackage rec {
+  pname = "xapp";
+  version = "2.2.2";
+
+  src = fetchFromGitHub {
+    owner = "linuxmint";
+    repo = "python-xapp";
+    rev = version;
+    hash = "sha256-ntjJ/O6HiRZMsqsuQY4HLM4fBE0aWpn/L4n5YCRlhhg=";
+  };
+
+  propagatedBuildInputs = [
+    psutil
+    pygobject3
+    gtk3
+    gobject-introspection
+    xapp
+    polkit
+  ];
+
+  postPatch = ''
+    substituteInPlace "xapp/os.py" --replace "/usr/bin/pkexec" "${polkit}/bin/pkexec"
+  '';
+
+  doCheck = false;
+  pythonImportsCheck = [ "xapp" ];
+
+  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 = [ maintainers.mkg20001 ];
+  };
+}
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..244541f7d852
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xarray-einstats/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, einops
+, fetchFromGitHub
+, flit-core
+, numba
+, numpy
+, pandas
+, pytestCheckHook
+, pythonOlder
+, scipy
+, xarray
+}:
+
+buildPythonPackage rec {
+  pname = "xarray-einstats";
+  version = "0.3.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "arviz-devs";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-N8ievasPaqusx51FCxcl1FGIjXooyBsRqsuRU73puRM=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    scipy
+    xarray
+  ];
+
+  checkInputs = [
+    einops
+    numba
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "xarray_einstats"
+  ];
+
+  pytestFlagsArray = [
+    "src/xarray_einstats/tests/"
+  ];
+
+  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..5d0ac813e498
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xarray/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, numpy
+, packaging
+, pandas
+, pytestCheckHook
+, pythonOlder
+, setuptoolsBuildHook
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "xarray";
+  version = "2022.3.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-OYNEv30XBHeqzv9wIQ4R69aa9rFW/hOXgFTSXEhylEA=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION="${version}";
+
+  nativeBuildInputs = [
+    setuptoolsBuildHook
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    packaging
+    pandas
+  ];
+
+  checkInputs = [
+    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..28b9f809dd00
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xattr/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+, cffi
+}:
+
+buildPythonPackage rec {
+  pname = "xattr";
+  version = "0.9.9";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "09cb7e1efb3aa1b4991d6be4eb25b73dc518b4fe894f0915f5b0dcede972f346";
+  };
+
+  propagatedBuildInputs = [ cffi ];
+
+  # https://github.com/xattr/xattr/issues/43
+  doCheck = false;
+
+  postBuild = ''
+    ${python.interpreter} -m compileall -f xattr
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/xattr/xattr";
+    description = "Python wrapper for extended filesystem attributes";
+    license = licenses.mit;
+  };
+
+}
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..ccd2d3febf13
--- /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
+  ];
+
+  checkInputs = [
+    aresponses
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "--asyncio-mode=legacy"
+  ];
+
+  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..973f2f6aba24
--- /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 ];
+
+  checkInputs = [ 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..cb9e1ddf921c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xcffib/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, xorg
+, cffi
+, nose
+, six
+}:
+
+buildPythonPackage rec {
+  version = "0.11.1";
+  pname = "xcffib";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "12949cfe2e68c806efd57596bb9bf3c151f399d4b53e15d1101b2e9baaa66f5a";
+  };
+
+  patchPhase = ''
+    # Hardcode cairo library path
+    sed -e 's,ffi\.dlopen(,&"${xorg.libxcb.out}/lib/" + ,' -i xcffib/__init__.py
+  '';
+
+  propagatedBuildInputs = [ cffi six ];
+
+  propagatedNativeBuildInputs = [ cffi ];
+
+  checkInputs = [ nose ];
+
+  pythonImportsCheck = [ "xcffib" ];
+
+  meta = with lib; {
+    description = "A drop in replacement for xpyb, an XCB python binding";
+    homepage = "https://github.com/tych0/xcffib";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ kamilchm ];
+  };
+}
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..ddf66a741758
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xdg/default.nix
@@ -0,0 +1,34 @@
+{ lib, buildPythonPackage, fetchFromGitHub, isPy27
+, clikit
+, poetry-core
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  version = "5.1.1";
+  pname = "xdg";
+  disabled = isPy27;
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "srstevenson";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-z/Zvo2WGw9qA+M3Pt9r35DuxtuhL7/I75LlFEdDOJcc=";
+  };
+
+  nativeBuildInputs = [ poetry-core ];
+
+  propagatedBuildInputs = [
+    clikit
+  ];
+
+  checkInputs = [ pytestCheckHook ];
+
+  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..5039dc242f03
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xdis/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, buildPythonPackage
+, click
+, fetchFromGitHub
+, fetchpatch
+, pytestCheckHook
+, pythonOlder
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "xdis";
+  version = "6.0.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "rocky";
+    repo = "python-xdis";
+    rev = version;
+    hash = "sha256-CRZG898xCwukq+9YVkyXMP8HcuJ9GtvDhy96kxvRFks=";
+  };
+
+  postPatch = ''
+    # Our Python release is not in the test matrix
+    substituteInPlace xdis/magics.py \
+      --replace "3.10.4" "3.10.5 3.10.6"
+  '';
+
+  propagatedBuildInputs = [
+    click
+    six
+  ];
+
+  checkInputs = [
+    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";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ onny ];
+  };
+}
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..a07235006c9a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xdot/default.nix
@@ -0,0 +1,35 @@
+{ lib, buildPythonPackage, fetchPypi, isPy3k, python, xvfb-run
+, wrapGAppsHook, gobject-introspection, pygobject3, graphviz, gtk3, numpy }:
+
+buildPythonPackage rec {
+  pname = "xdot";
+  version = "1.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3df91e6c671869bd2a6b2a8883fa3476dbe2ba763bd2a7646cf848a9eba71b70";
+  };
+
+  disabled = !isPy3k;
+  nativeBuildInputs = [ wrapGAppsHook ];
+  propagatedBuildInputs = [ gobject-introspection pygobject3 graphviz gtk3 numpy ];
+  checkInputs = [ xvfb-run ];
+
+  postInstall = ''
+    wrapProgram "$out/bin/xdot" --prefix PATH : "${lib.makeBinPath [ graphviz ]}"
+  '';
+
+  checkPhase = ''
+    xvfb-run -s '-screen 0 800x600x24' ${python.interpreter} nix_run_setup test
+  '';
+
+  # https://github.com/NixOS/nixpkgs/pull/107872#issuecomment-752175866
+  # cannot import name '_gi' from partially initialized module 'gi' (most likely due to a circular import)
+  doCheck = false;
+
+  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/xgboost/default.nix b/nixpkgs/pkgs/development/python-modules/xgboost/default.nix
new file mode 100644
index 000000000000..f6c63db45051
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xgboost/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, buildPythonPackage
+, pytestCheckHook
+, cmake
+, scipy
+, scikit-learn
+, stdenv
+, xgboost
+, pandas
+, matplotlib
+, graphviz
+, datatable
+, hypothesis
+}:
+
+buildPythonPackage {
+  pname = "xgboost";
+  inherit (xgboost) version src meta;
+
+  nativeBuildInputs = [ cmake ];
+  buildInputs = [ xgboost ];
+  propagatedBuildInputs = [ scipy ];
+  checkInputs = [
+    pytestCheckHook
+    scikit-learn
+    pandas
+    matplotlib
+    graphviz
+    datatable
+    hypothesis
+  ];
+
+  # 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
+  '';
+
+  preCheck = ''
+    ln -sf ../demo .
+    ln -s ${xgboost}/bin/xgboost ../xgboost
+  '';
+
+  # tests are extremely cpu intensive, only run basic tests to ensure package is working
+  pytestFlagsArray = ["../tests/python/test_basic.py"];
+  disabledTestPaths = [
+    # Requires internet access: https://github.com/dmlc/xgboost/blob/03cd087da180b7dff21bd8ef34997bf747016025/tests/python/test_ranking.py#L81
+    "../tests/python/test_ranking.py"
+  ];
+  disabledTests = [
+    "test_cli_binary_classification"
+    "test_model_compatibility"
+  ] ++ lib.optionals stdenv.isDarwin [
+    # fails to connect to the com.apple.fonts daemon in sandboxed mode
+    "test_plotting"
+    "test_sklearn_plotting"
+  ];
+
+  __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..31ae00ec7817
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xhtml2pdf/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, arabic-reshaper
+, buildPythonPackage
+, fetchFromGitHub
+, html5lib
+, pillow
+, pyhanko
+, pypdf3
+, pytestCheckHook
+, python-bidi
+, pythonOlder
+, reportlab
+, svglib
+}:
+
+buildPythonPackage rec {
+  pname = "xhtml2pdf";
+  version = "0.2.8";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  # Tests are only available on GitHub
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    # Currently it is not possible to fetch from version as there is a branch with the same name
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-zWzg/r18wjzxWyD5QJ7l4pY+4bJTvHjrD11FRuuy8H8=";
+  };
+
+  propagatedBuildInputs = [
+    arabic-reshaper
+    html5lib
+    pillow
+    pyhanko
+    pypdf3
+    python-bidi
+    reportlab
+    svglib
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "xhtml2pdf"
+  ];
+
+  meta = with lib; {
+    description = "A PDF generator using HTML and CSS";
+    homepage = "https://github.com/xhtml2pdf/xhtml2pdf";
+    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..7d13d6d3a6d2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xiaomi-ble/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, bleak-retry-connector
+, bluetooth-sensor-state-data
+, buildPythonPackage
+, fetchFromGitHub
+, home-assistant-bluetooth
+, poetry-core
+, pycryptodomex
+, pytestCheckHook
+, pythonOlder
+, sensor-state-data
+}:
+
+buildPythonPackage rec {
+  pname = "xiaomi-ble";
+  version = "0.8.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "Bluetooth-Devices";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-HwA2NKsrqXBsC5/rUZUNfHDk8QA7I+zQmwqt0SVhw38=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    bleak-retry-connector
+    bluetooth-sensor-state-data
+    home-assistant-bluetooth
+    pycryptodomex
+    sensor-state-data
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace " --cov=xiaomi_ble --cov-report=term-missing:skip-covered" ""
+  '';
+
+  pythonImportsCheck = [
+    "xiaomi_ble"
+  ];
+
+  meta = with lib; {
+    description = "Library for Xiaomi BLE devices";
+    homepage = "https://github.com/Bluetooth-Devices/xiaomi-ble";
+    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..580ad3921905
--- /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.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "V5LMaX5TPhk9x4ZA4MGFzDhUiC6NKPo4uTbW6Q7mdVw=";
+  };
+
+  nativeBuildInputs = [ pkg-config ];
+  propagatedNativeBuildInputs = [ cffi ];
+  buildInputs = [ libxkbcommon ];
+  propagatedBuildInputs = [ cffi ];
+  checkInputs = [ pytestCheckHook ];
+
+  postBuild = ''
+    ${python.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..5aac18d21077
--- /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.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-xaLpSHRtpv5QToQEKE9FfY6Y2m31BHxrs/cbGIgunSo=";
+  };
+
+  nativeBuildInputs = [
+    installShellFiles
+  ];
+
+  checkInputs = [
+    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..c15ac82fc1ac
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xknx/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, cryptography
+, ifaddr
+, voluptuous
+, pyyaml
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "xknx";
+  version = "1.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "XKNX";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-gJw/PtPwXo1FJcEH8SYRyQNaJoWQIfH2Mnxu52CqI8s=";
+  };
+
+  propagatedBuildInputs = [
+    cryptography
+    ifaddr
+  ];
+
+  checkInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "xknx"
+  ];
+
+  disabledTests = [
+    # Test requires network access
+    "test_scan_timeout"
+  ];
+
+  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";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+    platforms = platforms.linux;
+  };
+}
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..05d5e095a163
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xlib/default.nix
@@ -0,0 +1,54 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, six
+, setuptools-scm
+, xorg
+, python
+, mock
+, nose
+, pytestCheckHook
+, util-linux
+}:
+
+buildPythonPackage rec {
+  pname = "xlib";
+  version = "0.31";
+
+  src = fetchFromGitHub {
+    owner = "python-xlib";
+    repo = "python-xlib";
+    rev = version;
+    sha256 = "155p9xhsk01z9vdml74h07svlqy6gljnx9c6qbydcr14lwghwn06";
+  };
+
+  patches = [
+    ./fix-no-protocol-specified.patch
+  ];
+
+  nativeBuildInputs = [ setuptools-scm ];
+  buildInputs = [ xorg.libX11 ];
+  propagatedBuildInputs = [ six ];
+
+  doCheck = !stdenv.isDarwin;
+  checkInputs = [
+    pytestCheckHook
+    mock
+    nose
+    util-linux
+    xorg.xauth
+    xorg.xorgserver
+  ];
+
+  disabledTestPaths = [
+    # requires x session
+    "test/test_xlib_display.py"
+  ];
+
+  meta = with lib; {
+    description = "Fully functional X client library for Python programs";
+    homepage = "http://python-xlib.sourceforge.net/";
+    license = licenses.gpl2Plus;
+  };
+
+}
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..bc88880f30a3
--- /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";
+  };
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  # No tests in archive
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "http://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..e22c0d965919
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xlsx2csv/default.nix
@@ -0,0 +1,21 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "xlsx2csv";
+  version = "0.7.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c3aaf0c5febd9c5e48488026e7a58af37a67bf3da5e221cc57d371328b3b7dd3";
+  };
+
+  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/xlwt/default.nix b/nixpkgs/pkgs/development/python-modules/xlwt/default.nix
new file mode 100644
index 000000000000..7b8e931fb874
--- /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";
+  };
+
+  checkInputs = [ 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..30300c61045d
--- /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;
+    sha256 = "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..06c494d76d45
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xml2rfc/default.nix
@@ -0,0 +1,95 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, intervaltree
+, pyflakes
+, requests
+, lxml
+, google-i18n-address
+, pycountry
+, html5lib
+, six
+, kitchen
+, pypdf2
+, dict2xml
+, weasyprint
+, pyyaml
+, jinja2
+, configargparse
+, appdirs
+, decorator
+, pycairo
+, pytestCheckHook
+, python-fontconfig
+}:
+
+buildPythonPackage rec {
+  pname = "xml2rfc";
+  version = "3.14.0";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "ietf-tools";
+    repo = "xml2rfc";
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-BuOHQ6LnfjdlE9+wdJbl6wdD/oddKIklabVBx1IJJBA=";
+  };
+
+  postPatch = ''
+    substituteInPlace Makefile \
+      --replace "SHELL := /bin/bash" "SHELL := bash" \
+      --replace "test flaketest" "test" \
+      --replace "python setup.py --quiet install" ""
+    substituteInPlace setup.py \
+      --replace "'tox'," ""
+    substituteInPlace requirements.txt \
+      --replace "jinja2>=2.11,<3.0" "jinja2" \
+      --replace "markupsafe==2.0.1" "markupsafe"
+  '';
+
+  propagatedBuildInputs = [
+    intervaltree
+    jinja2
+    pyflakes
+    pyyaml
+    requests
+    lxml
+    google-i18n-address
+    pycountry
+    html5lib
+    six
+    kitchen
+    pypdf2
+    dict2xml
+    weasyprint
+    configargparse
+    appdirs
+  ];
+
+  checkInputs = [
+    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";
+    # 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..1dfb09147589
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xmldiff/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, lxml
+, setuptools
+, six
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "xmldiff";
+  version = "2.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-Bb6iDOHyyWeGg7zODDupmB+H2StwnRkOAYvL8Efsz2M=";
+  };
+
+  propagatedBuildInputs = [ lxml setuptools six ];
+
+  checkInputs = [ pytestCheckHook ];
+
+  meta = with lib; {
+    homepage = "https://github.com/Shoobx/xmldiff";
+    description = "Creates diffs of XML files";
+    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..dd5d84afacb4
--- /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";
+  };
+
+  checkInputs = [
+    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..3dcfe8d7d026
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xmlschema/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, elementpath
+, lxml
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "xmlschema";
+  version = "1.11.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "sissaschool";
+    repo = "xmlschema";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-z6VgLRDp5PHaYstdV30gt6xGVd4uifz4LkYQ2z3ayk4=";
+  };
+
+  propagatedBuildInputs = [
+    elementpath
+  ];
+
+  checkInputs = [
+    lxml
+    pytestCheckHook
+  ];
+
+  # Ignore broken fixtures, and tests for files which don't exist.
+  # For darwin, we need to explicity say we can't reach network
+  disabledTests = [
+    "export_remote"
+    "element_tree_import_script"
+  ];
+
+  disabledTestPaths = [
+    "tests/test_schemas.py"
+    "tests/test_memory.py"
+    "tests/test_validation.py"
+  ];
+
+  pythonImportsCheck = [
+    "xmlschema"
+  ];
+
+  meta = with lib; {
+    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..0224c03ab3e8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xmlsec/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, pytestCheckHook
+, libxslt
+, libxml2
+, libtool
+, pkg-config
+, xmlsec
+, pkgconfig
+, setuptools-scm
+, lxml
+, hypothesis
+}:
+
+buildPythonPackage rec {
+  pname = "xmlsec";
+  version = "1.3.12";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "2c86ac6ce570c9e04f04da0cd5e7d3db346e4b5b1d006311606368f17c756ef9";
+  };
+
+  # https://github.com/mehcode/python-xmlsec/issues/84#issuecomment-632930116
+  patches = [
+    ./reset-lxml-in-tests.patch
+  ];
+
+  nativeBuildInputs = [ pkg-config pkgconfig setuptools-scm ];
+
+  buildInputs = [ xmlsec libxslt libxml2 libtool ];
+
+  propagatedBuildInputs = [ lxml ];
+
+  checkInputs = [ 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/xmlsec/reset-lxml-in-tests.patch b/nixpkgs/pkgs/development/python-modules/xmlsec/reset-lxml-in-tests.patch
new file mode 100644
index 000000000000..0968583faa63
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xmlsec/reset-lxml-in-tests.patch
@@ -0,0 +1,22 @@
+diff --git a/tests/base.py b/tests/base.py
+index b05de1d..5ec356f 100644
+--- a/tests/base.py
++++ b/tests/base.py
+@@ -94,6 +94,7 @@ class TestMemoryLeaks(unittest.TestCase):
+ 
+     def load_xml(self, name, xpath=None):
+         """returns xml.etree"""
++        etree.set_default_parser(parser=etree.XMLParser())
+         root = etree.parse(self.path(name)).getroot()
+         if xpath is None:
+             return root
+diff --git a/tests/test_doc_examples.py b/tests/test_doc_examples.py
+index 2fc490f..53d2377 100644
+--- a/tests/test_doc_examples.py
++++ b/tests/test_doc_examples.py
+@@ -42,3 +42,5 @@ def test_doc_example(example):
+     """
+     with cd(example.parent):
+         runpy.run_path(str(example))
++    from lxml import etree
++    etree.set_default_parser(parser=etree.XMLParser())
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..19c2b1d283f6
--- /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;
+    sha256 = "sha256-NBWVpIjj4BqFqdiRHYkS/ZIu3l/sxNzkN+tLbI0DflY=";
+  };
+
+  checkInputs = [
+    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; [ SuperSandro2000 ];
+  };
+}
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..a53567f7fa8b
--- /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.6";
+
+  src = fetchFromGitHub {
+    owner = "tehmaze";
+    repo = "xmodem";
+    rev = version;
+    sha256 = "1xx7wd8bnswxa1fv3bfim2gcamii79k7qmwg7dbxbjvrhbcjjc0l";
+  };
+
+  checkInputs = [ 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/xnd/default.nix b/nixpkgs/pkgs/development/python-modules/xnd/default.nix
new file mode 100644
index 000000000000..3657997f5a74
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xnd/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, python
+, ndtypes
+, libndtypes
+, libxnd
+, isPy27
+}:
+
+buildPythonPackage {
+  pname = "xnd";
+  disabled = isPy27;
+  inherit (libxnd) version src meta;
+
+  propagatedBuildInputs = [ ndtypes ];
+
+  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..a7c08ddc0bec
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xpath-expressions/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, lxml
+, poetry-core
+, pythonOlder
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "xpath-expressions";
+  version = "1.1.0";
+  disabled = pythonOlder "3.5";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "orf";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0l289iw2zmzxyfi3g2z7b917vmsaz47h5jp871zvykpmpigc632h";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  checkInputs = [
+    lxml
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    # Was fixed upstream but not released
+    substituteInPlace pyproject.toml \
+      --replace "poetry.masonry.api" "poetry.core.masonry.api"
+  '';
+
+  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..fbc621a59692
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xsdata/default.nix
@@ -0,0 +1,80 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, click
+, click-default-group
+, docformatter
+, jinja2
+, toposort
+, lxml
+, requests
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "xsdata";
+  version = "22.7";
+
+  disabled = pythonOlder "3.6";
+
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-2EpbTNYdjcHOQQqe+bEpMzGxD2Jh34P+eI+uK4SJPdo=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "--benchmark-skip" ""
+  '';
+
+  passthru.optional-dependencies = {
+    cli = [
+      click
+      click-default-group
+      docformatter
+      jinja2
+      toposort
+    ];
+    lxml = [
+      lxml
+    ];
+    soap = [
+      requests
+    ];
+  };
+
+  checkInputs = [
+    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";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ dotlambda ];
+  };
+}
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-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..7d973c0906e9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xtensor-python/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, cmake
+, gtest
+, xtensor
+, pybind11
+, numpy
+}:
+
+buildPythonPackage rec {
+  pname = "xtensor-python";
+  version = "0.25.1";
+
+  src = fetchFromGitHub {
+    owner = "xtensor-stack";
+    repo = pname;
+    rev = version;
+    sha256 = "17la76hn4r1jv67dzz8x2pzl608r0mnvz854407mchlzj6rhsxza";
+  };
+
+  nativeBuildInputs = [ cmake pybind11 ];
+
+  propagatedBuildInputs = [ xtensor numpy ];
+
+  dontUseSetuptoolsBuild = true;
+  dontUsePipInstall = true;
+  dontUseSetuptoolsCheck = true;
+
+  checkInputs = [
+    gtest
+  ];
+
+  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..f037cb40338c
--- /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;
+
+  checkInputs = [ 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..ff4eeff35459
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xxhash/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  version = "3.0.0";
+  pname = "xxhash";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-MLLZeq8R+xIgI/a0TruXxpVengDXRhqWQVygMLXOucc=";
+  };
+
+  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/yabadaba/default.nix b/nixpkgs/pkgs/development/python-modules/yabadaba/default.nix
new file mode 100644
index 000000000000..d476e10adc76
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/yabadaba/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, cdcs
+, datamodeldict
+, fetchFromGitHub
+, ipython
+, lxml
+, numpy
+, pandas
+, pymongo
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "yabadaba";
+  version = "0.1.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "usnistgov";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-Svw15epiSMEGMuFuMLqX2C9YFGtRtdg7DW2OVLPRmNI=";
+  };
+
+  propagatedBuildInputs = [
+    cdcs
+    datamodeldict
+    ipython
+    lxml
+    numpy
+    pandas
+    pymongo
+  ];
+
+  checkInputs = [
+    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..7abf151a08f7
--- /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}";
+    sha256 = "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.apsl20;
+    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..1a8d561d5de2
--- /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.8";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "domwillcode";
+    repo = "yale-smart-alarm-client";
+    rev = "v${version}";
+    sha256 = "sha256-CWL1uvmUGLaa2Ho0Ka4wTWstebhe1nQr9R821mweE60=";
+  };
+
+  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..206d1792b069
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/yalexs-ble/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, async-timeout
+, bleak
+, bleak-retry-connector
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pycryptodome
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "yalexs-ble";
+  version = "1.4.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "bdraco";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-DGNq/+3RJUTWixwR86zIE3rrNxRow6S8x0wZPMO+EiU=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    async-timeout
+    bleak
+    bleak-retry-connector
+    pycryptodome
+  ];
+
+  checkInputs = [
+    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";
+    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..8a320eb103a0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/yalexs/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, aiofiles
+, aiohttp
+, aioresponses
+, aiounittest
+, asynctest
+, buildPythonPackage
+, fetchFromGitHub
+, pubnub
+, pyjwt
+, pytestCheckHook
+, python-dateutil
+, pythonOlder
+, requests
+, requests-mock
+}:
+
+buildPythonPackage rec {
+  pname = "yalexs";
+  version = "1.2.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "bdraco";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-7+4Icg3E6xrWmxObNzNuDc+MXJ9rnbgBHMK4uPBJeuY=";
+  };
+
+  propagatedBuildInputs = [
+    aiofiles
+    aiohttp
+    pubnub
+    pyjwt
+    python-dateutil
+    requests
+  ];
+
+  checkInputs = [
+    aioresponses
+    aiounittest
+    asynctest
+    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";
+    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..5cd60f02b589
--- /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;
+    sha256 = "sha256-1GFvgfy3MDsJGKSEm0yaQoLM7VqIS2wphw16trNTUOc=";
+  };
+
+  propagatedBuildInputs = [
+    pyyaml
+    ruamel-yaml
+  ];
+
+  checkInputs = [
+    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..b789aab03701
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/yamlfix/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, click
+, fetchFromGitHub
+, pytest-xdist
+, pytestCheckHook
+, pythonOlder
+, ruyaml
+}:
+
+buildPythonPackage rec {
+  pname = "yamlfix";
+  version = "0.8.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "lyz-code";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-YCC4xK1fB5Gyv32JhbSuejtzLNMRnH7iyUpzccVijS0=";
+  };
+
+  propagatedBuildInputs = [
+    click
+    ruyaml
+  ];
+
+  checkInputs = [
+    pytest-xdist
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'python_paths = "."' ""
+  '';
+
+  pythonImportsCheck = [
+    "yamlfix"
+  ];
+
+  meta = with lib; {
+    description = "Python YAML formatter that keeps your comments";
+    homepage = "https://github.com/lyz-code/yamlfix";
+    license = licenses.gpl3Plus;
+    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..b82e87016159
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/yamllint/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pathspec
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, stdenv
+}:
+
+buildPythonPackage rec {
+  pname = "yamllint";
+  version = "1.27.1";
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-5ogyS1hWCraKGjz/LApHTj/tNx3+jaXRuYF7ffVQOc4=";
+  };
+
+  propagatedBuildInputs = [
+    pyyaml
+    pathspec
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # test failure reported upstream: https://github.com/adrienverge/yamllint/issues/373
+    "test_find_files_recursively"
+  ] ++ lib.optional 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";
+    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..97da02102c7f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/yamlloader/default.nix
@@ -0,0 +1,34 @@
+{ lib, buildPythonPackage, fetchPypi
+, pytest, pyyaml, hypothesis
+}:
+
+buildPythonPackage rec {
+  pname = "yamlloader";
+  version = "1.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "8a297c7a197683ba02e5e2b882ffd6c6180d01bdefb534b69cd3962df020bfe6";
+  };
+
+  propagatedBuildInputs = [
+    pyyaml
+  ];
+
+  checkInputs = [
+    hypothesis
+    pytest
+  ];
+
+  pythonImportsCheck = [
+    "yaml"
+    "yamlloader"
+  ];
+
+  meta = with lib; {
+    description = "A case-insensitive list for Python";
+    homepage = "https://github.com/Phynix/yamlloader";
+    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..9de933fda157
--- /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.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "03h8wa6pzqjiw25s3jv9gydn77gs444mf31lrgvpgy53kswz0c3z";
+  };
+
+  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..37e7d91a8098
--- /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";
+
+  checkInputs = [ 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..a82bf972546d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/yangson/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools-scm
+, pyxb
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "yangson";
+  version = "1.4.13";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-SuKpSwIjZioyqmxlcKJ+UXP+ADfJwUwCCttmMAiEkZ4=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    pyxb
+  ];
+
+  checkInputs = [
+    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..2d6fc9520ccd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/yapf/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "yapf";
+  version = "0.32.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-o/UIXTfvfj4ATEup+bPkDFT/GQHNER8FFFrjE6fGfRs=";
+  };
+
+  checkInputs = [
+    nose
+  ];
+
+  meta = with lib; {
+    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 = licenses.asl20;
+    maintainers = with 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..ed60315a8b11
--- /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.3.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "sumerc";
+    repo = pname;
+    rev = version;
+    hash = "sha256-MfvaLWw7EhfzFx4aZdRWvQVOOcvZ1Mt7EgxyB2nDB2c=";
+  };
+
+  patches = [
+    ./tests.patch
+  ];
+
+  checkInputs = [
+    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..a6471d8f07ef
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/yapsy/default.nix
@@ -0,0 +1,23 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "Yapsy";
+  version = "1.12.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "12rznbnswfw0w7qfbvmmffr9r317gl1rqg36nijwzsklkjgks4fq";
+  };
+
+  meta = with lib; {
+    homepage = "http://yapsy.sourceforge.net/";
+    description = "Yet another plugin system";
+    license = licenses.bsd0;
+    # tests fail and are not using pytest to easily disable them
+    broken = stdenv.isDarwin;
+  };
+}
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..e9774ae85dd4
--- /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.2.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "VirusTotal";
+    repo = "yara-python";
+    rev = "v${version}";
+    hash = "sha256-spUQuezQMqaG1hboM0/Gs7siCM6x0b40O+sV7qGGBng=";
+  };
+
+  buildInputs = [
+    yara
+  ];
+
+  checkInputs = [
+    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/yarg/default.nix b/nixpkgs/pkgs/development/python-modules/yarg/default.nix
new file mode 100644
index 000000000000..97237ba09b09
--- /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 ];
+
+  checkInputs = [ 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/yarl/default.nix b/nixpkgs/pkgs/development/python-modules/yarl/default.nix
new file mode 100644
index 000000000000..08866ac39074
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/yarl/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, idna
+, multidict
+, typing-extensions
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "yarl";
+  version = "1.7.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-RTmbRtYMJTMnpGDpmFZ1IAn87l9dPICy98DK4cONVt0=";
+  };
+
+  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
+  '';
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  postCheck = ''
+    popd
+  '';
+
+  pythonImportsCheck = [ "yarl" ];
+
+  meta = with lib; {
+    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/yaspin/default.nix b/nixpkgs/pkgs/development/python-modules/yaspin/default.nix
new file mode 100644
index 000000000000..012ee677ae0e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/yaspin/default.nix
@@ -0,0 +1,32 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, lib
+, poetry-core
+, termcolor
+}:
+
+buildPythonPackage rec {
+  pname = "yaspin";
+  version = "2.1.0";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "pavdmyt";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0vhh4mp706kz5fba8nvr9jm51jsd32xj97m3law6ixw3lj91sh1a";
+  };
+
+  nativeBuildInputs = [ poetry-core ];
+
+  propagatedBuildInputs = [ 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..267052f5c17d
--- /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";
+  };
+
+  checkInputs = [
+    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..211a4b60c813
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/yattag/default.nix
@@ -0,0 +1,17 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "yattag";
+  version = "1.14.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5731a31cb7452c0c6930dd1a284e0170b39eee959851a2aceb8d6af4134a5fa8";
+  };
+
+  meta = with lib; {
+    description = "Generate HTML or XML in a pythonic way. Pure python alternative to web template engines. Can fill HTML forms with default values and error messages.";
+    license = [ licenses.lgpl21 ];
+    homepage = "https://www.yattag.org/";
+  };
+}
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..e7452b89a539
--- /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
+  '';
+
+  checkInputs = [ 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..b2c019889483
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/yeelight/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitLab
+, future
+, ifaddr
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "yeelight";
+  version = "0.7.10";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitLab {
+    owner = "stavros";
+    repo = "python-yeelight";
+    rev = "v${version}";
+    sha256 = "sha256-vUsL1CvhYRtv75gkmiPe/UkAtBDZPy1iK2BPUupMXz8=";
+  };
+
+  propagatedBuildInputs = [
+    future
+    ifaddr
+  ];
+
+  checkInputs = [
+    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/";
+    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..3e79dcf20e92
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/yfinance/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, multitasking
+, numpy
+, pandas
+, requests
+, lxml
+}:
+
+buildPythonPackage rec {
+  pname = "yfinance";
+  version = "0.1.74";
+
+  src = fetchFromGitHub {
+    owner = "ranaroussi";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-3YOUdrLCluOuUieBwl15B6WHSXpMoNAjdeNJT3zmTTI=";
+  };
+
+  propagatedBuildInputs = [
+    multitasking
+    numpy
+    pandas
+    requests
+    lxml
+  ];
+
+  doCheck = false;  # Tests require internet access
+  pythonImportsCheck = [ "yfinance" ];
+
+  meta = with lib; {
+    description = "Yahoo! Finance market data downloader (+faster Pandas Datareader)";
+    homepage = "https://aroussi.com/post/python-yahoo-finance";
+    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..4247cb7d7895
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/yolink-api/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, paho-mqtt
+, pydantic
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "yolink-api";
+  version = "0.0.9";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "YoSmart-Inc";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-ROw+azrexDfATo7KtFwNEx175s6O6Zqcv9bZbOHMnP8=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    paho-mqtt
+    pydantic
+  ];
+
+  # 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";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/yolk/default.nix b/nixpkgs/pkgs/development/python-modules/yolk/default.nix
new file mode 100644
index 000000000000..d241e3f8edc0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/yolk/default.nix
@@ -0,0 +1,23 @@
+{ lib, fetchurl, buildPythonApplication, pythonPackages }:
+
+with lib;
+
+buildPythonApplication rec {
+  pname = "yolk";
+  version = "0.4.3";
+
+  src = fetchurl {
+    url = "mirror://pypi/y/yolk/yolk-${version}.tar.gz";
+    sha256 = "1f6xwx210jnl5nq0m3agh2p1cxmaizawaf3fwq43q4yw050fn1qw";
+  };
+
+  buildInputs = with pythonPackages; [ nose ];
+
+  meta = {
+    description = "Command-line tool for querying PyPI and Python packages installed on your system";
+    homepage = "https://github.com/cakebread/yolk";
+    maintainers = with maintainers; [];
+    license = licenses.bsd3;
+  };
+}
+
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..94580fbebbfd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/youless-api/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchFromBitbucket
+, pythonOlder
+, certifi
+, chardet
+, idna
+, nose
+, requests
+, six
+, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "youless-api";
+  version = "0.16";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromBitbucket {
+    owner = "jongsoftdev";
+    repo = "youless-python-bridge";
+    rev = version;
+    sha256 = "sha256-8pJeb3eWchMRrk8KLSI/EbHs1wQDqBoqlAQXm9ulyqs=";
+  };
+
+  propagatedBuildInputs = [
+    certifi
+    chardet
+    idna
+    requests
+    six
+    urllib3
+  ];
+
+  checkInputs = [
+    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..7eac21a5e7ee
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/youtube-search/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchPypi, requests }:
+
+buildPythonPackage rec {
+  pname = "youtube-search";
+  version = "2.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-veu7PUPAbTz3B7tRYMGptIMbmmaGLCdL6azv0kCEd08=";
+  };
+
+  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..a3c7e93031c7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/youtube-transcript-api/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, requests
+, mock
+, httpretty
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "youtube-transcript-api";
+  version = "0.4.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "jdepoix";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-RNPWTgAOwS+tXGLQYyIyka36xS1E1499OAP84aT6m3A=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  checkInputs = [
+    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";
+    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..30c056db9340
--- /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 "==" ">=" \
+  '';
+
+  checkInputs = [
+    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; [ SuperSandro2000 ];
+  };
+}
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..14c90dbd5f28
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/yoyo-migrations/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools
+, sqlparse
+, tabulate
+}:
+
+buildPythonPackage rec {
+  pname = "yoyo-migrations";
+  version = "7.3.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-RIQIKOGgFp9UHnAtWu3KgYWtpoCH57rUhQpvxdced6Q=";
+  };
+
+  propagatedBuildInputs = [ 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/yq/default.nix b/nixpkgs/pkgs/development/python-modules/yq/default.nix
new file mode 100644
index 000000000000..937c95864a3d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/yq/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, substituteAll
+, argcomplete
+, pyyaml
+, toml
+, xmltodict
+, jq
+, setuptools-scm
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "yq";
+  version = "3.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-MKhKoiSGx0m6JpJWvVhsC803C34qcedsOSTq1IZ+dPI=";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./jq-path.patch;
+      jq = "${lib.getBin jq}/bin/jq";
+    })
+  ];
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    pyyaml
+    xmltodict
+    toml
+    argcomplete
+  ];
+
+  checkInputs = [
+   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 ];
+  };
+}
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..ed98ec86aa51
--- /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 f25dced..cd308c8 100755
+--- a/test/test.py
++++ b/test/test.py
+@@ -105,7 +105,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 91212d0..ee5a799 100755
+--- a/yq/__init__.py
++++ b/yq/__init__.py
+@@ -146,7 +146,7 @@ def yq(input_streams=None, output_stream=None, input_format="yaml", output_forma
+     try:
+         # 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 = subprocess.Popen(["@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..90bb34a71cd1
--- /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}";
+    sha256 = "sha256-7erT5UpejPMIoyqhpYNEON3YWE2l5SdP2olOVpkbNkY=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    dpath
+    plac
+    pyyaml
+  ];
+
+  checkInputs = [
+    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..6331438a9588
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ytmusicapi/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "ytmusicapi";
+  version = "0.22.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-CZ4uoW4UHn5C+MckQXysTdydaApn99b0UCnF5RPb7DI=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  doCheck = false; # requires network access
+
+  pythonImportsCheck = [
+    "ytmusicapi"
+  ];
+
+  meta = with lib; {
+    description = "Python API for YouTube Music";
+    homepage = "https://github.com/sigma67/ytmusicapi";
+    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/z3c-checkversions/default.nix b/nixpkgs/pkgs/development/python-modules/z3c-checkversions/default.nix
new file mode 100644
index 000000000000..0db092a144d1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/z3c-checkversions/default.nix
@@ -0,0 +1,33 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchPypi
+, python
+, zc-buildout
+, zope_testrunner
+}:
+
+buildPythonPackage rec {
+  pname = "z3c-checkversions";
+  version = "1.2";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "z3c.checkversions";
+    sha256 = "94c7ab0810ee6fdb66a4689b48e537b57e2dbee277cb1de2ece7a7f4d8c83001";
+  };
+
+  propagatedBuildInputs = [ zc-buildout ];
+  checkInputs = [ zope_testrunner ];
+  doCheck = !python.pkgs.isPy27;
+  checkPhase = ''
+    ${python.interpreter} -m zope.testrunner --test-path=src []
+  '';
+
+  meta = with lib; {
+    broken = (stdenv.isLinux && stdenv.isAarch64) || stdenv.isDarwin;
+    homepage = "https://github.com/zopefoundation/z3c.checkversions";
+    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..7d47cb347c8c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zadnegoale/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, aiohttp
+, aioresponses
+, buildPythonPackage
+, fetchFromGitHub
+, dacite
+, orjson
+, pytest-asyncio
+, pytest-error-for-skips
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "zadnegoale";
+  version = "0.6.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "bieniu";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-ubBN4jvueNgReNbS+RXNDNHID0MF/rvQnb0+F4/DZaU=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    dacite
+    orjson
+  ];
+
+  checkInputs = [
+    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";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/zake/default.nix b/nixpkgs/pkgs/development/python-modules/zake/default.nix
new file mode 100644
index 000000000000..89635a88f35e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zake/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, kazoo
+, six
+, testtools
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "zake";
+  version = "0.2.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1rp4xxy7qp0s0wnq3ig4ji8xsl31g901qkdp339ndxn466cqal2s";
+  };
+
+  propagatedBuildInputs = [ kazoo six ];
+  buildInputs = [ testtools ];
+  checkPhase = ''
+    # Skip test - fails with our new kazoo version
+    substituteInPlace zake/tests/test_client.py \
+      --replace "test_child_watch_no_create" "_test_child_watch_no_create"
+
+    ${python.interpreter} -m unittest discover zake/tests
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/yahoo/Zake";
+    description = "A python package that works to provide a nice set of testing utilities for the kazoo library";
+    license = licenses.asl20;
+    broken = true;
+  };
+
+}
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..72cd251dcb31
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zarr/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, isPy27
+, fetchPypi
+, setuptools-scm
+, asciitree
+, numpy
+, fasteners
+, numcodecs
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "zarr";
+  version = "2.12.0";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-UVox7kuta7SK4FF4xYiuSaAqNd76Ad2aMpMwaQM2gWU=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    asciitree
+    numpy
+    fasteners
+    numcodecs
+  ];
+
+  checkInputs = [
+    pytest
+  ];
+
+  checkPhase = ''
+    pytest
+  '';
+
+  meta = with lib; {
+    description = "An implementation of chunked, compressed, N-dimensional arrays for Python";
+    homepage = "https://github.com/zarr-developers/zarr";
+    license = licenses.mit;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..23eae31057fc
--- /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.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f249fc6885646d165d7d6b228a7b71f5170fc7117de9e0688271f8fb97840f72";
+  };
+
+  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..97289ec36300
--- /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 = "2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "307ad78227e48be260e64896ec8886edc7eae22d8ec53e4d528ab5537a83203b";
+  };
+
+  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/zconfig/default.nix b/nixpkgs/pkgs/development/python-modules/zconfig/default.nix
new file mode 100644
index 000000000000..521bca4ece8c
--- /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.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-oo6VoK4zV5V0fsytNbLLcI831Ex/Ml4qyyAemDMLFuU=";
+  };
+
+  patches = lib.optional stdenv.hostPlatform.isMusl ./remove-setlocale-test.patch;
+
+  buildInputs = [ manuel docutils ];
+  propagatedBuildInputs = [ zope_testrunner ];
+  checkInputs = [ 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..26a47a1f7698
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zcs/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+, yacs
+, boxx
+}:
+
+buildPythonPackage rec {
+  pname = "zcs";
+  version = "0.1.18";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-cIg0LFQFVo91Ywvulxtx0/PPyQnRflJFnIi0gaUGGq4=";
+  };
+
+  patches = [
+    ./fix-test-yaml.patch
+  ];
+
+  propagatedBuildInputs = [ yacs ];
+
+  pythonImportsCheck = [ "zcs" ];
+
+  checkInputs = [ boxx ];
+  checkPhase = ''
+    ${python.interpreter} test/test_zcs.py
+  '';
+
+  meta = with lib; {
+    description = "A flexible powerful 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..23eae31057fc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zdaemon/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, zconfig
+}:
+
+buildPythonPackage rec {
+  pname = "zdaemon";
+  version = "4.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f249fc6885646d165d7d6b228a7b71f5170fc7117de9e0688271f8fb97840f72";
+  };
+
+  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/zeep/default.nix b/nixpkgs/pkgs/development/python-modules/zeep/default.nix
new file mode 100644
index 000000000000..83ee3f37f7e4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zeep/default.nix
@@ -0,0 +1,100 @@
+{ lib
+, aiohttp
+, aioresponses
+, attrs
+, buildPythonPackage
+, cached-property
+, defusedxml
+, fetchFromGitHub
+, fetchpatch
+, 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.1.0";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "mvantellingen";
+    repo = "python-zeep";
+    rev = version;
+    sha256 = "sha256-fJLr2LJpbNQTl183R56G7sJILfm04R39qpJxLogQLoo=";
+  };
+
+  patches = [
+    (fetchpatch {
+      # fixes pytest_httpx test case; https://github.com/mvantellingen/python-zeep/pull/1293
+      url = "https://github.com/mvantellingen/python-zeep/commit/2907848185adcb4e6d8c093db6c617c64cb8c8bf.patch";
+      hash = "sha256-hpksgMfrBLvYtI1QIs1aHBtFq7C1PWpnAj8BW5ak1/4=";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    attrs
+    cached-property
+    defusedxml
+    httpx
+    isodate
+    lxml
+    platformdirs
+    pytz
+    requests
+    requests-file
+    requests-toolbelt
+    xmlsec
+  ];
+
+  checkInputs = [
+    aiohttp
+    aioresponses
+    freezegun
+    mock
+    pretend
+    pytest-asyncio
+    pytest-httpx
+    pytestCheckHook
+    requests-mock
+  ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d);
+  '';
+
+  disabledTests = [
+    # lxml.etree.XMLSyntaxError: Extra content at the end of the document, line 2, column 64
+    "test_mime_content_serialize_text_xml"
+    # Tests are outdated
+    "test_load"
+    "test_load_cache"
+    "test_post"
+  ];
+
+  pythonImportsCheck = [
+    "zeep"
+  ];
+
+  meta = with lib; {
+    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/zeroc-ice/default.nix b/nixpkgs/pkgs/development/python-modules/zeroc-ice/default.nix
new file mode 100644
index 000000000000..1c015d4d75a7
--- /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.8";
+
+  src = fetchPypi {
+    inherit version pname;
+    sha256 = "sha256-kodRHIkMXdFUBGNVRtSyjbVqGQRxPaHqgp6ddFT5ZIY=";
+  };
+
+  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..4373d9a2d062
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zeroconf/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, stdenv
+, async-timeout
+, buildPythonPackage
+, fetchFromGitHub
+, ifaddr
+, pytest-asyncio
+, pythonOlder
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "zeroconf";
+  version = "0.39.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "jstasiak";
+    repo = "python-zeroconf";
+    rev = version;
+    hash = "sha256-R6q5fq8P91q+qhy+lOCuoKUMFBvkKFsKLVCoqIy7Qpk=";
+  };
+
+  propagatedBuildInputs = [
+    async-timeout
+    ifaddr
+  ];
+
+  checkInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # tests that require network interaction
+    "test_close_multiple_times"
+    "test_launch_and_close"
+    "test_launch_and_close_context_manager"
+    "test_launch_and_close_v4_v6"
+    "test_launch_and_close_v6_only"
+    "test_integration_with_listener_ipv6"
+    # Starting with 0.39.0: AssertionError: assert [('add', '_ht..._tcp.local.')]
+    "test_service_browser_expire_callbacks"
+  ] ++ lib.optionals stdenv.isDarwin [
+    "test_lots_of_names"
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  pythonImportsCheck = [
+    "zeroconf"
+    "zeroconf.asyncio"
+  ];
+
+  meta = with lib; {
+    description = "Python implementation of multicast DNS service discovery";
+    homepage = "https://github.com/jstasiak/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..41b5f05cfeb2
--- /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 ];
+
+  checkInputs = [
+    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..feb56c384dc1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zeversolarlocal/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, flit-core
+, httpx
+, pytest-asyncio
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "zeversolarlocal";
+  version = "1.1.0";
+  format = "flit";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ExZy5k5RE7k+D0lGmuIkGWrWQ+m24K2oqbUEg4BAVuY=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    httpx
+  ];
+
+  checkInputs = [
+    pytest-asyncio
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  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..f91706b97d18
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zfec/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pyutil
+, setuptoolsTrial
+, twisted
+}:
+
+buildPythonPackage rec {
+  pname = "zfec";
+  version = "1.5.7.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-TuUZvg3MfaLohIK8/Av5d6Ql4dfoJ4z1u7uNAPiir7Y=";
+  };
+
+  propagatedBuildInputs = [ pyutil ];
+
+  checkInputs = [ setuptoolsTrial twisted ];
+
+  # argparse is in the stdlib but zfec doesn't know that.
+  postPatch = ''
+    sed -i -e '/argparse/d' setup.py
+  '';
+
+  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..487ff10adabc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zha-quirks/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, aiohttp
+, asynctest
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, zigpy
+}:
+
+buildPythonPackage rec {
+  pname = "zha-quirks";
+  version = "0.0.78";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "zigpy";
+    repo = "zha-device-handlers";
+    rev = "refs/tags/${version}";
+    hash = "sha256-S54reJhzvDMOC5+N/WZ8bz8XNXH/91jAAy8gCq90MvQ=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    zigpy
+  ];
+
+  checkInputs = [
+    asynctest
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "zhaquirks"
+  ];
+
+  meta = with lib; {
+    description = "ZHA Device Handlers are custom quirks implementations for Zigpy";
+    homepage = "https://github.com/dmulcahey/zha-device-handlers";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+    platforms = platforms.linux;
+  };
+}
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..fa4122a7e8c6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zict/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildPythonPackage, fetchPypi
+, pytest, heapdict, pythonOlder }:
+
+buildPythonPackage rec {
+  pname = "zict";
+  version = "2.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-1zZsLiKTMUES3PJDIQhCime5J7AABWGf7vwxDRLYM/M=";
+  };
+
+  disabled = pythonOlder "3.6";
+
+  buildInputs = [ pytest ];
+  propagatedBuildInputs = [ heapdict ];
+
+  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..ed4629c07f2d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zigpy-cc/default.nix
@@ -0,0 +1,60 @@
+{ 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
+  ];
+
+  checkInputs = [
+    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..3f7c7b46bff6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zigpy-deconz/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, asynctest
+, buildPythonPackage
+, fetchFromGitHub
+, pyserial
+, pyserial-asyncio
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, zigpy
+}:
+
+buildPythonPackage rec {
+  pname = "zigpy-deconz";
+  version = "0.18.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "zigpy";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-2M25g3iJWW6kT17P9PVAPD09E5QXuOJN75yjWsLY/cI=";
+  };
+
+  propagatedBuildInputs = [
+    pyserial
+    pyserial-asyncio
+    zigpy
+  ];
+
+  checkInputs = [
+    asynctest
+    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";
+    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..ba7292968a8b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zigpy-xbee/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, asynctest
+, buildPythonPackage
+, fetchFromGitHub
+, pyserial
+, pyserial-asyncio
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, zigpy
+}:
+
+buildPythonPackage rec {
+  pname = "zigpy-xbee";
+  version = "0.15.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 = version;
+    sha256 = "sha256-NT7d5JWaVZOrk32uYh0z0sI9RA4eJYYIa2D/Ei81KjY=";
+  };
+
+  buildInputs = [
+    pyserial
+    pyserial-asyncio
+    zigpy
+  ];
+
+  checkInputs = [
+    asynctest
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # assertion failure
+    # E       assert ff:ff:ff:ff:ff:ff:ff:ff is None
+    "test_startup_api_mode_config_fails"
+  ];
+
+  meta = with lib; {
+    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..163ef44f0d14
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zigpy-zigate/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, gpiozero
+, mock
+, pyserial
+, pyserial-asyncio
+, pyusb
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, zigpy
+}:
+
+buildPythonPackage rec {
+  pname = "zigpy-zigate";
+  version = "0.9.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "zigpy";
+    repo = "zigpy-zigate";
+    rev = "refs/tags/${version}";
+    hash = "sha256-H1R+wNUo/J5ATINHrkC4mJ8KKnBxVZUvF6X7y54aiVQ=";
+  };
+
+  propagatedBuildInputs = [
+    gpiozero
+    pyserial
+    pyserial-asyncio
+    pyusb
+    zigpy
+  ];
+
+  checkInputs = [
+    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";
+    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..5585324c0bc8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zigpy-znp/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, async-timeout
+, asynctest
+, buildPythonPackage
+, coloredlogs
+, fetchFromGitHub
+, jsonschema
+, pyserial
+, pyserial-asyncio
+, pytest-asyncio
+, pytest-mock
+, pytest-timeout
+, pytestCheckHook
+, pythonOlder
+, voluptuous
+, zigpy
+}:
+
+buildPythonPackage rec {
+  pname = "zigpy-znp";
+  version = "0.8.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "zigpy";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-GKdhzmSQZ+D7o9OJZ5880mRI1mIcckW+dY5DnP7zIuo=";
+  };
+
+  propagatedBuildInputs = [
+    async-timeout
+    coloredlogs
+    jsonschema
+    pyserial
+    pyserial-asyncio
+    voluptuous
+    zigpy
+  ];
+
+  checkInputs = [
+    pytest-asyncio
+    pytest-mock
+    pytest-timeout
+    pytestCheckHook
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    asynctest
+  ];
+
+  pytestFlagsArray = [
+    "--asyncio-mode=legacy"
+  ];
+
+  pythonImportsCheck = [
+    "zigpy_znp"
+  ];
+
+  meta = with lib; {
+    description = "Library for zigpy which communicates with TI ZNP radios";
+    homepage = "https://github.com/zigpy/zigpy-znp";
+    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..ebcb22aa338a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zigpy/default.nix
@@ -0,0 +1,70 @@
+{ lib
+, aiohttp
+, aiosqlite
+, asynctest
+, buildPythonPackage
+, crccheck
+, cryptography
+, fetchFromGitHub
+, pycryptodome
+, pytest-aiohttp
+, pytest-timeout
+, pytestCheckHook
+, pythonOlder
+, voluptuous
+}:
+
+buildPythonPackage rec {
+  pname = "zigpy";
+  version = "0.49.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "zigpy";
+    repo = "zigpy";
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-ai0qWKgsh8kIS4juvzpE+amsnIbEOJbhGutV75yRGog=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    aiosqlite
+    crccheck
+    cryptography
+    pycryptodome
+    voluptuous
+  ];
+
+  checkInputs = [
+    pytest-aiohttp
+    pytest-timeout
+    pytestCheckHook
+  ]  ++ lib.optionals (pythonOlder "3.8") [
+    asynctest
+  ];
+
+  disabledTests = [
+    # RuntimeError: coroutine 'test_remigrate_forcibly_downgraded_v4' was never awaited
+    #"test_remigrate_forcibly_downgraded_v4"
+    # RuntimeError: Event loop is closed
+    #"test_startup"
+  ];
+
+  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";
+    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..20e23afcfc01
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zimports/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, isPy3k
+, fetchFromGitHub
+, buildPythonPackage
+, flake8-import-order
+, pyflakes
+, tomli
+, setuptools
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "zimports";
+  version = "0.6.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "sqlalchemyorg";
+    repo = "zimports";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-qm5mA8pCSLbkupGBo+ppHSW6uy1j/FfV3idvGQGhjqU=";
+  };
+
+  propagatedBuildInputs = [
+    flake8-import-order
+    pyflakes
+    setuptools
+    tomli
+  ];
+
+  checkInputs = [
+    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/zipfile36/default.nix b/nixpkgs/pkgs/development/python-modules/zipfile36/default.nix
new file mode 100644
index 000000000000..46dd1e173fb2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zipfile36/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+, isPy3k
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "zipfile36";
+  version = "0.1.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a78a8dddf4fa114f7fe73df76ffcce7538e23433b7a6a96c1c904023f122aead";
+  };
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest test_zipfile.py
+  '';
+
+  # Only works with Python 3.x.
+  # Not supposed to be used with 3.6 and up.
+  disabled = !(isPy3k && (pythonOlder "3.6"));
+
+  meta = {
+    description = "Read and write ZIP files - backport of the zipfile module from Python 3.6";
+    homepage = "https://gitlab.com/takluyver/zipfile36";
+    license = lib.licenses.psfl;
+    maintainers = lib.maintainers.fridh;
+  };
+}
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..e773960730f6
--- /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.8.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-BbRfHuj4B9DMkoSFykCgfLSRzwkv9YfA35yx/RVISNI=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  # Prevent infinite recursion with pytest
+  doCheck = false;
+
+  checkInputs = [
+    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; [ SuperSandro2000 ];
+  };
+}; 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..3f95fd5d4c61
--- /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"
+  ];
+
+  checkInputs = [
+    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..b1f620557bfa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zipstream-ng/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "zipstream-ng";
+  version = "1.3.4";
+
+  disabled = pythonOlder "3.7";
+  src = fetchFromGitHub {
+    owner = "pR0Ps";
+    repo = "zipstream-ng";
+    rev = "v${version}";
+    sha256 = "NTsnGCddGDUxdHbEoM2ew756psboex3sb6MkYKtaSjQ=";
+  };
+
+  pythonImportsCheck = [
+    "zipstream"
+  ];
+
+  checkInputs = [
+    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";
+    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..00c291a1c510
--- /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";
+  };
+
+  checkInputs = [ 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..65f5ec1fa7af
--- /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 ];
+
+  checkInputs = [ 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..7c788f7a9f8f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zodb/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, python
+, zope_testrunner
+, transaction
+, six
+, zope_interface
+, zodbpickle
+, zconfig
+, persistent
+, zc_lockfile
+, BTrees
+, manuel
+}:
+
+buildPythonPackage rec {
+  pname = "ZODB";
+  version = "5.7.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-+kC7wF7NoewkNc0MbdAqE7dphGBVikYENm9qCmhAHNM=";
+  };
+
+  # remove broken test
+  postPatch = ''
+    rm -vf src/ZODB/tests/testdocumentation.py
+  '';
+
+  propagatedBuildInputs = [
+    transaction
+    six
+    zope_interface
+    zodbpickle
+    zconfig
+    persistent
+    zc_lockfile
+    BTrees
+  ];
+
+  checkInputs = [
+    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://pypi.python.org/pypi/ZODB";
+    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..de1f8dfd3aaf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zodbpickle/default.nix
@@ -0,0 +1,22 @@
+{ buildPythonPackage
+, isPyPy
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "zodbpickle";
+  version = "2.3";
+  disabled = isPyPy; # https://github.com/zopefoundation/zodbpickle/issues/10
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-5MtccZcF6Lseju5Kok4gcaMJTs8ng9h0B6uCLxZto6I=";
+  };
+
+  # fails..
+  doCheck = false;
+
+  meta = {
+    homepage = "https://pypi.python.org/pypi/zodbpickle";
+  };
+}
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..4cbf9386b6cb
--- /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 = "4.3.1";
+
+  format = "setuptools";
+
+  src = fetchPypi {
+    pname = "zope.cachedescriptors";
+    inherit version;
+    sha256 = "1f4d1a702f2ea3d177a1ffb404235551bb85560100ec88e6c98691734b1d194a";
+  };
+
+  propagatedBuildInputs = [
+    setuptools
+  ];
+
+  checkInputs = [
+    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-deferredimport/default.nix b/nixpkgs/pkgs/development/python-modules/zope-deferredimport/default.nix
new file mode 100644
index 000000000000..e1cba0ebc02b
--- /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 = "4.4";
+
+  src = fetchPypi {
+    pname = "zope.deferredimport";
+    inherit version;
+    sha256 = "2ae3257256802787e52ad840032f39c1496d3ce0b7e11117f663420e4a4c9add";
+  };
+
+  propagatedBuildInputs = [ zope_proxy ];
+
+  checkInputs = [ 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-hookable/default.nix b/nixpkgs/pkgs/development/python-modules/zope-hookable/default.nix
new file mode 100644
index 000000000000..993568f6ffd9
--- /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.1.0";
+
+  src = fetchPypi {
+    pname = "zope.hookable";
+    inherit version;
+    sha256 = "8fc3e6cd0486c6af48e3317c299def719b57538332a194e0b3bc6a772f4faa0e";
+  };
+
+  checkInputs = [ 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-testbrowser/default.nix b/nixpkgs/pkgs/development/python-modules/zope-testbrowser/default.nix
new file mode 100644
index 000000000000..31de6e28f2ee
--- /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 = "5.6.1";
+
+  format = "setuptools";
+
+  src = fetchPypi {
+    pname = "zope.testbrowser";
+    inherit version;
+    sha256 = "035bf63d9f7244e885786c3327448a7d9fff521dba596429698b8474961b05e7";
+  };
+
+  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
+  ];
+
+  checkInputs = [
+    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_broken/default.nix b/nixpkgs/pkgs/development/python-modules/zope_broken/default.nix
new file mode 100644
index 000000000000..a3583654e660
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zope_broken/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, zope_interface
+}:
+
+buildPythonPackage rec {
+  pname = "zope.broken";
+  version = "3.6.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "b9b8776002da4f7b6b12dfcce77eb642ae62b39586dbf60e1d9bdc992c9f2999";
+  };
+
+  buildInputs = [ zope_interface ];
+
+  meta = with lib; {
+    homepage = "http://pypi.python.org/pypi/zope.broken";
+    description = "Zope Broken Object Interfaces";
+    license = licenses.zpl20;
+    maintainers = with maintainers; [ goibhniu ];
+  };
+
+}
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..a5cbcffe4336
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zope_component/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, zope-deferredimport
+, zope_deprecation
+, zope_event
+, zope-hookable
+, zope_interface
+, zope_configuration
+, zope_i18nmessageid
+}:
+
+buildPythonPackage rec {
+  pname = "zope.component";
+  version = "5.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "32cbe426ba8fa7b62ce5b211f80f0718a0c749cc7ff09e3f4b43a57f7ccdf5e5";
+  };
+
+  propagatedBuildInputs = [
+    zope-deferredimport zope_deprecation zope_event zope-hookable zope_interface
+    zope_configuration zope_i18nmessageid
+  ];
+
+  # ignore tests because of a circular dependency on zope_security
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/zopefoundation/zope.component";
+    description = "Zope Component Architecture";
+    license = licenses.zpl20;
+    maintainers = with maintainers; [ goibhniu ];
+  };
+
+}
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..b8d364b95ebb
--- /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;
+    sha256 = "sha256-giPqSvU5hmznqccwrH6xjlHRfrUVk6p3c7NZPI1tdgg=";
+  };
+
+  checkInputs = [ 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_contenttype/default.nix b/nixpkgs/pkgs/development/python-modules/zope_contenttype/default.nix
new file mode 100644
index 000000000000..15010d80a145
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zope_contenttype/default.nix
@@ -0,0 +1,24 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, zope_testrunner
+}:
+
+buildPythonPackage rec {
+  pname = "zope.contenttype";
+  version = "4.5.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c12d929c67ab3eaef9b8a7fba3d19cce8500c8fd25afed8058c8e15f324cbd5b";
+  };
+
+  checkInputs = [ zope_testrunner ];
+
+  meta = with lib; {
+    homepage = "https://github.com/zopefoundation/zope.contenttype";
+    description = "A utility module for content-type (MIME type) handling";
+    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..0d1ae412262d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zope_copy/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, zope_interface
+, zope_location
+, zope_schema
+}:
+
+
+buildPythonPackage rec {
+  pname = "zope.copy";
+  version = "4.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "47bb9d09ff06c600b446f220f47a742396598ac4828d738d3d85e6490629a71a";
+  };
+
+  propagatedBuildInputs = [ zope_interface ];
+
+  doCheck = !isPy27; # namespace conflicts
+  checkInputs = [ zope_location zope_schema ];
+
+  checkPhase = ''
+    python -m unittest discover -s src/zope/copy
+  '';
+
+  meta = {
+    maintainers = with lib.maintainers; [ domenkozar ];
+  };
+}
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..7eb66f7a9c57
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zope_deprecation/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, zope_testing
+}:
+
+buildPythonPackage rec {
+  pname = "zope.deprecation";
+  version = "4.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0d453338f04bacf91bbfba545d8bcdf529aa829e67b705eac8c1a7fdce66e2df";
+  };
+
+  buildInputs = [ zope_testing ];
+
+  meta = with lib; {
+    homepage = "https://github.com/zopefoundation/zope.deprecation";
+    description = "Zope Deprecation Infrastructure";
+    license = licenses.zpl20;
+    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..cbd5cd6d6539
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zope_dottedname/default.nix
@@ -0,0 +1,22 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "zope.dottedname";
+  version = "4.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0cec09844d309550359ac1941abfcd9141e213f67f3c19bb8f90360c40787576";
+  };
+
+  meta = with lib; {
+    homepage = "http://pypi.python.org/pypi/zope.dottedname";
+    description = "Resolver for Python dotted names";
+    license = licenses.zpl20;
+    maintainers = with maintainers; [ goibhniu ];
+  };
+
+}
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..118a3a2c44a3
--- /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.5.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5e76517f5b9b119acf37ca8819781db6c16ea433f7e2062c4afc2b6fbedb1330";
+  };
+
+  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..fb1eb07154a0
--- /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.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-TjW7oEiJxdEU3KpVKXQl1fM/YYqF7323Ehs7dxEAeE4=";
+  };
+
+  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..4792a09e26b2
--- /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 = "5.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1mp2r80v6ns92j089l7ngh8l9fk95g2661vkp4vqw7c71irs9g1z";
+  };
+
+  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_i18nmessageid/default.nix b/nixpkgs/pkgs/development/python-modules/zope_i18nmessageid/default.nix
new file mode 100644
index 000000000000..1155adc83e9e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zope_i18nmessageid/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, six
+, coverage
+, zope_testrunner
+}:
+
+buildPythonPackage rec {
+  pname = "zope.i18nmessageid";
+  version = "5.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9534142b684c986f5303f469573978e5a340f05ba2eee4f872933f1c38b1b059";
+  };
+
+  propagatedBuildInputs = [ six ];
+
+  checkInputs = [ coverage zope_testrunner ];
+
+  meta = with lib; {
+    homepage = "https://github.com/zopefoundation/zope.i18nmessageid";
+    description = "Message Identifiers for internationalization";
+    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..c1f61a4cbee5
--- /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.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5dba5f530fec3f0988d83b78cc591b58c0b6eb8431a85edd1569a0539a8a5a0e";
+  };
+
+  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_lifecycleevent/default.nix b/nixpkgs/pkgs/development/python-modules/zope_lifecycleevent/default.nix
new file mode 100644
index 000000000000..7b3852239e8f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zope_lifecycleevent/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, zope_event
+, zope_component
+}:
+
+buildPythonPackage rec {
+  pname = "zope.lifecycleevent";
+  version = "4.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-9ahU6J/5fe6ke/vqN4u77yeJ0uDMkKHB2lfZChzmfLU=";
+  };
+
+  propagatedBuildInputs = [ zope_event zope_component ];
+
+  # namespace colides with local directory
+  doCheck = false;
+
+  # zope uses pep 420 namespaces for python3, doesn't work with nix + python2
+  pythonImportsCheck = lib.optionals isPy3k [
+    "zope.lifecycleevent"
+    "zope.interface"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/zopefoundation/zope.lifecycleevent";
+    description = "Object life-cycle events";
+    license = licenses.zpl20;
+    maintainers = with 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..69fee2e338ff
--- /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.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a720f9e3c8a51d5007ed6fcd47e1834df02671d85dbfd1062a0d808de8bf80ac";
+  };
+
+  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_proxy/default.nix b/nixpkgs/pkgs/development/python-modules/zope_proxy/default.nix
new file mode 100644
index 000000000000..70e329cce9e9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zope_proxy/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, zope_interface
+}:
+
+buildPythonPackage rec {
+  pname = "zope.proxy";
+  version = "4.5.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1329846261cf6c552b05579f3cfad199b2d178510d0b4703eb5f7cdd6ebad01a";
+  };
+
+  propagatedBuildInputs = [ zope_interface ];
+
+  # circular deps
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/zopefoundation/zope.proxy";
+    description = "Generic Transparent Proxies";
+    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..9472000f15d1
--- /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 = "6.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "2201aef8ad75ee5a881284d7a6acd384661d6dca7bde5e80a22839a77124595b";
+  };
+
+  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..6945dddceaa3
--- /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.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "6f3eb687c9181e3b7400c5cd4d4209a2f676475b7b85c99ee11de2404b3493ec";
+  };
+
+  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..f8ea4e83b15c
--- /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 = "4.10";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-O25ZBsrd0UjCP+lY5qrj+tyKCKilP3R9l5HC2BNe5W4=";
+  };
+
+  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..273326baeb2a
--- /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.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-/LhQZWGIoM380kmjt9Mw1JsVv7+DoQ8YW//cD6uQE+U=";
+  };
+
+  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..dc2b14bdc62b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zopfli/default.nix
@@ -0,0 +1,28 @@
+{ lib, buildPythonPackage, fetchPypi, pythonOlder, setuptools-scm, zopfli, pytestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "zopfli";
+  version = "0.2.1";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1ipjkcgdbplsrhr31ypk48px8cax4cm9gcjj7yrcrhg20ql3s9p5";
+    extension = "zip";
+  };
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  buildInputs = [ zopfli ];
+  USE_SYSTEM_ZOPFLI = "True";
+
+  checkInputs = [ 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 100755
index 000000000000..ea832cec6f1b
--- /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.18.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-CsA1eg2YW0/zGoVHRAQNe1dUOF0fmPcUXDDgLGhly28=";
+  };
+
+  propagatedNativeBuildInputs = [
+    cffi
+  ];
+
+  propagatedBuildInputs = [
+    cffi
+  ];
+
+  checkInputs = [
+    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..8599c7495ad9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zstd/default.nix
@@ -0,0 +1,47 @@
+{ lib, pkg-config, fetchPypi, buildPythonPackage
+, buildPackages
+, zstd, pytest }:
+
+buildPythonPackage rec {
+  pname = "zstd";
+  version = "1.5.2.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-PEKbFmo7MksJg7/1OuCSi5dkxpOgF/Yv+2sg5hNeM48=";
+  };
+
+  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;
+
+  checkInputs = [ 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..fc0a49687e34
--- /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
+  ];
+
+  checkInputs = [
+    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..204ac1cfa189
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zwave-js-server-python/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, pydantic
+, pytest-aiohttp
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "zwave-js-server-python";
+  version = "0.39.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "home-assistant-libs";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-qKIlknxzZSHCl5KF8SRVHLB7eFc7ZEzAdzi+tlfcoPg=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    pydantic
+  ];
+
+  doCheck = lib.versionAtLeast pytest-aiohttp.version "1.0.0";
+
+  checkInputs = [
+    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";
+    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..479b2d5193ed
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zwave-me-ws/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, aiohttp
+, aresponses
+, asynctest
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytest-aiohttp
+, pytest-asyncio
+, pytestCheckHook
+, python-engineio
+, python-socketio
+, pythonOlder
+, websocket-client
+}:
+
+buildPythonPackage rec {
+  pname = "zwave-me-ws";
+  version = "0.2.4";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "Z-Wave-Me";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-x7P6fOYTe/u0GKUsO62cNVz2i/hVjUb8t8Bigijxgk0=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    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";
+    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..67f48f34731d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zxcvbn/default.nix
@@ -0,0 +1,27 @@
+{ lib, buildPythonPackage, fetchFromGitHub, pytest }:
+
+buildPythonPackage {
+  pname = "zxcvbn";
+  version = "4.4.28";
+
+  # no tests included in PyPI tarball
+  src = fetchFromGitHub {
+    owner = "dwolfhub";
+    repo = "zxcvbn-python";
+    rev = "45afdf0d3dd8477bc7e457629bb4bc9680794cd7"; # not tagged in repository
+    sha256 = "0w0sx9ssjks8da973cdv5xi87yjsf038jqxmzj2y26xvpyjsg2v2";
+  };
+
+  checkInputs = [ pytest ];
+
+  checkPhase = ''
+    pytest
+  '';
+
+  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 ];
+  };
+}